Proyectos de Subversion LeadersLinked - SPA

Rev

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