Proyectos de Subversion LeadersLinked - SPA

Rev

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