Rev 2798 | 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, loading, 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 },
loading,
updateTotalShare,
addComment,
updateReactions,
updateMyReaction,
};
}