Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
15761 stevensc 1
/* eslint-disable camelcase */
14581 stevensc 2
/* eslint-disable react/prop-types */
15762 stevensc 3
import React, { useEffect, useRef, useState } from "react";
4
import { axios } from "../../../utils";
5
import { Modal } from "react-bootstrap";
6
import { useForm } from "react-hook-form";
7
import { addNotification } from "../../../redux/notification/notification.actions";
8
import { useDispatch } from "react-redux";
9
import styled from "styled-components";
10
import Datetime from "react-datetime";
11
import SearchIcon from "@mui/icons-material/Search";
12
import ConfirmModal from "../../../shared/confirm-modal/ConfirmModal";
13
import EmptySection from "../../../shared/empty-section/EmptySection";
14
import FormErrorFeedback from "../../../shared/form-error-feedback/FormErrorFeedback";
11350 nelberth 15
 
15762 stevensc 16
import "react-datetime/css/react-datetime.css";
17
import ChatList from "../components/ContactsList";
18
import TextBox from "../components/TextBox";
11350 nelberth 19
 
20
const StyledShowOptions = styled.div`
21
  height: 342px;
22
  flex-direction: column;
15761 stevensc 23
  gap: 0.5rem;
11350 nelberth 24
  overflow-y: auto;
25
  position: relative;
26
  &.show {
27
    display: flex;
28
  }
29
  &.hide {
30
    display: none;
31
  }
32
  .optionBack {
33
    margin: 1rem 0 0.5rem 1rem;
34
    cursor: pointer;
35
  }
36
  .optionsTab {
37
    &__option {
38
      padding: 0.5rem;
39
      border-bottom: 1px solid #e2e2e2;
40
      cursor: pointer;
41
      &:hover {
42
        background-color: #e2e2e2;
43
      }
44
      &__icon {
45
        margin-right: 0.3rem;
46
      }
47
    }
48
  }
49
  .addPersonToGroupTab {
50
    display: flex;
51
    flex-direction: column;
52
    &__person {
53
      display: flex;
54
      justify-content: space-between;
55
      align-items: center;
56
      padding: 0.2rem 0.5rem;
57
      border-bottom: 1px solid #e2e2e2;
58
    }
59
  }
15762 stevensc 60
`;
11350 nelberth 61
 
15761 stevensc 62
const OPTIONS = {
15762 stevensc 63
  GROUP: "group",
64
  CONFERENCE: "conference",
65
  ADD_CONTACTS: "addContacts",
66
  LIST_CONTACTS: "listContacts",
15761 stevensc 67
  INITIAL: null,
15762 stevensc 68
};
14581 stevensc 69
 
