Proyectos de Subversion LeadersLinked - SPA

Rev

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