Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 748 | Rev 750 | 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 { Button, Form, Modal } from 'react-bootstrap'
3
import { useDispatch, useSelector } from 'react-redux'
4
import { CKEditor } from 'ckeditor4-react'
5
import { CKEDITOR_OPTIONS, axios } from '../../utils'
6
import { useForm } from 'react-hook-form'
7
import { addNotification } from '../../redux/notification/notification.actions'
748 stevensc 8
import styled from 'styled-components'
5 stevensc 9
 
655 stevensc 10
import Spinner from '../UI/Spinner'
11
import TagsInput from '../UI/TagsInput'
12
import FormErrorFeedback from '../UI/FormErrorFeedback'
5 stevensc 13
 
14
const TagsContainer = styled.div`
15
  padding: 0.5rem;
16
  border: 1px solid var(--border-primary);
17
  border-radius: var(--border-radius);
18
  margin-top: 1rem;
655 stevensc 19
`
5 stevensc 20
 
21
const QuestionModal = ({ show, url, isEdit, onClose, onComplete }) => {
655 stevensc 22
  const [loading, setLoading] = useState(false)
23
  const [questionsCategories, setQuestionsCategories] = useState([])
24
  const [currentCategories, setCurrentCategories] = useState([])
25
  const labels = useSelector(({ intl }) => intl.labels)
26
  const dispatch = useDispatch()
5 stevensc 27
 
655 stevensc 28
  const { register, handleSubmit, getValues, setValue, errors } = useForm()
5 stevensc 29
 
30
  const onSubmit = handleSubmit((data) => {
655 stevensc 31
    setLoading(true)
32
    const formData = new FormData()
5 stevensc 33
 
655 stevensc 34
    Object.entries(data).map(([key, value]) => formData.append(key, value))
5 stevensc 35
 
36
    axios
37
      .post(url, formData)
38
      .then((response) => {
655 stevensc 39
        const { data, success } = response.data
5 stevensc 40
 
41
        if (!success) {
42
          const errorMessage =
655 stevensc 43
            typeof data === 'string'
5 stevensc 44
              ? data
655 stevensc 45
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 46
 
655 stevensc 47
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
48
          return
5 stevensc 49
        }
50
 
655 stevensc 51
        onComplete()
52
        onClose()
5 stevensc 53
      })
655 stevensc 54
      .finally(() => setLoading(false))
55
  })
5 stevensc 56
 
57
  const getCategories = () => {
58
    axios
655 stevensc 59
      .get('/my-coach')
5 stevensc 60
      .then((response) => {
655 stevensc 61
        const { data, success } = response.data
5 stevensc 62
 
63
        if (!success) {
64
          const errorMessage =
655 stevensc 65
            typeof data === 'string'
5 stevensc 66
              ? data
655 stevensc 67
              : 'Error interno. Por favor, inténtelo de nuevo más tarde.'
5 stevensc 68
 
655 stevensc 69
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
70
          return
5 stevensc 71
        }
72
 
73
        const categories = Object.entries(data.categories).map((values) => ({
74
          name: values[1],
655 stevensc 75
          value: values[0]
76
        }))
5 stevensc 77
 
655 stevensc 78
        setQuestionsCategories(categories)
5 stevensc 79
      })
655 stevensc 80
      .catch((err) => {
81
        dispatch(addNotification({ style: 'danger', msg: err.message }))
82
      })
83
  }
5 stevensc 84
 
85
  const onTagsChange = (tags) => {
655 stevensc 86
    const categories = tags.map((tag) => tag.value)
749 stevensc 87
    setValue('category_id', JSON.stringify(categories))
655 stevensc 88
  }
5 stevensc 89
 
90
  useEffect(() => {
655 stevensc 91
    getCategories()
5 stevensc 92
 
655 stevensc 93
    register('description', { required: true })
94
    register('category_id', { required: true })
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 (
139
    <Modal show={show}>
655 stevensc 140
      <Modal.Header className='pb-0'>
5 stevensc 141
        <Modal.Title>
142
          {isEdit ? labels.edit : labels.add} {labels.question}
143
        </Modal.Title>
144
      </Modal.Header>
145
      <Modal.Body>
146
        {loading ? (
147
          <Spinner />
148
        ) : (
149
          <Form onSubmit={onSubmit}>
150
            <Form.Group>
151
              <Form.Label>{labels.title}</Form.Label>
152
              <Form.Control
655 stevensc 153
                type='text'
154
                name='title'
5 stevensc 155
                ref={register({ required: true })}
156
              />
157
              {errors.title && (
158
                <FormErrorFeedback>
159
                  {labels.error_field_empty}
160
                </FormErrorFeedback>
161
              )}
162
            </Form.Group>
163
 
164
            <CKEditor
655 stevensc 165
              onChange={(e) => setValue('description', e.editor.getData())}
5 stevensc 166
              onInstanceReady={(e) =>
655 stevensc 167
                e.editor.setData(getValues('description'))
5 stevensc 168
              }
169
              config={CKEDITOR_OPTIONS}
170
            />
171
            {errors.description && (
172
              <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
173
            )}
174
 
175
            <TagsContainer>
176
              <TagsInput
177
                suggestions={questionsCategories}
178
                settedTags={currentCategories}
179
                onChange={onTagsChange}
180
              />
181
            </TagsContainer>
182
 
655 stevensc 183
            <Button className='mt-3 mr-2' variant='primary' type='submit'>
5 stevensc 184
              {labels.accept}
185
            </Button>
655 stevensc 186
            <Button className='btn-secondary mt-3' onClick={onClose}>
5 stevensc 187
              {labels.cancel}
188
            </Button>
189
          </Form>
190
        )}
191
      </Modal.Body>
192
    </Modal>
655 stevensc 193
  )
194
}
5 stevensc 195
 
655 stevensc 196
export default QuestionModal