Proyectos de Subversion LeadersLinked - Backend

Rev

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

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