Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3432 stevensc 1
import { useEffect, useState } from "react";
2
import { useDispatch } from "react-redux";
3208 stevensc 3
 
3432 stevensc 4
import { axios } from "@app/utils";
5
import { addNotification } from "@app/redux/notification/notification.actions";
6
import { showReportModal } from "@app/redux/report/report.actions";
3208 stevensc 7
 
8
export function useMessages(messagesUrl) {
3432 stevensc 9
  const [loading, setLoading] = useState(false);
10
  const [messages, setMessages] = useState([]);
11
  const [currentPage, setCurrentPage] = useState(1);
12
  const [pages, setPages] = useState(1);
13
  const dispatch = useDispatch();
3208 stevensc 14
 
15
  function compareMessages(ref = [], newValue = []) {
3432 stevensc 16
    const set = new Set(ref.map((obj) => obj.id));
17
    const difference = newValue.filter((obj) => !set.has(obj.id));
18
    return difference;
3208 stevensc 19
  }
20
 
21
  const messagesAdapter = (message) => {
22
    const {
23
      u,
24
      side,
25
      type,
26
      filename,
27
      m,
28
      mtype,
29
      date,
30
      time,
31
      id,
32
      uuid,
3432 stevensc 33
      message: content,
34
    } = message;
3208 stevensc 35
 
36
    return {
37
      id: id ?? uuid,
3432 stevensc 38
      content: m || content || filename || "",
39
      send: u === 1 || side === "left",
3208 stevensc 40
      contentType: mtype || type,
41
      time: time || date,
3432 stevensc 42
      ...message,
43
    };
44
  };
3208 stevensc 45
 
3432 stevensc 46
  const getMessages = async ({ url = "", page = 1 }) => {
47
    if (!url) return;
48
    setLoading(true);
3208 stevensc 49
    return axios
50
      .get(`${url}?page=${page}`)
3432 stevensc 51
      .then((response) => {
52
        const { data, success, pagination } = response.data;
3208 stevensc 53
 
54
        if (!success) {
3432 stevensc 55
          throw new Error("Ha ocurrido un error al obtener los mensajes");
3208 stevensc 56
        }
57
 
3432 stevensc 58
        const resMessages = data.items ?? data;
59
        const adapterMessages = resMessages.map((mes) => messagesAdapter(mes));
3208 stevensc 60
 
61
        return {
62
          currentPage: pagination ? pagination.current : data.page,
63
          messages: adapterMessages,
3432 stevensc 64
          lastPage: pagination ? pagination.last : data.pages,
65
        };
3208 stevensc 66
      })
3432 stevensc 67
      .finally(() => setLoading(false));
68
  };
3208 stevensc 69
 
3432 stevensc 70
  const loadMoreMessages = async ({ url = "", page = 2 }) => {
3208 stevensc 71
    try {
3432 stevensc 72
      const response = await getMessages({ url, page });
73
      const { messages } = response;
3208 stevensc 74
 
3432 stevensc 75
      setMessages((prevState) => [...prevState, ...messages]);
3208 stevensc 76
    } catch (error) {
3432 stevensc 77
      dispatch(addNotification({ style: "danger", msg: error.message }));
3208 stevensc 78
    }
3432 stevensc 79
  };
3208 stevensc 80
 
81
  const heartBeat = async ({ url }) => {
82
    try {
3432 stevensc 83
      const { lastPage, messages: resMessages } = await getMessages({ url });
3208 stevensc 84
 
3432 stevensc 85
      setPages(lastPage);
3208 stevensc 86
      setMessages((prevState) => {
3432 stevensc 87
        const diff = compareMessages(prevState, resMessages);
88
        if (!diff.length) return prevState;
89
        return [...diff, ...prevState];
90
      });
3208 stevensc 91
    } catch (error) {
3432 stevensc 92
      dispatch(addNotification({ style: "danger", msg: error.message }));
3208 stevensc 93
    }
3432 stevensc 94
  };
3208 stevensc 95
 
96
  const changePage = () => {
3432 stevensc 97
    if (currentPage >= pages) return;
98
    setCurrentPage((prevState) => prevState + 1);
99
  };
3208 stevensc 100
 
101
  const markReport = (id) => {
102
    setMessages((prevMessages) => {
103
      return prevMessages.map((message) =>
104
        message.id === id
105
          ? {
106
              ...message,
3432 stevensc 107
              content: "Contenido reportado",
108
              url_abuse_report: "",
109
              contentType: "text",
3208 stevensc 110
            }
111
          : message
3432 stevensc 112
      );
113
    });
114
  };
3208 stevensc 115
 
116
  const handleReport = ({ url, id }) => {
117
    dispatch(
118
      showReportModal({
119
        reportUrl: url,
3432 stevensc 120
        type: "mensaje",
121
        onComplete: () => markReport(id),
3208 stevensc 122
      })
3432 stevensc 123
    );
124
  };
3208 stevensc 125
 
126
  useEffect(() => {
3432 stevensc 127
    setMessages([]);
128
    setCurrentPage(1);
129
    setPages(1);
130
  }, [messagesUrl]);
3208 stevensc 131
 
132
  useEffect(() => {
3432 stevensc 133
    if (currentPage === 1) return;
134
    loadMoreMessages({ url: messagesUrl, page: currentPage });
135
  }, [messagesUrl, currentPage, loading]);
3208 stevensc 136
 
137
  useEffect(() => {
138
    const messagesInterval = setTimeout(() => {
3432 stevensc 139
      heartBeat({ url: messagesUrl });
140
    }, 2000);
3208 stevensc 141
 
142
    return () => {
3432 stevensc 143
      clearTimeout(messagesInterval);
144
    };
145
  }, [messagesUrl, loading]);
3208 stevensc 146
 
147
  return {
148
    messages,
149
    loading,
150
    loadMore: changePage,
3432 stevensc 151
    report: handleReport,
152
  };
3208 stevensc 153
}