Proyectos de Subversion LeadersLinked - SPA

Rev

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