Rev 3416 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { useEffect, useState } from 'react'
import { useDispatch } from 'react-redux'
import { axios } from '@app/utils'
import { useFetch } from '@hooks'
import { addNotification } from '@app/redux/notification/notification.actions'
export function usePosts(postUrl) {
const { data: post, isLoading, mutate } = useFetch(postUrl)
const [comments, setComments] = useState([])
const dispatch = useDispatch()
const getComments = (url) => {
axios.get(url).then((response) => {
const { data, success } = response.data
if (!success) {
const errorMessage =
typeof data === 'string' ? data : 'Error interno. Intente más tarde.'
dispatch(addNotification({ style: 'danger', msg: errorMessage }))
return
}
setComments(data)
})
}
const updateTotalShare = (value) => {
mutate((prevPost) => ({
...prevPost,
total_share_external: value
}))
}
const updateReactions = (reactions) => {
mutate((prevPost) => ({ ...prevPost, reactions }))
}
const updateMyReaction = (reaction) => {
mutate((prevPost) => ({ ...prevPost, my_reaction: reaction }))
}
const addComment = (comment) => {
const formData = new FormData()
formData.append('comment', comment)
axios
.post(post.comments_add_url, formData)
.then((response) => {
const { success, data } = response.data
if (!success) {
const errorMessage =
typeof data === 'string'
? data
: 'Error interno. Intente más tarde.'
throw new Error(errorMessage)
}
setComments((prevComments) => [...prevComments, data])
})
.catch((error) => {
dispatch(addNotification({ style: 'danger', msg: error.message }))
})
}
useEffect(() => {
if (post.comments_url) getComments(post.comments_url)
}, [post])
return {
post: { ...post, comments },
isLoading,
updateTotalShare,
addComment,
updateReactions,
updateMyReaction
}
}