Proyectos de Subversion LeadersLinked - SPA

Rev

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