Proyectos de Subversion LeadersLinked - SPA

Rev

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