Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6952 | Rev 6956 | 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'
6910 stevensc 10
 
11
const CHAT_TABS = {
12
  CHAT: 'CHAT',
13
  DEFAULT: 'DEFAULT',
14
  GROUP_MEMBERS: 'GROUP_MEMBERS',
15
  ADD_GROUP_MEMBER: 'ADD_GROUP_MEMBER',
16
}
17
 
6911 stevensc 18
const ChatBox = ({ entity, changeTab }) => {
6910 stevensc 19
  const {
20
    url_get_all_messages,
21
    url_mark_received,
22
    not_received_messages,
23
    not_seen_messages,
24
    url_zoom,
25
    url_send,
26
    url_upload,
27
    url_mark_seen,
28
    url_close,
29
    url_add_user_to_group, // Group url
30
    url_delete, // Group url
31
    url_get_contact_group_list, // Group url
32
    url_leave, // Group url
33
    name,
34
    profile,
35
    type,
36
  } = entity
37
 
38
  const [oldMessages, setOldMessages] = useState([])
39
  const [newMessages, setNewMessages] = useState([])
40
  const [currentPage, setCurrentPage] = useState(1)
41
  const [pages, setPages] = useState(1)
42
 
43
  const [isShowConferenceModal, setisShowConferenceModal] = useState(false)
6911 stevensc 44
  const [loading, setLoading] = useState(false)
6910 stevensc 45
 
46
  const [isGetting, setIsGetting] = useState(false)
47
  const dispatch = useDispatch()
48
  const scrollRef = useRef(null)
49
 
50
  // Messages getters
51
  const getMessages = async () => {
52
    setLoading(true)
53
    axios
54
      .get(url_get_all_messages)
55
      .then(({ data: response }) => {
56
        const { data, success } = response
57
 
58
        if (!success) {
59
          return
60
        }
61
 
6923 stevensc 62
        const messageResponse = [...data.items]
6910 stevensc 63
        const updatedMessages = messageResponse.reduce(
64
          (acum, updatedMessage) => {
65
            if (
66
              newMessages.findIndex(
67
                (message) => message.id === updatedMessage.id
68
              ) === -1
69
            ) {
70
              acum = [...acum, updatedMessage]
71
            }
72
            return acum
73
          },
74
          []
75
        )
76
 
77
        if (updatedMessages.length > 0) {
78
          setNewMessages((prevMessages) => [
6924 stevensc 79
            ...updatedMessages,
6910 stevensc 80
            ...prevMessages,
81
          ])
82
          setPages(data.pages)
83
          scrollRef.current.scrollBy(0, 200)
84
        }
85
      })
86
      .finally(() => setLoading(false))
87
  }
88
 
89
  const loadOldMessages = () => {
90
    setIsGetting(true)
91
    axios
92
      .get(`${url_get_all_messages}?page=${currentPage}`)
93
      .then(({ data: response }) => {
94
        const { data, success } = response
95
        if (success && data.page > 1) {
6924 stevensc 96
          setOldMessages([...oldMessages, ...data.items.slice()])
6910 stevensc 97
          scrollRef.current.scrollBy(0, 200)
98
        }
99
      })
100
      .finally(() => setIsGetting(false))
101
  }
102
 
103
  // Modals handlers
104
 
105
  const toggleConferenceModal = () => {
106
    setisShowConferenceModal(!isShowConferenceModal)
107
  }
108
 
109
  // On interception handler
110
  const onIntersection = (entities) => {
111
    const target = entities[0]
112
    if (target.isIntersecting && currentPage < pages) {
113
      setIsGetting(true)
114
      setCurrentPage((prevState) => prevState + 1)
115
    }
116
  }
117
 
118
  const deleteGroup = async (url) => {
119
    setLoading(true)
120
    axios
121
      .post(url)
122
      .then(({ data: response }) => {
123
        const { data, success } = response
124
        if (!success) {
125
          const errorMessage =
126
            typeof data.data === 'string' ? data.data : 'Ha ocurrido un error'
127
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
128
          return
129
        }
130
 
131
        changeTab(CHAT_TABS.DEFAULT)
132
      })
133
      .finally(() => setLoading(false))
134
  }
135
 
136
  const options = [
137
    {
138
      url: url_zoom,
139
      label: 'Crear Conferencia',
140
      action: toggleConferenceModal,
141
    },
142
  ]
143
 
144
  const groupOptions = [
145
    {
146
      url: url_zoom,
147
      label: 'Crear Conferencia',
148
      action: toggleConferenceModal,
149
    },
150
    {
151
      url: url_get_contact_group_list,
152
      label: 'Integrantes',
153
      action: () => changeTab(CHAT_TABS.GROUP_MEMBERS),
154
    },
155
    {
156
      url: url_add_user_to_group,
157
      label: 'Agregar Contactos',
158
      action: () => changeTab(CHAT_TABS.ADD_GROUP_MEMBER),
159
    },
160
    {
161
      url: url_delete,
162
      label: 'Eliminar Grupo',
163
      action: () => deleteGroup(url_delete),
164
    },
165
    {
166
      url: url_leave,
167
      label: 'Dejar Grupo',
168
      action: () => deleteGroup(url_leave),
169
    },
170
  ]
171
 
172
  useEffect(() => {
173
    let getInterval = null
174
    if (loading) return
175
    getInterval = setTimeout(() => getMessages(), 2000)
176
 
177
    return () => {
178
      clearTimeout(getInterval)
179
    }
180
  }, [loading])
181
 
182
  useEffect(() => {
183
    loadOldMessages()
184
  }, [currentPage])
185
 
186
  useEffect(() => {
187
    if (not_seen_messages) axios.post(url_mark_seen)
188
    if (not_received_messages) axios.post(url_mark_received)
189
 
190
    return () => {
191
      axios.post(url_close)
192
    }
6954 stevensc 193
  }, [entity])
6910 stevensc 194
 
195
  useEffect(() => {
196
    setNewMessages([])
197
    setOldMessages([])
198
    setPages(1)
199
    setCurrentPage(1)
200
  }, [entity])
201
 
202
  return (
203
    <>
6911 stevensc 204
      <Chat>
205
        <Chat.Header
206
          onClose={() => changeTab(CHAT_TABS.DEFAULT)}
6910 stevensc 207
          options={type === 'group' ? groupOptions : options}
6911 stevensc 208
        >
209
          <Chat.Title url={profile}>{name}</Chat.Title>
210
        </Chat.Header>
211
 
6910 stevensc 212
        {![...newMessages, ...oldMessages].length ? (
6911 stevensc 213
          <EmptySection
214
            Icon={<InboxIcon />}
215
            message="No hay mensajes en esta conversación"
6927 stevensc 216
            align="center"
6911 stevensc 217
          />
6910 stevensc 218
        ) : (
6911 stevensc 219
          <Chat.List
6925 stevensc 220
            messages={[...newMessages, ...oldMessages]}
6911 stevensc 221
            onPagination={onIntersection}
222
            currentPage={currentPage}
223
            loading={isGetting}
224
            pages={pages}
6910 stevensc 225
            scrollRef={scrollRef}
226
          />
227
        )}
6911 stevensc 228
 
229
        <Chat.SubmitForm
230
          sendUrl={url_send}
231
          uploadUrl={url_upload}
232
          onSubmit={() => scrollToBottom(scrollRef)}
6910 stevensc 233
        />
6911 stevensc 234
      </Chat>
6952 stevensc 235
      <ConferenceModal
6911 stevensc 236
        show={isShowConferenceModal}
237
        zoomUrl={url_zoom}
6954 stevensc 238
        onClose={toggleConferenceModal}
6952 stevensc 239
      />
6910 stevensc 240
    </>
241
  )
242
}
243
 
244
export default ChatBox