Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
6910 stevensc 1
import React, { useEffect, useRef, useState } from 'react'
6911 stevensc 2
import { axios, scrollToBottom } from '../../utils'
6910 stevensc 3
import { useDispatch } from 'react-redux'
6911 stevensc 4
import { addNotification } from '../../redux/notification/notification.actions'
5
import InboxIcon from '@mui/icons-material/Inbox'
6910 stevensc 6
 
6911 stevensc 7
import Chat from './Chat'
8
import EmptySection from '../UI/EmptySection'
6952 stevensc 9
import ConferenceModal from '../modals/ConferenceModal'
6956 stevensc 10
import useMessages from '../../hooks/useMessages'
7245 stevensc 11
import ConfirmModal from '../modals/ConfirmModal'
6910 stevensc 12
 
13
const CHAT_TABS = {
14
  CHAT: 'CHAT',
15
  DEFAULT: 'DEFAULT',
16
  GROUP_MEMBERS: 'GROUP_MEMBERS',
17
  ADD_GROUP_MEMBER: 'ADD_GROUP_MEMBER',
18
}
19
 
6911 stevensc 20
const ChatBox = ({ entity, changeTab }) => {
6910 stevensc 21
  const {
22
    url_get_all_messages,
23
    url_mark_received,
24
    not_received_messages,
25
    not_seen_messages,
26
    url_zoom,
27
    url_send,
28
    url_upload,
29
    url_mark_seen,
6956 stevensc 30
    // url_close,
6910 stevensc 31
    url_add_user_to_group, // Group url
32
    url_delete, // Group url
33
    url_get_contact_group_list, // Group url
34
    url_leave, // Group url
35
    name,
36
    profile,
37
  } = entity
38
 
6956 stevensc 39
  const { messages, loadMore, loading, reset } =
40
    useMessages(url_get_all_messages)
6910 stevensc 41
  const [isShowConferenceModal, setisShowConferenceModal] = useState(false)
7245 stevensc 42
  const [isShowConfirmModal, setisShowConfirmModal] = useState(false)
7254 stevensc 43
  const [options, setOptions] = useState([])
6910 stevensc 44
  const scrollRef = useRef(null)
7245 stevensc 45
  const actionUrl = useRef('')
7254 stevensc 46
  const dispatch = useDispatch()
6910 stevensc 47
 
7245 stevensc 48
  const toggleConfirmModal = () => {
49
    setisShowConfirmModal(!isShowConfirmModal)
50
  }
51
 
6910 stevensc 52
  const toggleConferenceModal = () => {
53
    setisShowConferenceModal(!isShowConferenceModal)
54
  }
55
 
56
  const deleteGroup = async (url) => {
6956 stevensc 57
    axios.post(url).then(({ data: response }) => {
58
      const { data, success } = response
59
      if (!success) {
60
        const errorMessage =
61
          typeof data.data === 'string' ? data.data : 'Ha ocurrido un error'
62
        dispatch(addNotification({ style: 'danger', msg: errorMessage }))
63
        return
64
      }
6910 stevensc 65
 
6956 stevensc 66
      changeTab(CHAT_TABS.DEFAULT)
67
    })
6910 stevensc 68
  }
69
 
7245 stevensc 70
  useEffect(() => {
7258 stevensc 71
    if (not_seen_messages) axios.post(url_mark_seen)
72
    if (not_received_messages) axios.post(url_mark_received)
73
    if (options.length) setOptions([])
74
    reset()
75
  }, [entity])
76
 
77
  useEffect(() => {
7254 stevensc 78
    if (url_leave) {
7257 stevensc 79
      setOptions((prevOptions) =>
80
        prevOptions.concat({
7254 stevensc 81
          url: url_leave,
82
          label: 'Dejar Grupo',
83
          action: () => {
84
            toggleConfirmModal()
85
            actionUrl.current = url_leave
86
          },
7257 stevensc 87
        })
88
      )
7245 stevensc 89
    }
7254 stevensc 90
    if (url_delete) {
7257 stevensc 91
      setOptions((prevOptions) =>
92
        prevOptions.concat({
7254 stevensc 93
          url: url_delete,
94
          label: 'Eliminar Grupo',
95
          action: () => {
96
            toggleConfirmModal()
97
            actionUrl.current = url_delete
98
          },
7257 stevensc 99
        })
100
      )
7245 stevensc 101
    }
7254 stevensc 102
    if (url_get_contact_group_list) {
7257 stevensc 103
      setOptions((prevOptions) =>
104
        prevOptions.concat({
7254 stevensc 105
          url: url_get_contact_group_list,
106
          label: 'Integrantes',
107
          action: () => changeTab(CHAT_TABS.GROUP_MEMBERS),
7257 stevensc 108
        })
109
      )
7245 stevensc 110
    }
7254 stevensc 111
    if (url_add_user_to_group) {
7257 stevensc 112
      setOptions((prevOptions) =>
113
        prevOptions.concat({
7254 stevensc 114
          url: url_add_user_to_group,
115
          label: 'Agregar Contactos',
116
          action: () => changeTab(CHAT_TABS.ADD_GROUP_MEMBER),
7257 stevensc 117
        })
118
      )
7245 stevensc 119
    }
7254 stevensc 120
    if (url_zoom) {
7257 stevensc 121
      setOptions((prevOptions) =>
122
        prevOptions.concat({
7254 stevensc 123
          url: url_zoom,
124
          label: 'Crear Conferencia',
125
          action: toggleConferenceModal,
7257 stevensc 126
        })
127
      )
7245 stevensc 128
    }
7248 stevensc 129
  }, [entity])
6910 stevensc 130
 
131
  return (
132
    <>
6911 stevensc 133
      <Chat>
134
        <Chat.Header
135
          onClose={() => changeTab(CHAT_TABS.DEFAULT)}
7255 stevensc 136
          options={options}
6911 stevensc 137
        >
138
          <Chat.Title url={profile}>{name}</Chat.Title>
139
        </Chat.Header>
140
 
6956 stevensc 141
        {!messages.length ? (
6911 stevensc 142
          <EmptySection
143
            Icon={<InboxIcon />}
144
            message="No hay mensajes en esta conversación"
6927 stevensc 145
            align="center"
6911 stevensc 146
          />
6910 stevensc 147
        ) : (
6911 stevensc 148
          <Chat.List
6956 stevensc 149
            messages={messages}
150
            onPagination={loadMore}
151
            loading={loading}
6910 stevensc 152
            scrollRef={scrollRef}
153
          />
154
        )}
6911 stevensc 155
 
156
        <Chat.SubmitForm
157
          sendUrl={url_send}
158
          uploadUrl={url_upload}
159
          onSubmit={() => scrollToBottom(scrollRef)}
6910 stevensc 160
        />
6911 stevensc 161
      </Chat>
6952 stevensc 162
      <ConferenceModal
6911 stevensc 163
        show={isShowConferenceModal}
164
        zoomUrl={url_zoom}
6954 stevensc 165
        onClose={toggleConferenceModal}
6952 stevensc 166
      />
7245 stevensc 167
      <ConfirmModal
168
        show={isShowConfirmModal}
169
        onClose={toggleConfirmModal}
170
        onAccept={() => deleteGroup(actionUrl.current)}
171
      />
6910 stevensc 172
    </>
173
  )
174
}
175
 
176
export default ChatBox