Proyectos de Subversion LeadersLinked - SPA

Rev

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