Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
6956 stevensc 1
import { useEffect, useState } from 'react'
2
import { axios } from '../utils'
3
 
4
const useMessages = (messagesUrl) => {
5
  const [oldMessages, setOldMessages] = useState([])
6
  const [messages, setMessages] = useState([])
7
  const [currentPage, setCurrentPage] = useState(1)
8
  const [pages, setPages] = useState(1)
9
  const [loading, setLoading] = useState(false)
10
  const [loadingOld, setLoadingOld] = useState(false)
11
 
12
  const getMessages = async () => {
13
    setLoading(true)
14
    axios
15
      .get(messagesUrl)
16
      .then(({ data: response }) => {
17
        const { data, success } = response
18
 
19
        if (!success) {
20
          return
21
        }
22
 
23
        const messageResponse = [...data.items]
24
        const updatedMessages = messageResponse.reduce(
25
          (acum, updatedMessage) => {
26
            if (
27
              messages.findIndex(
28
                (message) => message.id === updatedMessage.id
29
              ) === -1
30
            ) {
31
              acum = [...acum, updatedMessage]
32
            }
33
            return acum
34
          },
35
          []
36
        )
37
 
38
        if (updatedMessages.length > 0) {
39
          setMessages((prevMessages) => [...updatedMessages, ...prevMessages])
40
          setPages(data.pages)
41
        }
42
      })
43
      .finally(() => setLoading(false))
44
  }
45
 
46
  const loadOldMessages = () => {
47
    setLoadingOld(true)
48
    axios
49
      .get(`${messagesUrl}?page=${currentPage}`)
50
      .then(({ data: response }) => {
51
        const { data, success } = response
52
        if (success && data.page > 1) {
53
          setOldMessages([...oldMessages, ...data.items.slice()])
54
        }
55
      })
56
      .finally(() => setLoadingOld(false))
57
  }
58
 
59
  const onIntersection = (entities) => {
60
    const target = entities[0]
61
 
6958 stevensc 62
    if (!target.isIntersecting || currentPage >= pages || loadingOld) {
6956 stevensc 63
      return
64
    }
65
 
66
    setCurrentPage((prevState) => prevState + 1)
67
    loadOldMessages()
68
  }
69
 
70
  const reset = () => {
71
    setMessages([])
72
    setOldMessages([])
73
    setCurrentPage(1)
74
    setPages(1)
75
  }
76
 
77
  useEffect(() => {
6957 stevensc 78
    if (loading || !messagesUrl) return
6956 stevensc 79
 
80
    const messagesInterval = setTimeout(() => {
81
      getMessages()
82
    }, 2000)
83
 
84
    return () => {
85
      clearTimeout(messagesInterval)
86
    }
6957 stevensc 87
  }, [loading, messagesUrl])
6956 stevensc 88
 
89
  return {
90
    messages: [...messages, ...oldMessages],
91
    loading: loadingOld,
92
    loadMore: onIntersection,
93
    reset,
94
  }
95
}
96
 
97
export default useMessages