Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3710 stevensc 1
/* eslint-disable react/prop-types */
5242 stevensc 2
import React, { useEffect, useRef, useState } from 'react'
5185 stevensc 3
import EmptySection from '../../shared/empty-section/EmptySection'
4
import MessageBox from './MessageBox'
5
import MessageTemplate from './MessageTemplate'
6
import SpeakerNotesOffRoundedIcon from '@mui/icons-material/SpeakerNotesOffRounded'
7
import QuestionAnswerRoundedIcon from '@mui/icons-material/QuestionAnswerRounded'
5239 stevensc 8
import { useDispatch } from 'react-redux'
5246 stevensc 9
import { fetchMessages, getMessagesDifferences } from '../../services/chat'
5239 stevensc 10
import { addNotification } from '../../redux/notification/notification.actions'
11
import { axios, scrollToBottom } from '../../utils'
12
import { ArrowLeft } from '@mui/icons-material'
1 www 13
 
5239 stevensc 14
const DEFAULT_PAGES = { current: 1, last: 1 }
15
 
3074 stevensc 16
const Chatmail = ({
5185 stevensc 17
  selectedConversation = null,
5239 stevensc 18
  setConversation = () => null
1741 stevensc 19
}) => {
5239 stevensc 20
  const [oldMessages, setOldMessages] = useState([])
21
  const [messages, setMessages] = useState([])
22
  const [pages, setPages] = useState(DEFAULT_PAGES)
23
  const [loading, setLoading] = useState(false)
5185 stevensc 24
  const lastMessage = useRef(null)
5239 stevensc 25
  const dispatch = useDispatch()
835 stevensc 26
 
5240 stevensc 27
  const getMessages = async (url = '', page = pages.current) => {
5239 stevensc 28
    try {
29
      setLoading(true)
30
      const response = await fetchMessages(url, page)
31
      if (!response.success) {
32
        const errorMessage = response.data
33
 
34
        dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))
35
        return
36
      }
37
 
5247 stevensc 38
      if (response.pagination.current > 1) setOldMessages([...response.data, ...oldMessages])
39
      setPages((prevPages) => ({ ...prevPages, last: response.pagination.last }))
5239 stevensc 40
 
5247 stevensc 41
      return
42
    } catch (error) {
43
      const errorMessage = new Error(error)
44
      console.log('Request canceled', errorMessage)
45
    } finally {
46
      setLoading(false)
47
    }
48
  }
49
 
50
  const hearBeat = async () => {
51
    try {
52
      setLoading(true)
53
      const response = await fetchMessages(selectedConversation.messages_link, 1)
54
 
55
      if (!response.success) {
56
        const errorMessage = response.data
57
 
58
        dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))
59
        return
5239 stevensc 60
      }
61
 
5247 stevensc 62
      const newMessages = getMessagesDifferences(messages, response.data)
63
 
5239 stevensc 64
      if (newMessages.length) {
65
        setMessages([...messages, ...newMessages])
66
        scrollToBottom()
67
      } else {
68
        setMessages(response.data)
69
      }
70
 
71
      setPages((prevPages) => ({ ...prevPages, last: response.pagination.last }))
72
    } catch (error) {
73
      const errorMessage = new Error(error)
74
      console.log('Request canceled', errorMessage)
75
    } finally {
76
      setLoading(false)
77
    }
78
  }
79
 
80
  const handleSend = async (sendUrl = '', message = {}) => {
81
    try {
82
      const formData = new FormData()
83
 
84
      Object.entries(message).forEach(([key, value]) => formData.append(key, value))
85
 
86
      const { data: response } = await axios.post(sendUrl, formData)
87
      setMessages(prev => [response.data, ...prev])
88
    } catch (error) {
89
      const errorMessage = new Error(error)
90
      dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))
91
    }
92
  }
93
 
94
  const loadMore = async () => {
95
    setPages((prevPages) => ({ ...prevPages, current: prevPages.current + 1 }))
96
  }
97
 
5185 stevensc 98
  useEffect(() => {
5247 stevensc 99
    if (!loading && selectedConversation) setTimeout(() => hearBeat(), 3000)
5239 stevensc 100
  }, [loading, selectedConversation])
101
 
5242 stevensc 102
  useEffect(() => {
5247 stevensc 103
    setPages(DEFAULT_PAGES)
104
  }, [selectedConversation])
105
 
106
  useEffect(() => {
107
    if (selectedConversation) getMessages(selectedConversation?.messages_link, pages.current)
5239 stevensc 108
  }, [pages.current])
109
 
5242 stevensc 110
  useEffect(() => {
5197 stevensc 111
    const observer = new IntersectionObserver(([entry]) => {
112
      if (entry.isIntersecting) {
5239 stevensc 113
        loadMore()
5246 stevensc 114
        lastMessage.current.scrollTop += 100
5197 stevensc 115
      }
116
    })
117
 
5242 stevensc 118
    if (lastMessage.current) observer.observe(lastMessage.current)
5197 stevensc 119
  }, [messages])
917 stevensc 120
 
5185 stevensc 121
  if (!selectedConversation) {
5187 stevensc 122
    return <EmptySection message={LABELS.SELECT_CONVERSATION} Icon={<QuestionAnswerRoundedIcon/>} />
5185 stevensc 123
  }
124
 
125
  return (
126
    <div className='chat'>
5247 stevensc 127
      <span className='icon-hide' onClick={() => setConversation(null)}>
5239 stevensc 128
        <ArrowLeft />
129
        {LABELS.RETURN}
130
      </span>
5185 stevensc 131
      <a href={selectedConversation.profile}>
132
        <h2 className='chat-header'>{selectedConversation.name}</h2>
133
      </a>
134
      <div className="messages-line">
135
        {messages.length
5239 stevensc 136
          ? [...oldMessages, ...messages].map((element, index) =>
5185 stevensc 137
            <MessageTemplate
138
              key={index}
139
              message={element}
140
              date={element.date}
141
            />)
5187 stevensc 142
          : <EmptySection message={LABELS.NO_MESSAGE_CONVERSATION} Icon={<SpeakerNotesOffRoundedIcon/>} />
876 stevensc 143
        }
5246 stevensc 144
        {pages.current < pages.last && <hr ref={lastMessage} style={{ visibility: 'hidden' }} />}
5185 stevensc 145
      </div>
5239 stevensc 146
      <MessageBox onSend={handleSend} sendUrl={selectedConversation.send_link}/>
5185 stevensc 147
    </div>
148
  )
3074 stevensc 149
}
150
 
5185 stevensc 151
export default Chatmail