Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2190 | Rev 2774 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
2191 stevensc 1
import { useEffect, useState } from 'react'
2190 stevensc 2
import { useDispatch } from 'react-redux'
3
 
4
import { axios } from '@app/utils'
5
import { addNotification } from '@app/redux/notification/notification.actions'
6
import useFetch from './useFetch'
7
 
8
export default function usePosts(postUrl) {
9
  const { data: post, isLoading, mutate } = useFetch(postUrl)
2191 stevensc 10
  const [comments, setComments] = useState([])
2190 stevensc 11
 
12
  const dispatch = useDispatch()
13
 
14
  const getComments = (url) => {
15
    axios.get(url).then((response) => {
16
      const { data, success } = response.data
17
 
18
      if (!success) {
19
        const errorMessage =
20
          typeof data === 'string' ? data : 'Error interno. Intente más tarde.'
21
 
22
        dispatch(addNotification({ style: 'danger', msg: errorMessage }))
23
        return
24
      }
25
 
2191 stevensc 26
      setComments(data)
2190 stevensc 27
    })
28
  }
29
 
30
  const updateTotalShare = (value) => {
31
    mutate((prevPost) => ({
32
      ...prevPost,
33
      total_share_external: value
34
    }))
35
  }
36
 
37
  const updateReactions = (reactions) => {
38
    mutate((prevPost) => ({ ...prevPost, reactions }))
39
  }
40
 
41
  const updateMyReaction = (reaction) => {
42
    mutate((prevPost) => ({ ...prevPost, my_reaction: reaction }))
43
  }
44
 
45
  const addComment = (comment) => {
46
    const formData = new FormData()
47
    formData.append('comment', comment)
48
 
49
    axios
50
      .post(post.comments_add_url, formData)
51
      .then((response) => {
52
        const { success, data } = response.data
53
 
54
        if (!success) {
55
          const errorMessage =
56
            typeof data === 'string'
57
              ? data
58
              : 'Error interno. Intente más tarde.'
59
          throw new Error(errorMessage)
60
        }
61
 
2191 stevensc 62
        setComments((prevComments) => [...prevComments, data])
2190 stevensc 63
      })
64
      .catch((error) => {
65
        dispatch(addNotification({ style: 'danger', msg: error.message }))
66
      })
67
  }
68
 
69
  useEffect(() => {
70
    if (post.comments_url) getComments(post.comments_url)
71
  }, [post])
72
 
73
  return {
2191 stevensc 74
    post: { ...post, comments },
2190 stevensc 75
    isLoading,
76
    updateTotalShare,
77
    addComment,
78
    updateReactions,
79
    updateMyReaction
80
  }
81
}