Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16276 | | Comparar con el anterior | Ultima modificación | Ver Log |

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