Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
6769 stevensc 1
import React, { useEffect, useRef, useState } from 'react'
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
import { getCompanySizes } from '../../services/helpers'
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 [companySizes, setCompanySizes] = useState({})
23
  const addressKeys = useRef([
24
    'address1',
25
    'address2',
26
    'country',
27
    'state',
28
    'city1',
29
    'city2',
30
    'postal_code',
31
    'latitude',
32
    'longitude',
33
  ])
34
  const labels = useSelector(({ intl }) => intl.labels)
35
  const dispatch = useDispatch()
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
    getCompanySizes()
135
      .then(({ data }) => setCompanySizes(data))
136
      .catch((err) => {
137
        console.log(err)
138
        throw new Error(err)
139
      })
140
  }, [])
141
 
142
  useEffect(() => {
143
    if (!isEdit) return
144
 
145
    axios.get(url).then(({ data: response }) => {
146
      const { data, success } = response
147
 
148
      if (!success) {
149
        const errorMessage = typeof data === 'string' ? data : 'Error'
150
        addNotification({ style: 'danger', msg: errorMessage })
151
        return
152
      }
153
 
154
      Object.entries(data.experience).map(
155
        ([key, value]) => value && setValue(key, value)
156
      )
157
      Object.entries(data.location).map(
158
        ([key, value]) => value && setValue(key, value)
159
      )
160
    })
161
  }, [isEdit, show])
162
 
