Proyectos de Subversion LeadersLinked - SPA

Rev

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