Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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