Proyectos de Subversion LeadersLinked - SPA

Rev

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