Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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.data

        dispatch(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 timer
    if (!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'}`}>
        <Sidebar
          setConversation={changeConversation}
          selectedConversation={selectedConversation}
        />
      </div>
      <div className={`col-12 col-md-8 ${!selectedConversation && 'msgs-hide'}`}>
        <ChatMail
          messages={messages}
          selectedConversation={selectedConversation}
          setConversation={changeConversation}
          getMoreMessages={() => getMoreMessages()}
          onSend={handleSend}
        />
      </div>
    </div>
  </div>
  )
}

export default Inmail