Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3645 | Rev 3658 | 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';
3633 stevensc 4
import { saveMessage, reportMessage } from '@inmail/services';
3628 stevensc 5
import { ReportModal } from '@shared/components';
6
 
7
export const useMessages = (conversation) => {
8
  const [messages, setMessages] = useState([]);
3633 stevensc 9
  const [reportedUrl, setReportedUrl] = 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) =>
3633 stevensc 30
          message.abuse_report_url === reportedUrl
3647 stevensc 31
            ? { ...message, message: 'Contenido reportado', type: 'text' }
3631 stevensc 32
            : message
33
        )
34
      );
35
      closeModal();
3638 stevensc 36
      showSuccess(data.message);
3633 stevensc 37
      setReportedUrl(null);
3631 stevensc 38
    },
3628 stevensc 39
    onError: (error) => {
40
      showError(error.message);
3633 stevensc 41
      setReportedUrl(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
 
3633 stevensc 54
  const handleReport = (url) => {
3645 stevensc 55
    setReportedUrl(url);
3628 stevensc 56
    showModal(
57
      'Reportar mensaje',
3633 stevensc 58
      <ReportModal onSubmit={(report) => executeReport(url, report)} />
3628 stevensc 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
};