15761 stevensc 70
const PersonalChat = ({
71
  entity,
72
  onClose,
73
  onMinimize,
74
  onRead,
75
  not_seen_messages,
76
  minimized,
77
  timezones,
78
}) => {
79
  const {
80
    // id,
81
    image,
82
    name,
83
    online,
84
    type,
85
    url_get_all_messages,
86
    url_send,
87
    url_upload,
88
    profile,
89
    url_leave,
90
    url_delete,
91
    url_add_user_to_group,
92
    url_get_contact_group_list,
93
    url_get_contacts_availables_for_group,
94
    url_zoom,
15762 stevensc 95
  } = entity;
11350 nelberth 96
 
15762 stevensc 97
  const [optionTab, setOptionTab] = useState(OPTIONS.INITIAL);
11350 nelberth 98
 
15762 stevensc 99
  const [availableContactsToAdd, setAvailableContactsToAdd] = useState([]);
100
  const [groupContactsList, setGroupContactsList] = useState([]);
11350 nelberth 101
 
15762 stevensc 102
  const [confirmModalShow, setConfirmModalShow] = useState(false);
103
  const [showConferenceModal, setShowConferenceModal] = useState(false);
11350 nelberth 104
 
15762 stevensc 105
  const [search, setSearch] = useState("");
11350 nelberth 106
 
15762 stevensc 107
  const [messages, setMessages] = useState([]);
108
  const [oldMessages, setOldMessages] = useState([]);
109
  const [currentPage, setCurrentPage] = useState(1);
110
  const [lastPage, setLastPage] = useState(1);
11350 nelberth 111
 
15762 stevensc 112
  const [loading, setLoading] = useState(false);
11350 nelberth 113
 
15761 stevensc 114
  const filtredGroupList = groupContactsList.filter((conversation) =>
115
    conversation.name.toLowerCase().includes(search.toLowerCase())
15762 stevensc 116
  );
11350 nelberth 117
 
15761 stevensc 118
  // refs
15762 stevensc 119
  const conversationListEl = useRef(null);
120
  const loader = useRef(null);
121
  const modalActionUrl = useRef("");
11350 nelberth 122
 
15761 stevensc 123
  const handleActive = () => {
15762 stevensc 124
    onRead(entity);
125
    onMinimize(entity);
126
  };
11350 nelberth 127
 
15761 stevensc 128
  const handleGetMessages = async () => {
15762 stevensc 129
    setLoading(true);
130
    const response = await axios.get(url_get_all_messages);
131
    const resData = response.data;
15761 stevensc 132
    if (!resData.success) {
15762 stevensc 133
      return "ha ocurrido un error";
15761 stevensc 134
    }
15762 stevensc 135
    const updatedMessages = [...resData.data.items].reverse();
15761 stevensc 136
    const newMessages = updatedMessages.reduce((acum, updatedMessage) => {
137
      if (
138
        messages.findIndex((message) => message.id === updatedMessage.id) === -1
139
      ) {
15762 stevensc 140
        acum = [...acum, updatedMessage];
15761 stevensc 141
      }
15762 stevensc 142
      return acum;
143
    }, []);
11350 nelberth 144
 
15761 stevensc 145
    if (newMessages.length > 0) {
15762 stevensc 146
      setMessages([...messages, ...newMessages]);
147
      setLoading(false);
148
      setLastPage(resData.data.pages);
149
      scrollToBottom();
15761 stevensc 150
    } else {
15762 stevensc 151
      setLoading(false);
15761 stevensc 152
    }
15762 stevensc 153
  };
14581 stevensc 154
 
15761 stevensc 155
  const handleLoadMore = async () => {
156
    await axios
157
      .get(`${url_get_all_messages}?page=${currentPage}`)
158
      .then((response) => {
15762 stevensc 159
        const resData = response.data;
15761 stevensc 160
        if (resData.success) {
161
          if (resData.data.page > 1) {
15762 stevensc 162
            const updatedOldMessages = [...resData.data.items].reverse();
163
            setOldMessages([...updatedOldMessages, ...oldMessages]);
15761 stevensc 164
            /* scrollDownBy(100); */
165
          }
166
        }
15762 stevensc 167
      });
168
  };
14581 stevensc 169
 
15762 stevensc 170
  const handleCloseChat = () => onClose(entity);
11350 nelberth 171
 
15761 stevensc 172
  const sendMessage = async (message) => {
15762 stevensc 173
    const formData = new FormData();
174
    formData.append("message", emojione.toShort(message));
15761 stevensc 175
    await axios.post(url_send, formData).then((response) => {
15762 stevensc 176
      const resData = response.data;
15761 stevensc 177
      if (resData.success) {
15762 stevensc 178
        let newMessage = resData.data;
11350 nelberth 179
 
15761 stevensc 180
        online
181
          ? (newMessage = { ...newMessage, not_received: false })
15762 stevensc 182
          : (newMessage = { ...newMessage, not_received: true });
11350 nelberth 183
 
15762 stevensc 184
        setMessages([...messages, newMessage]);
15761 stevensc 185
      }
15762 stevensc 186
    });
15761 stevensc 187
    // await handleGetMessages()
188
    // setResponseMessage(null)
15762 stevensc 189
  };
11350 nelberth 190
 
15761 stevensc 191
  const showOptions = (tab = OPTIONS.INITIAL) => {
15762 stevensc 192
    onMinimize(entity, false);
193
    setOptionTab(tab);
194
  };
11350 nelberth 195
 
15761 stevensc 196
  const handleAddPersonToGroup = async (id) => {
15762 stevensc 197
    const formData = new FormData();
198
    formData.append("uid", id);
15761 stevensc 199
    await axios.post(url_add_user_to_group, formData).then((response) => {
15762 stevensc 200
      const resData = response.data;
15761 stevensc 201
      if (resData.success) {
15762 stevensc 202
        loadPersonsAvailable();
15761 stevensc 203
      }
15762 stevensc 204
    });
205
  };
11350 nelberth 206
 
15761 stevensc 207
  const handleConfirmModalAction = async () => {
208
    try {
15762 stevensc 209
      const { data } = await axios.post(modalActionUrl.current);
210
      if (!data.success) console.log("Error in confirm modal action");
211
      handleConfirmModalShow();
212
      onClose(entity);
213
      return;
15761 stevensc 214
    } catch (error) {
15762 stevensc 215
      console.log(error);
15761 stevensc 216
    }
15762 stevensc 217
  };
11350 nelberth 218
 
15761 stevensc 219
  const handleObserver = (entities) => {
15762 stevensc 220
    const target = entities[0];
15761 stevensc 221
    if (target.isIntersecting) {
15762 stevensc 222
      setCurrentPage((prevState) => prevState + 1);
15761 stevensc 223
    }
15762 stevensc 224
  };
11350 nelberth 225
 
15761 stevensc 226
  const scrollToBottom = () => {
227
    if (conversationListEl.current) {
228
      conversationListEl.current.scrollTop =
15762 stevensc 229
        conversationListEl.current.scrollHeight * 9;
15761 stevensc 230
    }
15762 stevensc 231
  };
11350 nelberth 232
 
15762 stevensc 233
  const handleConfirmModalShow = () => setConfirmModalShow(!confirmModalShow);
11350 nelberth 234
 
15762 stevensc 235
  const handleConfirmModalAccept = () => handleConfirmModalAction();
11350 nelberth 236
 
15761 stevensc 237
  /* const handleResponseMessage = (element) => {
238
    element.mtype === 'text'
239
      ? setResponseMessage(element)
240
      : setResponseMessage({ ...element, m: 'Archivo adjunto' })
11350 nelberth 241
 
15761 stevensc 242
    textAreaEl.current && textAreaEl.current.focus()
243
  } */
11350 nelberth 244
 
15761 stevensc 245
  const displayConferenceModal = () =>
15762 stevensc 246
    setShowConferenceModal(!showConferenceModal);
11350 nelberth 247
 
15761 stevensc 248
  const loadPersonsAvailable = async () => {
249
    await axios.get(url_get_contacts_availables_for_group).then((response) => {
15762 stevensc 250
      const resData = response.data;
15761 stevensc 251
      if (resData.success) {
15762 stevensc 252
        setAvailableContactsToAdd(resData.data);
15761 stevensc 253
      }
15762 stevensc 254
    });
255
  };
11350 nelberth 256
 
15761 stevensc 257
  const loadGroupContacts = async () => {
258
    await axios.get(url_get_contact_group_list).then((response) => {
15762 stevensc 259
      const resData = response.data;
15761 stevensc 260
      if (resData.success) {
15762 stevensc 261
        setGroupContactsList(resData.data);
15761 stevensc 262
      }
15762 stevensc 263
    });
264
  };
11350 nelberth 265
 
15761 stevensc 266
  const handleDeletePersonFromGroup = async (urlDeletePersonFromGroup) => {
267
    await axios.post(urlDeletePersonFromGroup).then((response) => {
15762 stevensc 268
      const resData = response.data;
15761 stevensc 269
      if (resData.success) {
15762 stevensc 270
        loadGroupContacts();
15761 stevensc 271
      }
15762 stevensc 272
    });
273
  };
11350 nelberth 274
 
15761 stevensc 275
  const tabsOptions = {
276
    group: (
277
      <ul>
278
        {url_get_contact_group_list && (
279
          <li
280
            className="optionsTab__option"
281
            onClick={() => showOptions(OPTIONS.LIST_CONTACTS)}
282
          >
283
            <span className="optionsTab__option__icon">
284
              <i className="fa fa-group" />
285
              Integrantes
286
            </span>
287
          </li>
288
        )}
289
        {url_add_user_to_group && (
290
          <li
291
            className="optionsTab__option"
292
            onClick={() => showOptions(OPTIONS.ADD_CONTACTS)}
293
          >
294
            <span className="optionsTab__option__icon">
295
              <i className="fa fa-user-plus"></i>
296
            </span>
297
            {CHAT_LABELS.ADD_CONTACTS}
298
          </li>
299
        )}
300
        {url_zoom && (
301
          <li className="optionsTab__option" onClick={displayConferenceModal}>
302
            <span className="optionsTab__option__icon">
303
              <i className="fa fa-user-plus" />
304
            </span>
305
            {CHAT_LABELS.CREATE_CONFERENCE}
306
          </li>
307
        )}
308
        {url_delete && (
309
          <li
310
            className="optionsTab__option"
15762 stevensc 311
            style={{ color: "red" }}
15761 stevensc 312
            onClick={() => {
15762 stevensc 313
              handleConfirmModalShow();
314
              modalActionUrl.current = url_delete;
15761 stevensc 315
            }}
316
          >
317
            <span className="optionsTab__option__icon">
318
              <i className="fa fa-trash"></i>
319
            </span>
320
            Eliminar grupo
321
          </li>
322
        )}
323
        {!!url_leave && (
324
          <li
325
            className="optionsTab__option"
15762 stevensc 326
            style={{ color: "red" }}
15761 stevensc 327
            onClick={() => {
15762 stevensc 328
              handleConfirmModalShow();
329
              modalActionUrl.current = url_leave;
15761 stevensc 330
            }}
331
          >
332
            <span className="optionsTab__option__icon">
333
              <i className="fa fa-user-times"></i>
334
            </span>
335
            Dejar grupo
336
          </li>
337
        )}
338
      </ul>
339
    ),
340
    conference: (
341
      <ul>
342
        <li className="optionsTab__option" onClick={displayConferenceModal}>
343
          <span className="optionsTab__option__icon">
344
            <i className="fa fa-user-plus" />
345
          </span>
346
          {CHAT_LABELS.CREATE_CONFERENCE}
347
        </li>
348
      </ul>
349
    ),
350
    addContacts: (
351
      <>
352
        {availableContactsToAdd.length ? (
353
          <EmptySection message={CHAT_LABELS.NOT_CONTACTS} align="left" />
354
        ) : (
355
          availableContactsToAdd.map(({ image, name, id }) => (
356
            <div className="addPersonToGroupTab__person" key={id}>
15762 stevensc 357
              <div className="d-inline-flex" style={{ gap: "5px" }}>
15761 stevensc 358
                <img
359
                  className="chat-image img-circle pull-left"
360
                  height="36"
361
                  width="36"
362
                  src={image}
363
                  alt="image-image"
364
                />
365
                <div className="name">{name}</div>
366
              </div>
367
              <span
368
                className="cursor-pointer"
369
                onClick={() => handleAddPersonToGroup(id)}
370
              >
371
                <i className="fa fa-plus-circle" />
372
              </span>
373
            </div>
374
          ))
375
        )}
376
      </>
377
    ),
378
    listContacts: (
379
      <>
380
        <div className="group__search">
381
          <SearchIcon />
382
          <input
383
            type="text"
384
            placeholder={CHAT_LABELS.SEARCH}
385
            onChange={(e) => setSearch(e.target.value)}
386
          />
387
        </div>
388
        {filtredGroupList.length ? (
389
          filtredGroupList.map(({ image, name, url_remove_from_group, id }) => {
390
            return (
391
              <div className="addPersonToGroupTab__person" key={id}>
15762 stevensc 392
                <div style={{ display: "flex", alignItems: "center" }}>
15761 stevensc 393
                  <img
394
                    className="chat-image img-circle pull-left"
395
                    height="36"
396
                    width="36"
397
                    src={image}
398
                    alt="image-image"
399
                  />
400
                  <div className="name">{name}</div>
401
                </div>
402
                {url_remove_from_group && (
403
                  <span
404
                    className="cursor-pointer"
405
                    onClick={() =>
406
                      handleDeletePersonFromGroup(url_remove_from_group)
407
                    }
408
                  >
409
                    <i className="fa fa-user-times" />
410
                  </span>
411
                )}
412
              </div>
15762 stevensc 413
            );
15761 stevensc 414
          })
415
        ) : (
416
          <div className="addPersonToGroupTab__person">
417
            {CHAT_LABELS.NOT_CONTACTS}
418
          </div>
419
        )}
420
      </>
421
    ),
15762 stevensc 422
  };
14581 stevensc 423
 
15761 stevensc 424
  // getMessageOnMaximize and subscribe to infinite Loader
425
  useEffect(async () => {
426
    const options = {
427
      root: null,
15762 stevensc 428
      rootMargin: "20px",
15761 stevensc 429
      treshold: 1.0,
15762 stevensc 430
    };
431
    const observer = new IntersectionObserver(handleObserver, options);
15761 stevensc 432
    if (!minimized) {
15762 stevensc 433
      await handleGetMessages();
15761 stevensc 434
      // loader observer
435
      if (loader.current) {
15762 stevensc 436
        observer.observe(loader.current);
15761 stevensc 437
      }
438
    }
439
    return () => {
440
      if (loader.current) {
15762 stevensc 441
        observer.unobserve(loader.current);
15761 stevensc 442
      }
15762 stevensc 443
    };
444
  }, [minimized]);
11350 nelberth 445
 
15761 stevensc 446
  // LoadMore on change page
447
  useEffect(() => {
15762 stevensc 448
    let loadMore = () => handleLoadMore();
449
    loadMore();
15761 stevensc 450
    return () => {
15762 stevensc 451
      loadMore = null;
452
    };
453
  }, [currentPage]);
11350 nelberth 454
 
15761 stevensc 455
  // getMessagesInterval
456
  useEffect(() => {
15762 stevensc 457
    if (window.location.pathname === "/group/my-groups") {
458
      const items = document.getElementsByClassName("sc-jSgupP");
15761 stevensc 459
      if (items && items.length > 0) {
15762 stevensc 460
        items[0].style.display = "none";
15761 stevensc 461
      }
462
    }
15762 stevensc 463
  }, [minimized]);
11350 nelberth 464
 
15761 stevensc 465
  useEffect(() => {
15762 stevensc 466
    let timer;
15761 stevensc 467
    if (!minimized && !loading) {
15762 stevensc 468
      timer = setTimeout(() => handleGetMessages(), 1000);
15761 stevensc 469
    }
470
    return () => {
15762 stevensc 471
      clearTimeout(timer);
472
    };
473
  }, [minimized, loading]);
11350 nelberth 474
 
15761 stevensc 475
  // useEffect for tabs changing
476
  useEffect(() => {
15762 stevensc 477
    if (optionTab === "addContacts") loadPersonsAvailable();
478
    if (optionTab === "listContacts") loadGroupContacts();
479
  }, [optionTab]);
11350 nelberth 480
 
15761 stevensc 481
  return (
482
    <>
483
      <div className="personal-chat">
15762 stevensc 484
        <div className={`chat-header ${not_seen_messages ? "notify" : ""}`}>
15761 stevensc 485
          <img src={image} alt="avatar-image" />
486
          <div className="info-content">
487
            <a href={profile} target="_blank" rel="noreferrer">
488
              {name}
489
            </a>
15762 stevensc 490
            {type === "user" && (
491
              <small className={online ? "online" : "offline"}>
492
                {online ? "En línea" : "Desconectado"}
15761 stevensc 493
              </small>
494
            )}
495
          </div>
496
          <div className="options ml-auto">
497
            <i
498
              className="cursor-pointer fa fa-gear"
499
              onClick={() =>
500
                showOptions(
15762 stevensc 501
                  type === "user" ? OPTIONS.CONFERENCE : OPTIONS.GROUP
15761 stevensc 502
                )
503
              }
504
            />
505
            <i
15762 stevensc 506
              className={"cursor-pointer fa fa-minus-circle"}
15761 stevensc 507
              onClick={handleActive}
508
            />
509
            <i
510
              className="cursor-pointer fa fa-times-circle"
511
              onClick={handleCloseChat}
512
            />
513
          </div>
514
        </div>
11350 nelberth 515
 
15761 stevensc 516
        <div
517
          className="panel-body"
15762 stevensc 518
          style={{ display: !minimized ? "block" : "none" }}
15761 stevensc 519
        >
520
          {optionTab ? (
521
            <StyledShowOptions>
522
              <span className="optionBack" onClick={() => showOptions()}>
523
                <i className="fa icon-arrow-left" />
524
              </span>
525
              <div className="optionsTab">{tabsOptions[optionTab]}</div>
526
            </StyledShowOptions>
527
          ) : (
528
            <>
529
              <ChatList
530
                messages={[...oldMessages, ...messages]}
531
                currentPage={currentPage}
532
                lastPage={lastPage}
533
                conversationList={conversationListEl}
534
                loader={loader}
535
              />
536
              <TextBox
537
                uploadUrl={url_upload}
538
                isNotSeen={not_seen_messages}
539
                markRead={() => onRead(entity)}
540
                onSend={sendMessage}
541
              />
542
            </>
543
          )}
544
        </div>
545
      </div>
546
      <ConfirmModal
547
        show={confirmModalShow}
548
        onClose={handleConfirmModalShow}
549
        onAccept={handleConfirmModalAccept}
550
      />
551
      <ConferenceModal
552
        show={showConferenceModal}
553
        timezones={timezones}
554
        zoomUrl={url_zoom}
555
        onCreate={() => {
15762 stevensc 556
          showOptions();
557
          displayConferenceModal();
15761 stevensc 558
        }}
559
      />
560
    </>
15762 stevensc 561
  );
562
};
11350 nelberth 563
 
