Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3671 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

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

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

import { ReportModal } from '@shared/components';

export const useMessages = (conversation) => {
  const [newMessages, setNewMessages] = useState([]);
  const [reportedMessages, setReportedMessages] = useState(new Map());
  const [reportedUrl, setReportedUrl] = useState(null);
  const messagesEndRef = useRef(null);

  const { data, loading, hasMore, loadMore, refresh } = usePagination(conversation?.messages_url);

  const { elementRef } = useInterceptionObserver({
    onIntersect: hasMore ? loadMore : undefined
  });

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

  const { execute } = useApi(saveMessage, {
    onSuccess: (data) => {
      setNewMessages((prev) => [data, ...prev]);
      messagesEndRef.current?.scrollIntoView({
        behavior: 'smooth',
        block: 'end'
      });
    },
    onError: (error) => {
      showError(error.message);
    }
  });

  const { execute: executeReport } = useApi(reportMessage, {
    onSuccess: (data) => {
      setReportedMessages((prev) =>
        new Map(prev).set(reportedUrl, { message: 'Contenido reportado', type: 'text' })
      );
      closeModal();
      showSuccess(data.message);
      setReportedUrl(null);
    },
    onError: (error) => {
      showError(error.message);
      setReportedUrl(null);
    }
  });

  const messages = useMemo(() => {
    const paginatedItems = data.map((item) => {
      if (reportedMessages.has(item.abuse_report_url)) {
        return { ...item, ...reportedMessages.get(item.abuse_report_url) };
      }
      return item;
    });

    const newMessagesSet = new Set(paginatedItems.map((item) => item.uuid));
    const uniqueNewMessages = newMessages.filter((item) => !newMessagesSet.has(item.uuid));

    return [...uniqueNewMessages, ...paginatedItems];
  }, [data, newMessages, reportedMessages]);

  const sendMessage = (message) => {
    if (!conversation?.save_url) return;
    execute(conversation.save_url, message);
  };

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

  const resetPagination = () => {
    setNewMessages([]);
    setReportedMessages(new Map());
    refresh();
  };

  useEffect(() => {
    if (conversation) refresh();
  }, [conversation]);

  return {
    messages,
    loading,
    messagesEndRef,
    elementRef,
    resetPagination,
    sendMessage,
    reportMessage: handleReport
  };
};