Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6871 | Rev 6876 | 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'
6779 stevensc 9
import useFetchHelper from '../../hooks/useFetchHelper'
6769 stevensc 10
 
11
import SwitchInput from '../UI/SwitchInput'
12
import FormErrorFeedback from '../UI/FormErrorFeedback'
13
import UbicationInput from '../../../shared/ubication-input/UbicationInput'
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()
6779 stevensc 35
  const { data: companySizes } = 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'
6775 stevensc 141
        dispatch(addNotification({ style: 'danger', msg: errorMessage }))
6769 stevensc 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>
6871 stevensc 213
              {Boolean(companySizes.length) &&
214
                companySizes.map(({ name, value }) => (
215
                  <option value={value} key={value}>
216
                    {name}
6779 stevensc 217
                  </option>
218
                ))}
6769 stevensc 219
            </select>
220
            {errors.company_size_id && (
221
              <FormErrorFeedback>
222
                {errors.company_size_id.message}
223
              </FormErrorFeedback>
224
            )}
225
          </div>
226
          <div className="form-group">
227
            <input
228
              type="text"
229
              name="title"
230
              placeholder="Titulo"
231
              ref={register({
232
                required: 'este campo es requerido',
233
              })}
234
            />
235
            {errors.title && (
236
              <FormErrorFeedback>{errors.title.message}</FormErrorFeedback>
237
            )}
238
          </div>
239
          <div className="form-group datefm">
240
            <UbicationInput
241
              onGetAddress={getAddressHandler}
242
              settedQuery={watch('formatted_address')}
243
            />
244
            <i className="fa fa-map-marker" />
245
            {errors.formatted_address && (
246
              <FormErrorFeedback>
247
                {errors.formatted_address.message}
248
              </FormErrorFeedback>
249
            )}
250
          </div>
251
          <div className="row profile-year" style={{ gap: '.5rem' }}>
252
            <div className="input-c p-0">
253
              <div className="form-group">
254
                <select
255
                  name="from_month"
256
                  id="from_month"
257
                  ref={register({ required: 'este campo es requerido' })}
258
                  defaultValue=""
259
                >
260
                  <option value="">Mes desde</option>
261
                  {getMonths().map((month, id) => (
262
                    <option key={id} value={id + 1}>
263
                      {month}
264
                    </option>
265
                  ))}
266
                </select>
267
                {errors.from_month && (
268
                  <FormErrorFeedback>
269
                    {errors.from_month.message}
270
                  </FormErrorFeedback>
271
                )}
272
              </div>
273
            </div>
274
            <div className="input-c p-0">
275
              <div className="form-group">
276
                <select
277
                  name="from_year"
278
                  ref={register({ required: 'este campo es requerido' })}
279
                  defaultValue=""
280
                >
281
                  <option value="">Año desde</option>
282
                  {getYears().map((year) => (
283
                    <option key={year} value={year}>
284
                      {year}
285
                    </option>
286
                  ))}
287
                </select>
288
                {errors.from_year && (
289
                  <FormErrorFeedback>
290
                    {errors.from_year.message}
291
                  </FormErrorFeedback>
292
                )}
293
              </div>
294
            </div>
295
          </div>
296
          <label htmlFor="is_current"> Trabajo Actual</label>
297
          <div className="form-group">
298
            <SwitchInput
299
              setValue={(val) => setValue('is_current', val ? 'y' : 'n')}
300
            />
301
          </div>
302
          {!watch('is_current') && (
303
            <div className="row profile-year">
304
              <div className="input-c p-0">
305
                <div className="form-group">
306
                  <select
307
                    name="to_month"
308
                    id="to_month"
309
                    ref={register({
310
                      required: 'este campo es requerido',
311
                    })}
312
                    defaultValue=""
313
                  >
314
                    <option value="">Mes hasta</option>
315
                    {getMonths().map((month, id) => (
316
                      <option key={id} value={id + 1}>
317
                        {month}
318
                      </option>
319
                    ))}
320
                  </select>
321
                  {errors.to_month && (
322
                    <FormErrorFeedback>
323
                      {errors.to_month.message}
324
                    </FormErrorFeedback>
325
                  )}
326
                </div>
327
              </div>
328
              <div className="input-c p-0">
329
                <div className="form-group">
330
                  <select
331
                    name="to_year"
332
                    id="to_year"
333
                    ref={register({
334
                      required: 'este campo es requerido',
335
                    })}
336
                    defaultValue=""
337
                  >
338
                    <option value="">Año hasta</option>
339
                    {getYears().map((year) => (
340
                      <option key={year} value={year}>
341
                        {year}
342
                      </option>
343
                    ))}
344
                  </select>
345
                  {errors.to_year && (
346
                    <FormErrorFeedback>
347
                      {errors.to_year.message}
348
                    </FormErrorFeedback>
349
                  )}
350
                </div>
351
              </div>
352
            </div>
353
          )}
354
          <div className="form-group">
355
            <CKEditor
356
              onChange={(e) => setValue('description', e.editor.getData())}
6875 stevensc 357
              onInstanceReady={(e) => e.editor.setData(watch('description'))}
6769 stevensc 358
              config={CKEDITOR_OPTIONS}
359
            />
360
            {errors.description && (
361
              <FormErrorFeedback>Este campo es requerido</FormErrorFeedback>
362
            )}
363
          </div>
364
        </Modal.Body>
365
        <Modal.Footer>
366
          <Button size="sm" type="submit">
367
            {labels.accept}
368
          </Button>
369
          <Button size="sm" variant="danger" onClick={handleModalOpen}>
370
            {labels.cancel}
371
          </Button>
372
        </Modal.Footer>
373
      </form>
374
    </Modal>
375
  )
376
}
377
 
378
export default ExperienceModal