Proyectos de Subversion LeadersLinked - SPA

Rev

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

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