Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3628 stevensc 1
import React, { useEffect, useRef, useState } from 'react';
2
 
3
import { useAlert, useApi, useModal, usePagination } from '@shared/hooks';
4
import { saveMessage } from '@inmail/services';
5
import { ReportModal } from '@shared/components';
6
 
7
export const useMessages = (conversation) => {
8
  const [messages, setMessages] = useState([]);
3631 stevensc 9
  const [reportedUuid, setReportedUuid] = useState(null);
3628 stevensc 10
  const messagesEndRef = useRef(null);
11
 
12
  const { items, loading, elementRef, resetPagination } = usePagination(conversation?.messages_url);
13
 
14
  const { showError, showSuccess } = useAlert();
3630 stevensc 15
  const { showModal, closeModal } = useModal();
3628 stevensc 16
 
17
  const { execute } = useApi(saveMessage, {
18
    onSuccess: (data) => {
19
      setMessages([data, ...messages]);
20
    },
21
    onError: (error) => {
22
      showError(error.message);
23
    }
24
  });
25
 
26
  const { execute: executeReport } = useApi(reportMessage, {
3631 stevensc 27
    onSuccess: (data) => {
28
      setMessages((prevMessages) =>
29
        prevMessages.map((message) =>
30
          message.uuid === reportedUuid
31
            ? { ...message, content: 'Contenido reportado', contentType: 'text' }
32
            : message
33
        )
34
      );
35
      closeModal();
36
      showSuccess(data);
37
      setReportedUuid(null);
38
    },
3628 stevensc 39
    onError: (error) => {
40
      showError(error.message);
3631 stevensc 41
      setReportedUuid(null);
3628 stevensc 42
    }
43
  });
44
 
45
  const sendMessage = async (message) => {
46
    if (!conversation?.save_url) return;
47
    await execute(conversation.save_url, message);
48
    messagesEndRef.current?.scrollIntoView({
49
      behavior: 'smooth',
50
      block: 'end'
51
    });
52
  };
53
 
3631 stevensc 54
  const reportMessage = async (report) => {
3630 stevensc 55
    if (!conversation?.abuse_report_url) return;
3631 stevensc 56
    executeReport(conversation.abuse_report_url, report);
3628 stevensc 57
  };
58
 
59
  const handleReport = (uuid) => {
3631 stevensc 60
    setReportedUuid(uuid);
3628 stevensc 61
    showModal(
62
      'Reportar mensaje',
63
      <ReportModal onSubmit={(report) => reportMessage(report, uuid)} />
64
    );
65
  };
66
 
67
  useEffect(() => {
68
    setMessages(items);
69
  }, [items]);
70
 
71
  return {
72
    messages,
73
    loading,
74
    messagesEndRef,
75
    elementRef,
76
    resetPagination,
77
    sendMessage,
78
    reportMessage: handleReport
79
  };
80
};