Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3630 | Ir a la última revisión | | 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([]);
9
  const messagesEndRef = useRef(null);
10
 
11
  const { items, loading, elementRef, resetPagination } = usePagination(conversation?.messages_url);
12
 
13
  const { showError, showSuccess } = useAlert();
14
  const { showModal } = useModal();
15
 
16
  const { execute } = useApi(saveMessage, {
17
    onSuccess: (data) => {
18
      setMessages([data, ...messages]);
19
    },
20
    onError: (error) => {
21
      showError(error.message);
22
    }
23
  });
24
 
25
  const { execute: executeReport } = useApi(reportMessage, {
26
    onError: (error) => {
27
      showError(error.message);
28
    }
29
  });
30
 
31
  const sendMessage = async (message) => {
32
    if (!conversation?.save_url) return;
33
    await execute(conversation.save_url, message);
34
    messagesEndRef.current?.scrollIntoView({
35
      behavior: 'smooth',
36
      block: 'end'
37
    });
38
  };
39
 
40
  const reportMessage = (report, uuid) => {
41
    if (!conversation?.report_url) return;
42
    executeReport(conversation.report_url, report).then((data) => {
43
      showSuccess(data);
44
      setMessages((prevMessages) =>
45
        prevMessages.map((message) =>
46
          message.uuid === uuid
47
            ? { ...message, content: 'Contenido reportado', contentType: 'text' }
48
            : message
49
        )
50
      );
51
    });
52
  };
53
 
54
  const handleReport = (uuid) => {
55
    showModal(
56
      'Reportar mensaje',
57
      <ReportModal onSubmit={(report) => reportMessage(report, uuid)} />
58
    );
59
  };
60
 
61
  useEffect(() => {
62
    setMessages(items);
63
  }, [items]);
64
 
65
  return {
66
    messages,
67
    loading,
68
    messagesEndRef,
69
    elementRef,
70
    resetPagination,
71
    sendMessage,
72
    reportMessage: handleReport
73
  };
74
};