Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 1979 | Rev 2802 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
655 stevensc 1
import React, { useEffect, useState } from 'react'
2
import { useDispatch, useSelector } from 'react-redux'
1460 stevensc 3
import { useForm } from 'react-hook-form'
4
import { Form } from 'react-bootstrap'
1461 stevensc 5
import { Box } from '@mui/material'
1460 stevensc 6
 
2521 stevensc 7
import { axios } from 'utils/index'
655 stevensc 8
import { addNotification } from '../../redux/notification/notification.actions'
5 stevensc 9
 
2521 stevensc 10
import CKEditor from '@app/components/UI/Ckeditor'
1460 stevensc 11
import Modal from 'components/UI/modal/Modal'
12
import TagsInput from 'components/UI/TagsInput'
13
import FormErrorFeedback from 'components/UI/form/FormErrorFeedback'
5 stevensc 14
 
15
const QuestionModal = ({ show, url, isEdit, onClose, onComplete }) => {
655 stevensc 16
  const [questionsCategories, setQuestionsCategories] = useState([])
17
  const [currentCategories, setCurrentCategories] = useState([])
18
  const labels = useSelector(({ intl }) => intl.labels)
19
  const dispatch = useDispatch()
5 stevensc 20
 
2521 stevensc 21
  const { register, handleSubmit, setValue, errors, watch } = useForm()
22
  const watchedDescription = watch('description')
5 stevensc 23
 
1977 stevensc 24
  const onSubmit = handleSubmit(({ category_id, ...data }) => {
1979 stevensc 25
    const formData = new FormData()
26
 
27
    category_id.map((value) => formData.append('category_id[]', value))
28
    Object.entries(data).map(([key, value]) => formData.append(key, value))
29
 
2521 stevensc 30
    axios.post(url, formData).then((response) => {
31
      const { data, success } = response.data
5 stevensc 32
 
2521 stevensc 33
      if (!success) {
34
        const errorMessage =
35
          typeof data === 'string'
36
            ? data
37
            : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 38
 
2521 stevensc 39
        dispatch(addNotification({ style: 'danger', msg: errorMessage }))
40
        return
41
      }
5 stevensc 42
 
2521 stevensc 43
      onComplete()
44
      onClose()
45
    })
655 stevensc 46
  })
5 stevensc 47
 
48
  const getCategories = () => {
49
    axios
655 stevensc 50
      .get('/my-coach')
5 stevensc 51
      .then((response) => {
655 stevensc 52
        const { data, success } = response.data
5 stevensc 53
 
54
        if (!success) {
55
          const errorMessage =
655 stevensc 56
            typeof data === 'string'
5 stevensc 57
              ? data
655 stevensc 58
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 59
 
655 stevensc 60
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
61
          return
5 stevensc 62
        }
63
 
64
        const categories = Object.entries(data.categories).map((values) => ({
65
          name: values[1],
655 stevensc 66
          value: values[0]
67
        }))
5 stevensc 68
 
655 stevensc 69
        setQuestionsCategories(categories)
5 stevensc 70
      })
655 stevensc 71
      .catch((err) => {
72
        dispatch(addNotification({ style: 'danger', msg: err.message }))
73
      })
74
  }
5 stevensc 75
 
76
  const onTagsChange = (tags) => {
655 stevensc 77
    const categories = tags.map((tag) => tag.value)
1977 stevensc 78
    setValue('category_id', categories)
655 stevensc 79
  }
5 stevensc 80
 
81
  useEffect(() => {
655 stevensc 82
    getCategories()
5 stevensc 83
 
1897 stevensc 84
    register('description', { required: 'Este campo es requerido.' })
1977 stevensc 85
    register('category_id', {
1897 stevensc 86
      required: 'Este campo es requerido.',
87
      validate: (val) =>
88
        val.length > 0 || 'Por favor, seleccione una categoria.'
89
    })
655 stevensc 90
  }, [])
5 stevensc 91
 
92
  useEffect(() => {
655 stevensc 93
    if (!url || !show || !isEdit || !questionsCategories.length) return
5 stevensc 94
 
95
    axios.get(url).then((response) => {
655 stevensc 96
      const { data, success } = response.data
5 stevensc 97
 
98
      if (!success) {
99
        const errorMessage =
655 stevensc 100
          typeof data === 'string'
5 stevensc 101
            ? data
655 stevensc 102
            : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 103
 
104
        dispatch(
105
          addNotification({
655 stevensc 106
            style: 'danger',
107
            msg: errorMessage
5 stevensc 108
          })
655 stevensc 109
        )
110
        return
5 stevensc 111
      }
112
 
113
      const categories = data.category_id.map((uuid) =>
114
        questionsCategories.find((c) => c.value === uuid)
655 stevensc 115
      )
5 stevensc 116
 
655 stevensc 117
      setCurrentCategories(categories)
5 stevensc 118
 
655 stevensc 119
      setValue('title', data.title)
120
      setValue('description', data.description)
121
    })
122
  }, [url, show, isEdit, questionsCategories])
5 stevensc 123
 
124
  useEffect(() => {
125
    if (!show) {
655 stevensc 126
      setCurrentCategories([])
1977 stevensc 127
      setValue('category_id', [])
655 stevensc 128
      setValue('description', '')
129
      setValue('title', '')
5 stevensc 130
    }
655 stevensc 131
  }, [show])
5 stevensc 132
 
133
  return (
1460 stevensc 134
    <Modal
135
      title={`${isEdit ? labels.edit : labels.add} ${labels.question}`}
136
      show={show}
137
      onClose={onClose}
138
      onAccept={onSubmit}
139
    >
140
      <Form.Group>
141
        <Form.Label>{labels.title}</Form.Label>
142
        <Form.Control
143
          type='text'
144
          name='title'
145
          ref={register({ required: true })}
146
        />
5 stevensc 147
 
1460 stevensc 148
        {errors.title && (
149
          <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
150
        )}
151
      </Form.Group>
5 stevensc 152
 
1898 stevensc 153
      <Box mt={2}>
154
        <label>Categorías</label>
155
        <TagsInput
156
          suggestions={questionsCategories}
157
          settedTags={currentCategories}
158
          onChange={onTagsChange}
159
        />
1977 stevensc 160
        {errors.category_id && (
161
          <FormErrorFeedback>{errors.category_id?.message}</FormErrorFeedback>
1898 stevensc 162
        )}
163
      </Box>
164
 
1460 stevensc 165
      <CKEditor
2521 stevensc 166
        defaultValue={watchedDescription}
167
        onChange={(value) => setValue('description', value)}
1460 stevensc 168
      />
169
      {errors.description && (
170
        <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
171
      )}
5 stevensc 172
    </Modal>
655 stevensc 173
  )
174
}
5 stevensc 175
 
655 stevensc 176
export default QuestionModal