Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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