Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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