Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3628 | Rev 3631 | 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([]);
9
  const messagesEndRef = useRef(null);
10
 
11
  const { items, loading, elementRef, resetPagination } = usePagination(conversation?.messages_url);
12
 
13
  const { showError, showSuccess } = useAlert();
3630 stevensc 14
  const { showModal, closeModal } = useModal();
3628 stevensc 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
 
3630 stevensc 40
  const reportMessage = async (report, uuid) => {
41
    if (!conversation?.abuse_report_url) return;
42
    await executeReport(conversation.abuse_report_url, report).then((data) => {
3628 stevensc 43
      setMessages((prevMessages) =>
44
        prevMessages.map((message) =>
45
          message.uuid === uuid
46
            ? { ...message, content: 'Contenido reportado', contentType: 'text' }
47
            : message
48
        )
49
      );
3630 stevensc 50
      closeModal();
51
      showSuccess(data);
3628 stevensc 52
    });
53
  };
54
 
55
  const handleReport = (uuid) => {
56
    showModal(
57
      'Reportar mensaje',
58
      <ReportModal onSubmit={(report) => reportMessage(report, uuid)} />
59
    );
60
  };
61
 
62
  useEffect(() => {
63
    setMessages(items);
64
  }, [items]);
65
 
66
  return {
67
    messages,
68
    loading,
69
    messagesEndRef,
70
    elementRef,
71
    resetPagination,
72
    sendMessage,
73
    reportMessage: handleReport
74
  };
75
};