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};};