15761 stevensc 564
const StyleModal = ({
15762 stevensc 565
  title = "Crea una conferencia",
566
  size = "md",
15761 stevensc 567
  show = false,
568
  children,
569
}) => {
15762 stevensc 570
  const [isShow, setIsShow] = useState(show);
11350 nelberth 571
 
15761 stevensc 572
  useEffect(() => {
15762 stevensc 573
    setIsShow(show);
574
  }, [show]);
11350 nelberth 575
 
15762 stevensc 576
  const closeModal = () => setIsShow(false);
11350 nelberth 577
 
15761 stevensc 578
  return (
15762 stevensc 579
    <Modal show={isShow} onHide={closeModal} style={{ overflowY: "scroll" }}>
15761 stevensc 580
      <Modal.Header closeButton>
581
        <Modal.Title>{title}</Modal.Title>
582
      </Modal.Header>
583
      <Modal.Body>{children}</Modal.Body>
584
    </Modal>
15762 stevensc 585
  );
586
};
11350 nelberth 587
 
15761 stevensc 588
export const ConferenceModal = ({
589
  show = false,
590
  timezones = {},
15762 stevensc 591
  zoomUrl = "",
15761 stevensc 592
  onCreate = () => null,
593
}) => {
15762 stevensc 594
  const dt = new Date();
595
  const { handleSubmit, register, errors, reset } = useForm({ mode: "all" });
15761 stevensc 596
  const [date, setDate] = useState({
15762 stevensc 597
    year: dt.toLocaleString("default", { year: "numeric" }),
598
    month: dt.toLocaleString("default", { month: "2-digit" }),
599
    day: dt.toLocaleString("default", { day: "2-digit" }),
600
  });
15761 stevensc 601
  const [time, setTime] = useState(
15762 stevensc 602
    dt.toLocaleString("es", {
603
      hour: "numeric",
604
      minute: "2-digit",
605
      second: "2-digit",
15761 stevensc 606
    })
15762 stevensc 607
  );
608
  const [coferenceType, setConferenceType] = useState(1);
609
  const dispatch = useDispatch();
11350 nelberth 610
 
15762 stevensc 611
  const handleChange = (value) => setConferenceType(value);
11350 nelberth 612
 
15761 stevensc 613
  const handleDateTime = (value) => {
614
    setDate({
615
      ...date,
15762 stevensc 616
      year: new Intl.DateTimeFormat("es", { year: "numeric" }).format(value),
617
      month: new Intl.DateTimeFormat("es", { month: "2-digit" }).format(value),
618
      day: new Intl.DateTimeFormat("es", { day: "2-digit" }).format(value),
619
    });
15761 stevensc 620
    setTime(
15762 stevensc 621
      new Intl.DateTimeFormat("es", {
622
        hour: "numeric",
623
        minute: "2-digit",
624
        second: "numeric",
15761 stevensc 625
      }).format(value)
15762 stevensc 626
    );
627
  };
11350 nelberth 628
 
15761 stevensc 629
  const onSubmit = async (data) => {
630
    try {
15762 stevensc 631
      const formData = new FormData();
15761 stevensc 632
 
633
      Object.entries(data).forEach(([key, value]) =>
634
        formData.append(key, value)
15762 stevensc 635
      );
636
      formData.append("date", `${date.year}-${date.month}-${date.day}`);
637
      formData.append("time", time);
15761 stevensc 638
 
15762 stevensc 639
      const { data: response } = await axios.post(zoomUrl, formData);
15761 stevensc 640
 
15762 stevensc 641
      if (!response.success && typeof response.data === "string") {
642
        dispatch(addNotification({ msg: response.data, style: "danger" }));
643
        return;
15761 stevensc 644
      }
645
 
15762 stevensc 646
      if (!response.success && typeof response.data === "object") {
15761 stevensc 647
        Object.entries(response.data).forEach(([key, value]) => {
648
          dispatch(
15762 stevensc 649
            addNotification({ msg: `${key}: ${value[0]}`, style: "danger" })
650
          );
651
        });
652
        return;
15761 stevensc 653
      }
654
 
15762 stevensc 655
      dispatch(addNotification({ msg: response.data, style: "success" }));
656
      onCreate();
657
      reset();
15761 stevensc 658
    } catch (error) {
15762 stevensc 659
      console.log(`Error: ${error.message}`);
15761 stevensc 660
      return dispatch(
15762 stevensc 661
        addNotification({ msg: "Ha ocurrido un error", style: "danger" })
662
      );
15761 stevensc 663
    }
15762 stevensc 664
  };
15761 stevensc 665
 
666
  return (
667
    <StyleModal title="Crea una conferencia" show={show}>
668
      <form onSubmit={handleSubmit(onSubmit)} autoComplete="new-password">
669
        <div className="form-group">
670
          <label htmlFor="first_name">Título</label>
671
          <input
672
            type="text"
673
            name="title"
674
            className="form-control"
675
            maxLength={128}
15762 stevensc 676
            ref={register({ required: "Por favor ingrese un título" })}
15761 stevensc 677
          />
678
          {errors.title && (
679
            <FormErrorFeedback>{errors.title.message}</FormErrorFeedback>
680
          )}
681
        </div>
682
        <div className="form-group">
683
          <label htmlFor="first_name">Descripción</label>
684
          <input
685
            type="text"
686
            name="description"
687
            className="form-control"
15762 stevensc 688
            ref={register({ required: "Por favor ingrese una descripción" })}
15761 stevensc 689
          />
690
          {errors.description && (
691
            <FormErrorFeedback>{errors.description.message}</FormErrorFeedback>
692
          )}
693
        </div>
694
        <div className="form-group">
695
          <label htmlFor="timezone">Tipo de conferencia</label>
696
          <select
697
            name="type"
698
            className="form-control"
699
            onChange={({ target }) => handleChange(target.value)}
700
            ref={register}
701
          >
702
            <option value="i">Inmediata</option>
703
            <option value="s">Programada</option>
704
          </select>
705
        </div>
15762 stevensc 706
        {coferenceType === "s" && (
15761 stevensc 707
          <div className="form-group">
708
            <label htmlFor="timezone">Horario</label>
709
            <Datetime
710
              dateFormat="DD-MM-YYYY"
711
              onChange={(e) => {
712
                if (e.toDate) {
15762 stevensc 713
                  handleDateTime(e.toDate());
15761 stevensc 714
                }
715
              }}
15762 stevensc 716
              inputProps={{ className: "form-control" }}
15761 stevensc 717
              initialValue={Date.parse(new Date())}
718
              closeOnSelect
719
            />
720
          </div>
721
        )}
722
        <div className="form-group">
723
          <label htmlFor="timezone">Zona horaria</label>
724
          <select
725
            className="form-control"
726
            name="timezone"
15762 stevensc 727
            ref={register({ required: "Por favor elige una Zona horaria" })}
15761 stevensc 728
          >
729
            <option value="" hidden>
730
              Zona horaria
731
            </option>
15766 stevensc 732
            {timezones &&
733
              Object.entries(timezones).map(([key, value]) => (
734
                <option value={key} key={key}>
735
                  {value}
736
                </option>
737
              ))}
15761 stevensc 738
          </select>
739
          {errors.timezone && (
740
            <FormErrorFeedback>{errors.timezone.message}</FormErrorFeedback>
741
          )}
742
        </div>
743
        <div className="form-group">
744
          <label htmlFor="timezone">Duración</label>
745
          <select className="form-control" name="duration" ref={register}>
746
            <option value={5}>5-min</option>
747
            <option value={10}>10-min</option>
748
            <option value={15}>15-min</option>
749
            <option value={20}>20-min</option>
750
            <option value={25}>25-min</option>
751
            <option value={30}>30-min</option>
752
            <option value={35}>35-min</option>
753
            <option value={40}>40-min</option>
754
            <option value={45}>45-min</option>
755
          </select>
756
        </div>
757
        <div className="form-group">
758
          <label htmlFor="first_name">Contraseña de ingreso</label>
759
          <input
760
            type="password"
761
            name="password"
762
            className="form-control"
763
            ref={register({
15762 stevensc 764
              required: "Por favor ingrese una contraseña",
15761 stevensc 765
              maxLength: {
766
                value: 6,
15762 stevensc 767
                message: "La contraseña debe tener al menos 6 digitos",
15761 stevensc 768
              },
769
            })}
770
          />
771
          {errors.password && (
772
            <FormErrorFeedback>{errors.password.message}</FormErrorFeedback>
773
          )}
774
        </div>
775
        <button className="btn btn-primary" type="submit">
776
          Crear
777
        </button>
778
      </form>
779
    </StyleModal>
15762 stevensc 780
  );
781
};
11350 nelberth 782
 
15762 stevensc 783
export default React.memo(PersonalChat);