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