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
 
1729 stevensc 13
  function getDiff(arr1 = [], arr2 = []) {
1759 stevensc 14
    if (arr1.length !== arr2.length) return true
1729 stevensc 15
    const set = new Set(arr1.map((obj) => obj.uuid))
1734 stevensc 16
    return !arr2.every((obj) => set.has(obj.uuid))
1723 stevensc 17
  }
18
 
1718 stevensc 19
  const heartBeat = async (url) => {
20
    setLoading(true)
21
    try {
22
      const results = await getConversations(url)
1729 stevensc 23
      const diff = getDiff(conversations, results)
1734 stevensc 24
      if (!conversations.length || diff) setConversations(results)
1718 stevensc 25
    } catch (error) {
26
      dispatch(addNotification({ style: 'danger', msg: error.message }))
27
    } finally {
28
      setLoading(false)
29
    }
30
  }
31
 
32
  const setConversation = (conversation) => {
33
    setCurrentConversation(conversation)
34
  }
35
 
36
  useEffect(() => {
37
    const conversationsInterval = setInterval(() => {
1720 stevensc 38
      heartBeat(url)
1718 stevensc 39
    }, 2000)
40
 
41
    return () => {
42
      clearInterval(conversationsInterval)
43
    }
1725 stevensc 44
  }, [url, conversations])
1718 stevensc 45
 
46
  return {
47
    conversations,
48
    currentConversation,
49
    setConversation,
50
    loading
51
  }
52
}