Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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