Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3671 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3673 stevensc 1
import React, { useEffect, useMemo, useRef, useState } from 'react';
3671 stevensc 2
 
3
import { useAlert, useApi, useModal, usePagination, useInterceptionObserver } from '@shared/hooks';
4
import { saveMessage, reportMessage } from '@inmail/services';
5
 
6
import { ReportModal } from '@shared/components';
7
 
8
export const useMessages = (conversation) => {
9
  const [newMessages, setNewMessages] = useState([]);
10
  const [reportedMessages, setReportedMessages] = useState(new Map());
11
  const [reportedUrl, setReportedUrl] = useState(null);
12
  const messagesEndRef = useRef(null);
13
 
14
  const { data, loading, hasMore, loadMore, refresh } = usePagination(conversation?.messages_url);
15
 
16
  const { elementRef } = useInterceptionObserver({
17
    onIntersect: hasMore ? loadMore : undefined
18
  });
19
 
20
  const { showError, showSuccess } = useAlert();
21
  const { showModal, closeModal } = useModal();
22
 
23
  const { execute } = useApi(saveMessage, {
24
    onSuccess: (data) => {
25
      setNewMessages((prev) => [data, ...prev]);
26
      messagesEndRef.current?.scrollIntoView({
27
        behavior: 'smooth',
28
        block: 'end'
29
      });
30
    },
31
    onError: (error) => {
32
      showError(error.message);
33
    }
34
  });
35
 
36
  const { execute: executeReport } = useApi(reportMessage, {
37
    onSuccess: (data) => {
38
      setReportedMessages((prev) =>
39
        new Map(prev).set(reportedUrl, { message: 'Contenido reportado', type: 'text' })
40
      );
41
      closeModal();
42
      showSuccess(data.message);
43
      setReportedUrl(null);
44
    },
45
    onError: (error) => {
46
      showError(error.message);
47
      setReportedUrl(null);
48
    }
49
  });
50
 
51
  const messages = useMemo(() => {
52
    const paginatedItems = data.map((item) => {
53
      if (reportedMessages.has(item.abuse_report_url)) {
54
        return { ...item, ...reportedMessages.get(item.abuse_report_url) };
55
      }
56
      return item;
57
    });
58
 
3673 stevensc 59
    const newMessagesSet = new Set(paginatedItems.map((item) => item.uuid));
60
    const uniqueNewMessages = newMessages.filter((item) => !newMessagesSet.has(item.uuid));
3671 stevensc 61
 
62
    return [...uniqueNewMessages, ...paginatedItems];
63
  }, [data, newMessages, reportedMessages]);
64
 
65
  const sendMessage = (message) => {
66
    if (!conversation?.save_url) return;
67
    execute(conversation.save_url, message);
68
  };
69
 
70
  const handleReport = (url) => {
71
    setReportedUrl(url);
72
    showModal(
73
      'Reportar mensaje',
74
      <ReportModal onSubmit={(report) => executeReport(url, report)} />
75
    );
76
  };
77
 
78
  const resetPagination = () => {
79
    setNewMessages([]);
80
    setReportedMessages(new Map());
81
    refresh();
82
  };
83
 
3673 stevensc 84
  useEffect(() => {
85
    if (conversation) refresh();
86
  }, [conversation]);
87
 
3671 stevensc 88
  return {
89
    messages,
90
    loading,
91
    messagesEndRef,
92
    elementRef,
93
    resetPagination,
94
    sendMessage,
95
    reportMessage: handleReport
96
  };
97
};