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