163
  return (
164
    <Modal show={show} onHide={handleModalOpen}>
165
      <Modal.Header>
166
        <Modal.Title>
167
          {isEdit ? labels.edit : labels.add} - {labels.experience}
168
        </Modal.Title>
169
      </Modal.Header>
170
      <form onSubmit={onSubmit}>
171
        <Modal.Body>
172
          <div className="form-group">
173
            <input
174
              type="text"
175
              name="company"
176
              placeholder="Empresa"
177
              ref={register({
178
                required: 'este campo es requerido',
179
              })}
180
            />
181
            {errors.company && (
182
              <FormErrorFeedback>{errors.company.message}</FormErrorFeedback>
183
            )}
184
          </div>
185
          {/* <div className="form-group">
186
            <select
187
              name="industry_id"
188
              id="industry_id"
189
              ref={register({
190
                required: 'este campo es requerido',
191
              })}
192
              defaultValue=""
193
            >
194
              <option value="" hidden>
195
                Industria
196
              </option>
197
              {industriesOptions &&
198
                Object.entries(industriesOptions).map(([key, value]) => (
199
                  <option value={key} key={key}>
200
                    {value}
201
                  </option>
202
                ))}
203
            </select>
204
            {errors.industry_id && (
205
              <FormErrorFeedback>
206
                {errors.industry_id.message}
207
              </FormErrorFeedback>
208
            )}
209
          </div> */}
210
          <div className="form-group">
211
            <select
212
              name="company_size_id"
213
              id="company_size_id"
214
              ref={register({
215
                required: 'este campo es requerido',
216
              })}
217
              defaultValue=""
218
            >
219
              <option value="" hidden>
220
                Tamaño de la Empresa
221
              </option>
222
              {companySizes &&
223
                Object.entries(companySizes).map(([key, value]) => (
224
                  <option value={key} key={key}>
225
                    {value}
226
                  </option>
227
                ))}
228
            </select>
229
            {errors.company_size_id && (
230
              <FormErrorFeedback>
231
                {errors.company_size_id.message}
232
              </FormErrorFeedback>
233
            )}
234
          </div>
235
          <div className="form-group">
236
            <input
237
              type="text"
238
              name="title"
239
              placeholder="Titulo"
240
              ref={register({
241
                required: 'este campo es requerido',
242
              })}
243
            />
244
            {errors.title && (
245
              <FormErrorFeedback>{errors.title.message}</FormErrorFeedback>
246
            )}
247
          </div>
248
          <div className="form-group datefm">
249
            <UbicationInput
250
              onGetAddress={getAddressHandler}
251
              settedQuery={watch('formatted_address')}
252
            />
253
            <i className="fa fa-map-marker" />
254
            {errors.formatted_address && (
255
              <FormErrorFeedback>
256
                {errors.formatted_address.message}
257
              </FormErrorFeedback>
258
            )}
259
          </div>
260
          <div className="row profile-year" style={{ gap: '.5rem' }}>
261
            <div className="input-c p-0">
262
              <div className="form-group">
263
                <select
264
                  name="from_month"
265
                  id="from_month"
266
                  ref={register({ required: 'este campo es requerido' })}
267
                  defaultValue=""
268
                >
269
                  <option value="">Mes desde</option>
270
                  {getMonths().map((month, id) => (
271
                    <option key={id} value={id + 1}>
272
                      {month}
273
                    </option>
274
                  ))}
275
                </select>
276
                {errors.from_month && (
277
                  <FormErrorFeedback>
278
                    {errors.from_month.message}
279
                  </FormErrorFeedback>
280
                )}
281
              </div>
282
            </div>
283
            <div className="input-c p-0">
284
              <div className="form-group">
285
                <select
286
                  name="from_year"
287
                  ref={register({ required: 'este campo es requerido' })}
288
                  defaultValue=""
289
                >
290
                  <option value="">Año desde</option>
291
                  {getYears().map((year) => (
292
                    <option key={year} value={year}>
293
                      {year}
294
                    </option>
295
                  ))}
296
                </select>
297
                {errors.from_year && (
298
                  <FormErrorFeedback>
299
                    {errors.from_year.message}
300
                  </FormErrorFeedback>
301
                )}
302
              </div>
303
            </div>
304
          </div>
305
          <label htmlFor="is_current"> Trabajo Actual</label>
306
          <div className="form-group">
307
            <SwitchInput
308
              setValue={(val) => setValue('is_current', val ? 'y' : 'n')}
309
            />
310
          </div>
311
          {!watch('is_current') && (
312
            <div className="row profile-year">
313
              <div className="input-c p-0">
314
                <div className="form-group">
315
                  <select
316
                    name="to_month"
317
                    id="to_month"
318
                    ref={register({
319
                      required: 'este campo es requerido',
320
                    })}
321
                    defaultValue=""
322
                  >
323
                    <option value="">Mes hasta</option>
324
                    {getMonths().map((month, id) => (
325
                      <option key={id} value={id + 1}>
326
                        {month}
327
                      </option>
328
                    ))}
329
                  </select>
330
                  {errors.to_month && (
331
                    <FormErrorFeedback>
332
                      {errors.to_month.message}
333
                    </FormErrorFeedback>
334
                  )}
335
                </div>
336
              </div>
337
              <div className="input-c p-0">
338
                <div className="form-group">
339
                  <select
340
                    name="to_year"
341
                    id="to_year"
342
                    ref={register({
343
                      required: 'este campo es requerido',
344
                    })}
345
                    defaultValue=""
346
                  >
347
                    <option value="">Año hasta</option>
348
                    {getYears().map((year) => (
349
                      <option key={year} value={year}>
350
                        {year}
351
                      </option>
352
                    ))}
353
                  </select>
354
                  {errors.to_year && (
355
                    <FormErrorFeedback>
356
                      {errors.to_year.message}
357
                    </FormErrorFeedback>
358
                  )}
359
                </div>
360
              </div>
361
            </div>
362
          )}
363
          <div className="form-group">
364
            <CKEditor
365
              onChange={(e) => setValue('description', e.editor.getData())}
366
              onInstanceReady={(e) =>
367
                e.editor.setData(getValues('description'))
368
              }
369
              config={CKEDITOR_OPTIONS}
370
            />
371
            {errors.description && (
372
              <FormErrorFeedback>Este campo es requerido</FormErrorFeedback>
373
            )}
374
          </div>
375
        </Modal.Body>
376
        <Modal.Footer>
377
          <Button size="sm" type="submit">
378
            {labels.accept}
379
          </Button>
380
          <Button size="sm" variant="danger" onClick={handleModalOpen}>
381
            {labels.cancel}
382
          </Button>
383
        </Modal.Footer>
384
      </form>
385
    </Modal>
386
  )
387
}
388
 
389
export default ExperienceModal