Proyectos de Subversion LeadersLinked - SPA

Rev

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

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