Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6354 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
5483 stevensc 1
/* eslint-disable array-callback-return */
2
/* eslint-disable react/prop-types */
3
import React, { useEffect, useState } from 'react'
4
import { axios } from '../../../utils'
5
import { useForm } from 'react-hook-form'
6
import { useDispatch } from 'react-redux'
7
import { Button, Modal } from 'react-bootstrap'
8
import { addNotification } from '../../../redux/notification/notification.actions'
9
 
10
import Spinner from '../../../shared/loading-spinner/Spinner'
11
import TagsInput from '../../../shared/tags-input/TagsInput'
12
import FormErrorFeedback from '../../../shared/form-error-feedback/FormErrorFeedback'
13
 
14
const LanguagesModal = ({
15
  show = false,
16
  userIdEncrypted = '',
17
  languagesOptions = [],
18
  userLanguages = [],
19
  closeModal = () => {},
20
  setLanguages = () => {},
21
}) => {
22
  const { register, errors, handleSubmit, setValue, getValues, setError } =
23
    useForm()
24
  const [modalLoading, setModalLoading] = useState(false)
25
  const [settedLanguageTags, setSettedLanguageTags] = useState([])
26
  const dispatch = useDispatch()
27
 
28
  const handleModalOpen = (event) => {
29
    event && event.preventDefault()
30
    Object.keys(getValues()).map(([key]) => setValue(key, ''))
31
    closeModal()
32
  }
33
 
34
  const handleTagsChange = (tags) => {
35
    if (tags.length) {
36
      let newTags = []
37
      tags.map((tag) => {
38
        newTags = [...newTags, tag.value]
39
      })
40
      setValue('languages', newTags)
41
      setSettedLanguageTags(tags)
42
    } else {
43
      setValue('languages', '')
44
      setSettedLanguageTags('')
45
    }
46
  }
47
 
48
  const onSubmitHandler = async () => {
49
    setModalLoading(true)
50
    const formData = new FormData()
51
    getValues('languages').map((language) => {
52
      formData.append('languages[]', language)
53
    })
54
    await axios
55
      .post(`/profile/my-profiles/language/${userIdEncrypted}`, formData)
56
      .then((response) => {
57
        const resData = response.data
58
        if (resData.success) {
59
          dispatch(
60
            addNotification({ style: 'success', msg: 'Registro actualizado' })
61
          )
62
          setLanguages(settedLanguageTags)
63
          handleModalOpen()
64
        } else {
65
          const resError = resData.data
66
          if (resError.constructor.name === 'Object') {
67
            Object.entries(resError).map(([key, value]) => {
68
              if (key in getValues()) {
69
                setError(key, {
70
                  type: 'manual',
71
                  message: Array.isArray(value) ? value[0] : value,
72
                })
73
              }
74
            })
75
          } else {
76
            dispatch(addNotification({ style: 'danger', msg: resError }))
77
          }
78
        }
79
      })
80
    getValues('languages')
81
    setModalLoading(false)
82
  }
83
 
84
  useEffect(() => {
85
    register('languages', {
86
      required: 'Por favor seleccione al menos un lenguaje',
87
    })
88
  }, [])
89
 
90
  return (
91
    <Modal show={show} onHide={handleModalOpen} style={{ overflowY: 'scroll' }}>
92
      <Modal.Header closeButton>
93
        <Modal.Title>Idiomas</Modal.Title>
94
      </Modal.Header>
95
      <form onSubmit={handleSubmit(onSubmitHandler)}>
96
        <Modal.Body>
97
          <div className="form-group">
98
            <TagsInput
99
              suggestions={languagesOptions}
100
              settedTags={userLanguages}
101
              onChange={handleTagsChange}
102
            />
103
            {errors.languages && (
104
              <FormErrorFeedback>{errors.languages.message}</FormErrorFeedback>
105
            )}
106
          </div>
107
        </Modal.Body>
108
        <Modal.Footer>
109
          <Button size="sm" type="submit">
110
            Enviar
111
          </Button>
112
          <Button size="sm" variant="danger" onClick={handleModalOpen}>
113
            Cancelar
114
          </Button>
115
        </Modal.Footer>
116
      </form>
117
      {modalLoading && <Spinner />}
118
    </Modal>
119
  )
120
}
121
 
122
export default LanguagesModal