Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3671 stevensc 1
import React, { useMemo, useRef, useState } from 'react';
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
 
59
    const newMessagesSet = new Set(paginatedItems.map((item) => item.id));
60
    const uniqueNewMessages = newMessages.filter((item) => !newMessagesSet.has(item.id));
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
 
84
  return {
85
    messages,
86
    loading,
87
    messagesEndRef,
88
    elementRef,
89
    resetPagination,
90
    sendMessage,
91
    reportMessage: handleReport
92
  };
93
};