Proyectos de Subversion LeadersLinked - Backend

Rev

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