Rev 5204 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
/* eslint-disable camelcase *//* eslint-disable react/prop-types */import React, { useEffect, useState } from 'react'import { useDispatch } from 'react-redux'import { addNotification } from '../redux/notification/notification.actions'import { axios } from '../utils'import ChatMail from './inmail/inmail'import Sidebar from './inmail/sidebar'const DEFAULT_PAGES = { current: 1, last: 1 }const Inmail = () => {const [messages, setMessages] = useState([])const [pages, setPages] = useState(DEFAULT_PAGES)const [selectedConversation, setSelectedConversation] = useState(null)const [loading, setLoading] = useState(false)const dispatch = useDispatch()const controller = new AbortController()const getMessages = async (url = '', page = DEFAULT_PAGES.current) => {try {setLoading(true)const { data: response } = await axios.get(`${url}?page=${page}`, { signal: controller.signal })if (!response.success) {const errorMessage = response.datadispatch(addNotification({ style: 'danger', msg: errorMessage.message }))return}const newMessages = response.data.reduce((acum, updatedMessage) => {if (messages.findIndex((message) => message.id === updatedMessage.id) === -1) {acum = [...acum, updatedMessage]}return acum}, [])if (newMessages.length) {setMessages([...messages, ...newMessages])} else {setMessages(response.data)}setPages((prevPages) => ({ ...prevPages, current: response.pagination.current, last: response.pagination.last }))} catch (error) {const errorMessage = new Error(error)console.log('Request canceled', errorMessage)} finally {setLoading(false)}}const handleSend = async (sendUrl = '', message = {}) => {try {const formData = new FormData()Object.entries(message).forEach(([key, value]) => formData.append(key, value))const { data: response } = await axios.post(sendUrl, formData)setMessages(prev => [response.data, ...prev])} catch (error) {const errorMessage = new Error(error)dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))}}const changeConversation = (conversation) => {setSelectedConversation(conversation)}const getMoreMessages = async () => {if (pages.current + 1 > pages.last) {return null}if (loading) {controller.abort()}getMessages(selectedConversation.messages_link, pages.current + 1)}useEffect(() => {let timerif (!loading && selectedConversation) {timer = setTimeout(() => getMessages(selectedConversation.messages_link), 2000)}return () => {clearTimeout(timer)}}, [loading, selectedConversation])useEffect(() => {setPages(DEFAULT_PAGES)if (selectedConversation) getMessages(selectedConversation.messages_link)}, [selectedConversation])return (<div className="messages-sec container"><div className="row"><div className={`col-12 col-md-4 ${selectedConversation && 'msgs-hide'}`}><SidebarsetConversation={changeConversation}selectedConversation={selectedConversation}/></div><div className={`col-12 col-md-8 ${!selectedConversation && 'msgs-hide'}`}><ChatMailmessages={messages}selectedConversation={selectedConversation}setConversation={changeConversation}getMoreMessages={() => getMoreMessages()}onSend={handleSend}/></div></div></div>)}export default Inmail