Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7192 | Rev 7201 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
7186 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'
7192 stevensc 8
 
9
import Spinner from '../UI/Spinner'
7190 stevensc 10
import TagsInput from '../../../shared/tags-input/TagsInput'
7192 stevensc 11
import FormErrorFeedback from '../UI/FormErrorFeedback'
12
import { styled } from 'styled-components'
7186 stevensc 13
 
7192 stevensc 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;
19
`
20
 
7186 stevensc 21
const QuestionModal = ({ show, url, isEdit, onClose, onComplete }) => {
22
  const [loading, setLoading] = useState(false)
7190 stevensc 23
  const [questionsCategories, setQuestionsCategories] = useState([])
24
  const [currentCategories, setCurrentCategories] = useState([])
7186 stevensc 25
  const labels = useSelector(({ intl }) => intl.labels)
26
  const dispatch = useDispatch()
27
 
28
  const { register, handleSubmit, getValues, setValue, errors } = useForm()
29
 
30
  const onSubmit = handleSubmit((data) => {
31
    setLoading(true)
32
    const formData = new FormData()
33
 
7196 stevensc 34
    Object.entries(data).map(([key, value]) => formData.append(key, value))
35
 
7186 stevensc 36
    axios
37
      .post(url, formData)
38
      .then((response) => {
39
        const { data, success } = response.data
7196 stevensc 40
 
7186 stevensc 41
        if (!success) {
7196 stevensc 42
          const errorMessage =
43
            typeof data === 'string' ? data : labels.error_there_was_an_error
7186 stevensc 44
 
7196 stevensc 45
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
7186 stevensc 46
          return
47
        }
48
 
49
        onComplete()
50
        onClose()
51
      })
52
      .finally(() => setLoading(false))
53
  })
54
 
7190 stevensc 55
  const getCategories = () => {
56
    axios
57
      .get('/my-coach', {
58
        headers: {
59
          'Content-Type': 'application/json',
60
        },
61
      })
62
      .then((response) => {
63
        const { data, success } = response.data
64
 
65
        if (!success) {
66
          const errorMessage =
67
            typeof data === 'string' ? data : labels.error_there_was_an_error
68
 
69
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
70
          return
71
        }
72
 
73
        const categories = Object.entries(data.categories).map((values) => ({
74
          name: values[1],
75
          value: values[0],
76
        }))
77
 
78
        setQuestionsCategories(categories)
79
      })
80
      .catch((error) => {
81
        dispatch(
82
          addNotification({
83
            style: 'danger',
84
            msg: labels.error_there_was_an_error,
85
          })
86
        )
87
        throw new Error(error)
88
      })
89
  }
90
 
91
  const onTagsChange = (tags) => {
7191 stevensc 92
    const categories = tags.map((tag) => tag.value)
93
    setValue('category_id', categories)
7190 stevensc 94
  }
95
 
7186 stevensc 96
  useEffect(() => {
97
    register('description', { required: true })
7190 stevensc 98
    register('category_id', { required: true })
7186 stevensc 99
  }, [])
100
 
101
  useEffect(() => {
102
    if (!url || !show || !isEdit) return
103
 
104
    axios.get(url).then((response) => {
105
      const { data, success } = response.data
106
 
107
      if (!success) {
108
        const errorMessage =
109
          typeof data === 'string' ? data : labels.error_there_was_an_error
110
 
111
        dispatch(
112
          addNotification({
113
            style: 'danger',
114
            msg: errorMessage,
115
          })
116
        )
117
        return
118
      }
7190 stevensc 119
      const categories = questionsCategories.map(
120
        (category) => data.category_id.includes(category.uuid) && category
121
      )
122
      setCurrentCategories(categories)
7186 stevensc 123
 
124
      setValue('title', data.title)
125
      setValue('description', data.description)
126
    })
127
  }, [url, show, isEdit])
128
 
129
  useEffect(() => {
130
    if (!show) {
131
      setValue('category_id', '')
132
      setValue('description', '')
133
      setValue('title', '')
134
      setValue('image', '')
7190 stevensc 135
    } else {
136
      getCategories()
7186 stevensc 137
    }
138
  }, [show])
139
 
140
  return (
141
    <Modal show={show}>
142
      <Modal.Header className="pb-0">
143
        <Modal.Title>
144
          {isEdit ? labels.edit : labels.add} {labels.question}
145
        </Modal.Title>
146
      </Modal.Header>
147
      <Modal.Body>
148
        {loading ? (
149
          <Spinner />
150
        ) : (
151
          <Form onSubmit={onSubmit}>
152
            <Form.Group>
153
              <Form.Label>{labels.title}</Form.Label>
154
              <Form.Control
155
                type="text"
156
                name="title"
157
                ref={register({ required: true })}
158
              />
159
              {errors.title && (
160
                <FormErrorFeedback>
161
                  {labels.error_field_empty}
162
                </FormErrorFeedback>
163
              )}
164
            </Form.Group>
165
 
166
            <CKEditor
167
              onChange={(e) => setValue('description', e.editor.getData())}
168
              onInstanceReady={(e) =>
169
                e.editor.setData(getValues('description'))
170
              }
171
              config={CKEDITOR_OPTIONS}
172
            />
173
            {errors.description && (
174
              <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
175
            )}
176
 
7192 stevensc 177
            <TagsContainer>
178
              <TagsInput
179
                suggestions={questionsCategories}
180
                settedTags={currentCategories}
181
                onChange={onTagsChange}
182
              />
183
            </TagsContainer>
7190 stevensc 184
 
7186 stevensc 185
            <Button className="mt-3 mr-2" variant="primary" type="submit">
186
              {labels.accept}
187
            </Button>
188
            <Button className="btn-secondary mt-3" onClick={onClose}>
189
              {labels.cancel}
190
            </Button>
191
          </Form>
192
        )}
193
      </Modal.Body>
194
    </Modal>
195
  )
196
}
197
 
198
export default QuestionModal