Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6958 | Rev 6963 | 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
 
6961 stevensc 23
        const resMessages = data.items ? [...data.items] : [...data]
24
        const lastPage = data.pagination ? data.pagination.last : data.pages
6956 stevensc 25
 
6961 stevensc 26
        const newMessages = resMessages.reduce((acum, newMessage) => {
27
          const messageIndex = newMessage.id
28
            ? messages.findIndex(({ id }) => id === newMessage.id)
29
            : messages.findIndex(({ uuid }) => uuid === newMessage.uuid)
30
 
31
          if (messageIndex === -1) {
32
            acum = [...acum, newMessage]
33
          }
34
 
35
          return acum
36
        }, [])
37
 
38
        if (!newMessages.length) {
39
          return
6956 stevensc 40
        }
6961 stevensc 41
 
42
        setMessages((prevMessages) => [...newMessages, ...prevMessages])
43
        setPages(lastPage)
6956 stevensc 44
      })
45
      .finally(() => setLoading(false))
46
  }
47
 
48
  const loadOldMessages = () => {
49
    setLoadingOld(true)
50
    axios
51
      .get(`${messagesUrl}?page=${currentPage}`)
52
      .then(({ data: response }) => {
53
        const { data, success } = response
54
        if (success && data.page > 1) {
55
          setOldMessages([...oldMessages, ...data.items.slice()])
56
        }
57
      })
58
      .finally(() => setLoadingOld(false))
59
  }
60
 
61
  const onIntersection = (entities) => {
62
    const target = entities[0]
63
 
6958 stevensc 64
    if (!target.isIntersecting || currentPage >= pages || loadingOld) {
6956 stevensc 65
      return
66
    }
67
 
68
    setCurrentPage((prevState) => prevState + 1)
69
    loadOldMessages()
70
  }
71
 
72
  const reset = () => {
73
    setMessages([])
74
    setOldMessages([])
75
    setCurrentPage(1)
76
    setPages(1)
77
  }
78
 
79
  useEffect(() => {
6957 stevensc 80
    if (loading || !messagesUrl) return
6956 stevensc 81
 
82
    const messagesInterval = setTimeout(() => {
83
      getMessages()
84
    }, 2000)
85
 
86
    return () => {
87
      clearTimeout(messagesInterval)
88
    }
6957 stevensc 89
  }, [loading, messagesUrl])
6956 stevensc 90
 
91
  return {
92
    messages: [...messages, ...oldMessages],
93
    loading: loadingOld,
94
    loadMore: onIntersection,
95
    reset,
96
  }
97
}
98
 
99
export default useMessages