Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
6770 stevensc 1
import React, { useEffect, useRef } from 'react'
6769 stevensc 2
import { axios, CKEDITOR_OPTIONS } from '../../utils'
3
import { Button, Modal } from 'react-bootstrap'
4
import { useForm } from 'react-hook-form'
5
import { CKEditor } from 'ckeditor4-react'
6
import { useDispatch, useSelector } from 'react-redux'
7
import { addNotification } from '../../redux/notification/notification.actions'
8
import { getMonths, getYears } from '../../utils/dates'
9
 
10
import SwitchInput from '../UI/SwitchInput'
11
import FormErrorFeedback from '../UI/FormErrorFeedback'
12
import UbicationInput from '../../../shared/ubication-input/UbicationInput'
6774 stevensc 13
// import useFetchHelper from '../../hooks/useFetchHelper'
6769 stevensc 14
 
15
const ExperienceModal = ({
16
  show = false,
17
  url = '',
18
  onClose = () => {},
19
  onComplete = () => {},
20
  isEdit = false,
21
}) => {
22
  const addressKeys = useRef([
23
    'address1',
24
    'address2',
25
    'country',
26
    'state',
27
    'city1',
28
    'city2',
29
    'postal_code',
30
    'latitude',
31
    'longitude',
32
  ])
33
  const labels = useSelector(({ intl }) => intl.labels)
34
  const dispatch = useDispatch()
6773 stevensc 35
  // const { data } = useFetchHelper('company-sizes')
6769 stevensc 36
 
37
  const {
38
    register,
39
    errors,
40
    handleSubmit,
41
    setValue,
42
    clearErrors,
43
    getValues,
44
    watch,
45
    setError,
46
    reset,
47
  } = useForm()
48
 
49
  const handleModalOpen = () => {
50
    reset()
51
    onClose()
52
  }
53
 
54
  const getAddressHandler = (addresObject) => {
55
    addressKeys.current.map((addressKey) => setValue(addressKey, ''))
56
 
57
    const { address_components } = addresObject
58
 
59
    if (address_components) {
60
      address_components.map((address_component) => {
61
        const address_component_name = address_component.long_name
62
        const address_component_type = address_component.types[0]
63
        switch (address_component_type) {
64
          case 'route':
65
            setValue('address1', address_component_name)
66
            break
67
          case 'sublocality':
68
            setValue('address2', address_component_name)
69
            break
70
          case 'locality':
71
            setValue('city1', address_component_name)
72
            break
73
          case 'administrative_area_level_2':
74
            setValue('city2', address_component_name)
75
            break
76
          case 'administrative_area_level_1':
77
            setValue('state', address_component_name)
78
            break
79
          case 'country':
80
            setValue('country', address_component_name)
81
            break
82
          case 'postal_code':
83
            setValue('postal_code', address_component_name)
84
            break
85
          case 'geometry':
86
            setValue('latitude', address_component.latitude)
87
            setValue('longitude', address_component.longitude)
88
            break
89
          default:
90
            break
91
        }
92
      })
93
    }
94
 
95
    setValue('formatted_address', addresObject.formatted_address)
96
    clearErrors('formatted_address')
97
  }
98
 
99
  const onSubmit = handleSubmit((data) => {
100
    const formData = new FormData()
101
 
102
    Object.entries(data).map(([key, value]) => {
103
      if (!value) {
104
        return
105
      }
106
      formData.append(key, value)
107
    })
108
 
109
    axios.post(url, formData).then(({ data: response }) => {
110
      const { data, success } = response
111
 
112
      if (!success) {
113
        typeof data === 'string'
114
          ? dispatch(addNotification({ style: 'danger', msg: data }))
115
          : Object.entries(data).map(([key, value]) =>
116
              setError(key, { message: value[0] })
117
            )
118
        return
119
      }
120
 
121
      onComplete(data)
122
      handleModalOpen()
123
    })
124
  })
125
 
126
  useEffect(() => {
127
    addressKeys.current.map((addressKey) => register(addressKey))
128
    register('formatted_address', { required: 'Este campo es requerido' })
129
    register('description', { required: true })
130
    register('is_current', { required: true })
131
  }, [])
132
 
133
  useEffect(() => {
134
    if (!isEdit) return
135
 
136
    axios.get(url).then(({ data: response }) => {
137
      const { data, success } = response
138
 
139
      if (!success) {
140
        const errorMessage = typeof data === 'string' ? data : 'Error'
141
        addNotification({ style: 'danger', msg: errorMessage })
142
        return
143
      }
144
 
145
      Object.entries(data.experience).map(
146
        ([key, value]) => value && setValue(key, value)
147
      )
148
      Object.entries(data.location).map(
149
        ([key, value]) => value && setValue(key, value)
150
      )
151
    })
152
  }, [isEdit, show])
153
 
154
  return (
155
    <Modal show={show} onHide={handleModalOpen}>
156
      <Modal.Header>
157
        <Modal.Title>
158
          {isEdit ? labels.edit : labels.add} - {labels.experience}
159
        </Modal.Title>
160
      </Modal.Header>
161
      <form onSubmit={onSubmit}>
162
        <Modal.Body>
163
          <div className="form-group">
164
            <input
165
              type="text"
166
              name="company"
167
              placeholder="Empresa"
168
              ref={register({
169
                required: 'este campo es requerido',
170
              })}
171
            />
172
            {errors.company && (
173
              <FormErrorFeedback>{errors.company.message}</FormErrorFeedback>
174
            )}
175
          </div>
176
          {/* <div className="form-group">
177
            <select
178
              name="industry_id"
179
              id="industry_id"
180
              ref={register({
181
                required: 'este campo es requerido',
182
              })}
183
              defaultValue=""
184
            >
185
              <option value="" hidden>
186
                Industria
187
              </option>
188
              {industriesOptions &&
189
                Object.entries(industriesOptions).map(([key, value]) => (
190
                  <option value={key} key={key}>
191
                    {value}
192
                  </option>
193
                ))}
194
            </select>
195
            {errors.industry_id && (
196
              <FormErrorFeedback>
197
                {errors.industry_id.message}
198
              </FormErrorFeedback>
199
            )}
200
          </div> */}
201
          <div className="form-group">
202
            <select
203
              name="company_size_id"
204
              id="company_size_id"
205
              ref={register({
206
                required: 'este campo es requerido',
207
              })}
208
              defaultValue=""
209
            >
210
              <option value="" hidden>
211
                Tamaño de la Empresa
212
              </option>
213
            </select>
214
            {errors.company_size_id && (
215
              <FormErrorFeedback>
216
                {errors.company_size_id.message}
217
              </FormErrorFeedback>
218
            )}
219
          </div>
220
          <div className="form-group">
221
            <input
222
              type="text"
223
              name="title"
224
              placeholder="Titulo"
225
              ref={register({
226
                required: 'este campo es requerido',
227
              })}
228
            />
229
            {errors.title && (
230
              <FormErrorFeedback>{errors.title.message}</FormErrorFeedback>
231
            )}
232
          </div>
233
          <div className="form-group datefm">
234
            <UbicationInput
235
              onGetAddress={getAddressHandler}
236
              settedQuery={watch('formatted_address')}
237
            />
238
            <i className="fa fa-map-marker" />
239
            {errors.formatted_address && (
240
              <FormErrorFeedback>
241
                {errors.formatted_address.message}
242
              </FormErrorFeedback>
243
            )}
244
          </div>
245
          <div className="row profile-year" style={{ gap: '.5rem' }}>
246
            <div className="input-c p-0">
247
              <div className="form-group">
248
                <select
249
                  name="from_month"
250
                  id="from_month"
251
                  ref={register({ required: 'este campo es requerido' })}
252
                  defaultValue=""
253
                >
254
                  <option value="">Mes desde</option>
255
                  {getMonths().map((month, id) => (
256
                    <option key={id} value={id + 1}>
257
                      {month}
258
                    </option>
259
                  ))}
260
                </select>
261
                {errors.from_month && (
262
                  <FormErrorFeedback>
263
                    {errors.from_month.message}
264
                  </FormErrorFeedback>
265
                )}
266
              </div>
267
            </div>
268
            <div className="input-c p-0">
269
              <div className="form-group">
270
                <select
271
                  name="from_year"
272
                  ref={register({ required: 'este campo es requerido' })}
273
                  defaultValue=""
274
                >
275
                  <option value="">Año desde</option>
276
                  {getYears().map((year) => (
277
                    <option key={year} value={year}>
278
                      {year}
279
                    </option>
280
                  ))}
281
                </select>
282
                {errors.from_year && (
283
                  <FormErrorFeedback>
284
                    {errors.from_year.message}
285
                  </FormErrorFeedback>
286
                )}
287
              </div>
288
            </div>
289
          </div>
290
          <label htmlFor="is_current"> Trabajo Actual</label>
291
          <div className="form-group">
292
            <SwitchInput
293
              setValue={(val) => setValue('is_current', val ? 'y' : 'n')}
294
            />
295
          </div>
296
          {!watch('is_current') && (
297
            <div className="row profile-year">
298
              <div className="input-c p-0">
299
                <div className="form-group">
300
                  <select
301
                    name="to_month"
302
                    id="to_month"
303
                    ref={register({
304
                      required: 'este campo es requerido',
305
                    })}
306
                    defaultValue=""
307
                  >
308
                    <option value="">Mes hasta</option>
309
                    {getMonths().map((month, id) => (
310
                      <option key={id} value={id + 1}>
311
                        {month}
312
                      </option>
313
                    ))}
314
                  </select>
315
                  {errors.to_month && (
316
                    <FormErrorFeedback>
317
                      {errors.to_month.message}
318
                    </FormErrorFeedback>
319
                  )}
320
                </div>
321
              </div>
322
              <div className="input-c p-0">
323
                <div className="form-group">
324
                  <select
325
                    name="to_year"
326
                    id="to_year"
327
                    ref={register({
328
                      required: 'este campo es requerido',
329
                    })}
330
                    defaultValue=""
331
                  >
332
                    <option value="">Año hasta</option>
333
                    {getYears().map((year) => (
334
                      <option key={year} value={year}>
335
                        {year}
336
                      </option>
337
                    ))}
338
                  </select>
339
                  {errors.to_year && (
340
                    <FormErrorFeedback>
341
                      {errors.to_year.message}
342
                    </FormErrorFeedback>
343
                  )}
344
                </div>
345
              </div>
346
            </div>
347
          )}
348
          <div className="form-group">
349
            <CKEditor
350
              onChange={(e) => setValue('description', e.editor.getData())}
351
              onInstanceReady={(e) =>
352
                e.editor.setData(getValues('description'))
353
              }
354
              config={CKEDITOR_OPTIONS}
355
            />
356
            {errors.description && (
357
              <FormErrorFeedback>Este campo es requerido</FormErrorFeedback>
358
            )}
359
          </div>
360
        </Modal.Body>
361
        <Modal.Footer>
362
          <Button size="sm" type="submit">
363
            {labels.accept}
364
          </Button>
365
          <Button size="sm" variant="danger" onClick={handleModalOpen}>
366
            {labels.cancel}
367
          </Button>
368
        </Modal.Footer>
369
      </form>
370
    </Modal>
371
  )
372
}
373
 
374
export default ExperienceModal