Proyectos de Subversion LeadersLinked - SPA

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1718 stevensc 1
import { useEffect, useState } from 'react'
2
import { useDispatch } from 'react-redux'
3
 
4
import { getConversations } from '@app/services/chats'
5
import { addNotification } from '@app/redux/notification/notification.actions'
6
 
7
export default function useConversations(url) {
8
  const [conversations, setConversations] = useState([])
9
  const [currentConversation, setCurrentConversation] = useState(null)
10
  const [loading, setLoading] = useState(false)
11
  const dispatch = useDispatch()
12
 
1765 stevensc 13
  function mergeConversations(arr1 = [], arr2 = []) {
14
    const mergedArr = [...arr1, ...arr2]
15
    const idsSet = new Set(mergedArr.map((obj) => obj.uuid))
16
    const diff = mergedArr.filter((obj) => idsSet.has(obj.uuid))
17
    return diff
1723 stevensc 18
  }
19
 
1718 stevensc 20
  const heartBeat = async (url) => {
21
    setLoading(true)
22
    try {
23
      const results = await getConversations(url)
1765 stevensc 24
      const newConversations = mergeConversations(conversations, results)
25
      setConversations(newConversations)
1718 stevensc 26
    } catch (error) {
27
      dispatch(addNotification({ style: 'danger', msg: error.message }))
28
    } finally {
29
      setLoading(false)
30
    }
31
  }
32
 
33
  const setConversation = (conversation) => {
34
    setCurrentConversation(conversation)
35
  }
36
 
37
  useEffect(() => {
38
    const conversationsInterval = setInterval(() => {
1720 stevensc 39
      heartBeat(url)
1718 stevensc 40
    }, 2000)
41
 
42
    return () => {
43
      clearInterval(conversationsInterval)
44
    }
1725 stevensc 45
  }, [url, conversations])
1718 stevensc 46
 
47
  return {
48
    conversations,
49
    currentConversation,
50
    setConversation,
51
    loading
52
  }
53
}