Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2798 | Rev 3432 | 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,
  };
}