Proyectos de Subversion LeadersLinked - SPA

Rev

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
  }
}