Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6966 | 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 }) => {
6963 stevensc 17
        const { data, success, pagination } = response
6956 stevensc 18
 
19
        if (!success) {
20
          return
21
        }
22
 
6961 stevensc 23
        const resMessages = data.items ? [...data.items] : [...data]
6963 stevensc 24
        const lastPage = pagination ? 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
 
6967 stevensc 38
        console.log(newMessages)
39
 
6961 stevensc 40
        if (!newMessages.length) {
41
          return
6956 stevensc 42
        }
6961 stevensc 43
 
44
        setMessages((prevMessages) => [...newMessages, ...prevMessages])
45
        setPages(lastPage)
6956 stevensc 46
      })
47
      .finally(() => setLoading(false))
48
  }
49
 
50
  const loadOldMessages = () => {
51
    setLoadingOld(true)
52
    axios
53
      .get(`${messagesUrl}?page=${currentPage}`)
54
      .then(({ data: response }) => {
6966 stevensc 55
        const { data, success, pagination } = response
56
 
57
        const page = pagination ? pagination.current : data.page
58
        const resMessages = data.items
59
          ? [...data.items.slice()]
60
          : [...data.slice()]
61
 
62
        if (success && page > 1) {
63
          setOldMessages([...oldMessages, ...resMessages])
6956 stevensc 64
        }
65
      })
6966 stevensc 66
      .finally(() => setTimeout(() => setLoadingOld(false), 1000))
6956 stevensc 67
  }
68
 
69
  const onIntersection = (entities) => {
70
    const target = entities[0]
71
 
6963 stevensc 72
    if (
73
      !target.isIntersecting ||
74
      currentPage >= pages ||
75
      loadingOld ||
76
      !pages
77
    ) {
6956 stevensc 78
      return
79
    }
80
 
81
    setCurrentPage((prevState) => prevState + 1)
82
    loadOldMessages()
83
  }
84
 
85
  const reset = () => {
86
    setMessages([])
87
    setOldMessages([])
88
    setCurrentPage(1)
89
    setPages(1)
90
  }
91
 
92
  useEffect(() => {
6957 stevensc 93
    if (loading || !messagesUrl) return
6956 stevensc 94
 
95
    const messagesInterval = setTimeout(() => {
96
      getMessages()
97
    }, 2000)
98
 
99
    return () => {
100
      clearTimeout(messagesInterval)
101
    }
6957 stevensc 102
  }, [loading, messagesUrl])
6956 stevensc 103
 
104
  return {
105
    messages: [...messages, ...oldMessages],
106
    loading: loadingOld,
107
    loadMore: onIntersection,
108
    reset,
109
  }
110
}
111
 
112
export default useMessages