Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3432 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

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