Rev 6957 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { useEffect, useState } from 'react'
import { axios } from '../utils'
const useMessages = (messagesUrl) => {
const [oldMessages, setOldMessages] = useState([])
const [messages, setMessages] = useState([])
const [currentPage, setCurrentPage] = useState(1)
const [pages, setPages] = useState(1)
const [loading, setLoading] = useState(false)
const [loadingOld, setLoadingOld] = useState(false)
const getMessages = async () => {
setLoading(true)
axios
.get(messagesUrl)
.then(({ data: response }) => {
const { data, success } = response
if (!success) {
return
}
const messageResponse = [...data.items]
const updatedMessages = messageResponse.reduce(
(acum, updatedMessage) => {
if (
messages.findIndex(
(message) => message.id === updatedMessage.id
) === -1
) {
acum = [...acum, updatedMessage]
}
return acum
},
[]
)
if (updatedMessages.length > 0) {
setMessages((prevMessages) => [...updatedMessages, ...prevMessages])
setPages(data.pages)
}
})
.finally(() => setLoading(false))
}
const loadOldMessages = () => {
setLoadingOld(true)
axios
.get(`${messagesUrl}?page=${currentPage}`)
.then(({ data: response }) => {
const { data, success } = response
if (success && data.page > 1) {
setOldMessages([...oldMessages, ...data.items.slice()])
}
})
.finally(() => setLoadingOld(false))
}
const onIntersection = (entities) => {
const target = entities[0]
if (!target.isIntersecting || currentPage >= pages) {
return
}
setCurrentPage((prevState) => prevState + 1)
loadOldMessages()
}
const reset = () => {
setMessages([])
setOldMessages([])
setCurrentPage(1)
setPages(1)
}
useEffect(() => {
if (loading) return
const messagesInterval = setTimeout(() => {
getMessages()
}, 2000)
return () => {
clearTimeout(messagesInterval)
}
}, [loading])
return {
messages: [...messages, ...oldMessages],
loading: loadingOld,
loadMore: onIntersection,
reset,
}
}
export default useMessages