Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

| 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, useRef } from 'react'
4
import { axios } from '../../../utils'
5
import { useForm } from 'react-hook-form'
6
import { Button, Modal } from 'react-bootstrap'
7
import { useDispatch } from 'react-redux'
8
import { addNotification } from '../../../redux/notification/notification.actions'
9
 
10
import Spinner from '../../../shared/loading-spinner/Spinner'
11
import UbicationInput from '../../../shared/ubication-input/UbicationInput'
12
import FormErrorFeedback from '../../../shared/form-error-feedback/FormErrorFeedback'
13
 
14
const LocationModal = ({
15
  closeModal,
16
  isModalOpen,
17
  userIdEncrypted,
18
  setSettedAddress,
19
}) => {
20
  const {
21
    register,
22
    errors,
23
    handleSubmit,
24
    setValue,
25
    clearErrors,
26
    getValues,
27
    watch,
28
    setError,
29
  } = useForm()
30
  const [modalLoading, setModalLoading] = useState(false)
31
  const dispatch = useDispatch()
32
 
33
  const isAddressEmpty = useRef(true)
34
  const addressKeys = useRef([
35
    'address1',
36
    'address2',
37
    'country',
38
    'state',
39
    'city1',
40
    'city2',
41
    'postal_code',
42
    'latitude',
43
    'longitude',
44
  ])
45
 
46
  const handleModalOpen = (event) => {
47
    event && event.preventDefault()
48
    Object.keys(getValues()).map(([key]) => setValue(key, ''))
49
    closeModal()
50
  }
51
 
52
  const getAddressHandler = (addresObject) => {
53
    addressKeys.current.map((addressKey) => {
54
      setValue(addressKey, '')
55
    })
56
    const { address_components } = addresObject
57
    if (address_components) {
58
      address_components.map((address_component) => {
59
        const address_component_name = address_component.long_name
60
        const address_component_type = address_component.types[0]
61
        switch (address_component_type) {
62
          case 'route':
63
            setValue('address1', address_component_name)
64
            break
65
          case 'sublocality':
66
            setValue('address2', address_component_name)
67
            break
68
          case 'locality':
69
            setValue('city1', address_component_name)
70
            break
71
          case 'administrative_area_level_2':
72
            setValue('city2', address_component_name)
73
            break
74
          case 'administrative_area_level_1':
75
            setValue('state', address_component_name)
76
            break
77
          case 'country':
78
            setValue('country', address_component_name)
79
            break
80
          case 'postal_code':
81
            setValue('postal_code', address_component_name)
82
            break
83
          case 'geometry':
84
            setValue('latitude', address_component.latitude)
85
            setValue('longitude', address_component.longitude)
86
            break
87
          default:
88
            break
89
        }
90
      })
91
      isAddressEmpty.current = false
92
      clearErrors('formatted_address')
93
    } else {
94
      isAddressEmpty.current = true
95
    }
96
    setValue('formatted_address', addresObject.formatted_address)
97
  }
98
 
99
  const onSubmitHandler = async (data) => {
100
    setModalLoading(true)
101
    const formData = new FormData()
102
    Object.entries(data).map(([key, value]) => {
103
      formData.append(key, value)
104
    })
105
    await axios
106
      .post(`/profile/my-profiles/location/${userIdEncrypted}`, formData)
107
      .then((response) => {
108
        const resData = response.data
109
        if (resData.success) {
110
          setSettedAddress(resData.data.formatted_address)
111
          handleModalOpen()
112
        } else {
113
          const resError = resData.data
114
          if (resError.constructor.name === 'Object') {
115
            Object.entries(resError).map(([key, value]) => {
116
              if (key in getValues()) {
117
                setError(key, {
118
                  type: 'manual',
119
                  message: Array.isArray(value) ? value[0] : value,
120
                })
121
              }
122
            })
123
          } else {
124
            dispatch(addNotification({ style: 'danger', msg: resError }))
125
          }
126
        }
127
      })
128
    setModalLoading(false)
129
  }
130
 
131
  useEffect(() => {
132
    addressKeys.current.map((addressKey) => {
133
      register(addressKey)
134
    })
135
    register('formatted_address', {
136
      required: 'por favor seleccione una ubicación correcta',
137
    })
138
  }, [])
139
 
140
  return (
141
    <Modal
142
      show={isModalOpen}
143
      onHide={handleModalOpen}
144
      style={{ overflowY: 'scroll' }}
145
    >
146
      <Modal.Header closeButton>
147
        <Modal.Title>Ubicación</Modal.Title>
148
      </Modal.Header>
149
      <form onSubmit={handleSubmit(onSubmitHandler)}>
150
        <Modal.Body>
151
          <div className="form-group datefm">
152
            <UbicationInput
153
              onGetAddress={getAddressHandler}
154
              settedQuery={watch('formatted_address')}
155
            />
156
            <i className="fa fa-map-marker"></i>
157
            {errors.formatted_address && (
158
              <FormErrorFeedback>
159
                {errors.formatted_address.message}
160
              </FormErrorFeedback>
161
            )}
162
          </div>
163
        </Modal.Body>
164
        <Modal.Footer>
165
          <Button size="sm" type="submit">
166
            Enviar
167
          </Button>
168
          <Button size="sm" variant="danger" onClick={handleModalOpen}>
169
            Cancelar
170
          </Button>
171
        </Modal.Footer>
172
      </form>
173
      {modalLoading && <Spinner />}
174
    </Modal>
175
  )
176
}
177
 
178
export default LocationModal