Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
488 stevensc 1
import React, { useState } from 'react'
1457 stevensc 2
import { useDispatch, useSelector } from 'react-redux'
3
import { useForm } from 'react-hook-form'
496 stevensc 4
import Datetime from 'react-datetime'
1457 stevensc 5
 
496 stevensc 6
import { axios } from '../../utils'
2780 stevensc 7
import { useFetchHelper } from '@hooks'
496 stevensc 8
import { addNotification } from 'store/notification/notification.actions'
9
 
1457 stevensc 10
import Modal from 'components/UI/modal/Modal'
1437 stevensc 11
import FormErrorFeedback from 'components/UI/form/FormErrorFeedback'
1457 stevensc 12
 
488 stevensc 13
import 'react-datetime/css/react-datetime.css'
5 stevensc 14
 
15
const ConferenceModal = ({
16
  show = false,
488 stevensc 17
  zoomUrl = '',
655 stevensc 18
  onClose = () => null
5 stevensc 19
}) => {
488 stevensc 20
  const dt = new Date()
5 stevensc 21
  const [date, setDate] = useState({
488 stevensc 22
    year: dt.toLocaleString('default', { year: 'numeric' }),
23
    month: dt.toLocaleString('default', { month: '2-digit' }),
655 stevensc 24
    day: dt.toLocaleString('default', { day: '2-digit' })
488 stevensc 25
  })
5 stevensc 26
  const [time, setTime] = useState(
488 stevensc 27
    dt.toLocaleString('es', {
28
      hour: 'numeric',
29
      minute: '2-digit',
655 stevensc 30
      second: '2-digit'
5 stevensc 31
    })
488 stevensc 32
  )
33
  const { data: timezones } = useFetchHelper('timezones')
34
  const labels = useSelector(({ intl }) => intl.labels)
35
  const dispatch = useDispatch()
5 stevensc 36
 
2802 stevensc 37
  const {
38
    handleSubmit,
39
    register,
40
    reset,
41
    getValues,
42
    formState: { errors }
43
  } = useForm({
655 stevensc 44
    mode: 'all'
488 stevensc 45
  })
5 stevensc 46
 
47
  const handleDateTime = (value) => {
48
    setDate({
49
      ...date,
488 stevensc 50
      year: new Intl.DateTimeFormat('es', { year: 'numeric' }).format(value),
51
      month: new Intl.DateTimeFormat('es', { month: '2-digit' }).format(value),
655 stevensc 52
      day: new Intl.DateTimeFormat('es', { day: '2-digit' }).format(value)
488 stevensc 53
    })
5 stevensc 54
    setTime(
488 stevensc 55
      new Intl.DateTimeFormat('es', {
56
        hour: 'numeric',
57
        minute: '2-digit',
655 stevensc 58
        second: 'numeric'
5 stevensc 59
      }).format(value)
488 stevensc 60
    )
61
  }
5 stevensc 62
 
1979 stevensc 63
  const onSubmit = handleSubmit(async (data) => {
5 stevensc 64
    try {
1979 stevensc 65
      const formData = new FormData()
5 stevensc 66
 
1979 stevensc 67
      Object.entries(data).forEach(([key, value]) =>
68
        formData.append(key, value)
69
      )
70
      formData.append('date', `${date.year}-${date.month}-${date.day}`)
71
      formData.append('time', time)
72
 
73
      const { data: response } = await axios.post(zoomUrl, formData)
74
 
488 stevensc 75
      if (!response.success && typeof response.data === 'string') {
76
        dispatch(addNotification({ msg: response.data, style: 'danger' }))
77
        return
5 stevensc 78
      }
79
 
488 stevensc 80
      if (!response.success && typeof response.data === 'object') {
5 stevensc 81
        Object.entries(response.data).forEach(([key, value]) => {
82
          dispatch(
488 stevensc 83
            addNotification({ msg: `${key}: ${value[0]}`, style: 'danger' })
84
          )
85
        })
86
        return
5 stevensc 87
      }
88
 
488 stevensc 89
      dispatch(addNotification({ msg: response.data, style: 'success' }))
90
      onClose()
91
      reset()
655 stevensc 92
    } catch (err) {
93
      dispatch(addNotification({ style: 'danger', msg: err.message }))
5 stevensc 94
    }
488 stevensc 95
  })
5 stevensc 96
 
488 stevensc 97
  const generatePassword = () => {
98
    return Math.random().toString(36).slice(-6)
99
  }
100
 
5 stevensc 101
  return (
1457 stevensc 102
    <Modal
103
      title={labels.create_conference}
104
      show={show}
105
      onClose={onClose}
106
      onAccept={onSubmit}
107
    >
108
      <div className='form-group'>
109
        <label htmlFor='first_name'>Título</label>
110
        <input
111
          type='text'
112
          name='title'
113
          className='form-control'
114
          maxLength={128}
115
          ref={register({ required: 'Por favor ingrese un título' })}
116
        />
117
        {errors.title && (
118
          <FormErrorFeedback>{errors.title.message}</FormErrorFeedback>
119
        )}
120
      </div>
121
 
122
      <div className='form-group'>
123
        <label htmlFor='first_name'>Descripción</label>
124
        <input
125
          type='text'
126
          name='description'
127
          className='form-control'
128
          ref={register({ required: 'Por favor ingrese una descripción' })}
129
        />
130
        {errors.description && (
131
          <FormErrorFeedback>{errors.description.message}</FormErrorFeedback>
132
        )}
133
      </div>
134
 
135
      <div className='form-group'>
136
        <label htmlFor='timezone'>Tipo de conferencia</label>
137
        <select name='type' className='form-control' ref={register}>
138
          <option value='i'>Inmediata</option>
139
          <option value='s'>Programada</option>
140
        </select>
141
      </div>
142
 
143
      {getValues('type') === 's' && (
144
        <div className='form-group'>
145
          <label htmlFor='timezone'>Horario</label>
146
          <Datetime
147
            dateFormat='DD-MM-YYYY'
148
            onChange={(e) => {
149
              if (e.toDate) {
150
                handleDateTime(e.toDate())
151
              }
152
            }}
153
            inputProps={{ className: 'form-control' }}
154
            initialValue={Date.parse(new Date())}
155
            closeOnSelect
156
          />
157
        </div>
158
      )}
159
 
160
      <div className='form-group'>
161
        <label htmlFor='timezone'>Zona horaria</label>
162
        <select
163
          className='form-control'
164
          name='timezone'
165
          ref={register({ required: 'Por favor elige una Zona horaria' })}
166
          defaultValue='America/Montevideo'
167
        >
168
          <option value='' hidden>
169
            Zona horaria
170
          </option>
171
          {timezones.map(({ name, value }) => (
172
            <option value={value} key={value}>
173
              {name}
174
            </option>
175
          ))}
176
        </select>
177
        {errors.timezone && (
178
          <FormErrorFeedback>{errors.timezone.message}</FormErrorFeedback>
179
        )}
180
      </div>
181
 
182
      <div className='form-group'>
183
        <label htmlFor='timezone'>Duración</label>
184
        <select className='form-control' name='duration' ref={register}>
185
          <option value={5}>5-min</option>
186
          <option value={10}>10-min</option>
187
          <option value={15}>15-min</option>
188
          <option value={20}>20-min</option>
189
          <option value={25}>25-min</option>
190
          <option value={30}>30-min</option>
191
          <option value={35}>35-min</option>
192
          <option value={40}>40-min</option>
193
          <option value={45}>45-min</option>
194
        </select>
195
      </div>
196
 
197
      <div className='form-group'>
198
        <label htmlFor='first_name'>Contraseña de ingreso</label>
199
        <input
200
          defaultValue={generatePassword()}
201
          type='text'
202
          name='password'
203
          className='form-control'
204
          ref={register({
205
            required: 'Por favor ingrese una contraseña',
206
            maxLength: {
207
              value: 6,
208
              message: 'La contraseña debe tener al menos 6 digitos'
209
            }
210
          })}
211
        />
212
        {errors.password && (
213
          <FormErrorFeedback>{errors.password.message}</FormErrorFeedback>
214
        )}
215
      </div>
5 stevensc 216
    </Modal>
488 stevensc 217
  )
218
}
5 stevensc 219
 
488 stevensc 220
export default ConferenceModal