Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3647 | Rev 3671 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect, useRef, useState } from 'react';

import { useAlert, useApi, useModal, usePagination } from '@shared/hooks';
import { saveMessage, reportMessage } from '@inmail/services';
import { ReportModal } from '@shared/components';

export const useMessages = (conversation) => {
  const [messages, setMessages] = useState([]);
  const [newMessages, setNewMessages] = useState([]);
  const [reportedUrl, setReportedUrl] = useState(null);
  const messagesEndRef = useRef(null);

  const { items, loading, elementRef, resetPagination } = usePagination(conversation?.messages_url);

  const { showError, showSuccess } = useAlert();
  const { showModal, closeModal } = useModal();

  const { execute } = useApi(saveMessage, {
    onSuccess: (data) => {
      setNewMessages([data, ...newMessages]);
    },
    onError: (error) => {
      showError(error.message);
    }
  });

  const { execute: executeReport } = useApi(reportMessage, {
    onSuccess: (data) => {
      setMessages((prevMessages) =>
        prevMessages.map((message) =>
          message.abuse_report_url === reportedUrl
            ? { ...message, message: 'Contenido reportado', type: 'text' }
            : message
        )
      );
      closeModal();
      showSuccess(data.message);
      setReportedUrl(null);
    },
    onError: (error) => {
      showError(error.message);
      setReportedUrl(null);
    }
  });

  const sendMessage = async (message) => {
    if (!conversation?.save_url) return;
    await execute(conversation.save_url, message);
    messagesEndRef.current?.scrollIntoView({
      behavior: 'smooth',
      block: 'end'
    });
  };

  const handleReport = (url) => {
    setReportedUrl(url);
    showModal(
      'Reportar mensaje',
      <ReportModal onSubmit={(report) => executeReport(url, report)} />
    );
  };

  useEffect(() => {
    setMessages(items);
  }, [items]);

  return {
    messages: [...newMessages, ...messages],
    loading,
    messagesEndRef,
    elementRef,
    resetPagination,
    sendMessage,
    reportMessage: handleReport
  };
};