Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5200 | Rev 5202 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
5185 stevensc 1
/* eslint-disable camelcase */
4346 stevensc 2
/* eslint-disable react/prop-types */
888 stevensc 3
import React, { useEffect, useState } from 'react'
5187 stevensc 4
import { useDispatch } from 'react-redux'
5
import { addNotification } from '../redux/notification/notification.actions'
3713 stevensc 6
import { axios } from '../utils'
5185 stevensc 7
import ChatMail from './inmail/inmail'
1 www 8
import Sidebar from './inmail/sidebar'
9
 
5189 stevensc 10
const DEFAULT_PAGES = { current: 1, last: 1 }
2704 stevensc 11
 
5186 stevensc 12
const Inmail = () => {
5185 stevensc 13
  const [messages, setMessages] = useState([])
5189 stevensc 14
  const [pages, setPages] = useState(DEFAULT_PAGES)
5185 stevensc 15
  const [selectedConversation, setSelectedConversation] = useState(null)
5187 stevensc 16
  const [loading, setLoading] = useState(false)
17
  const dispatch = useDispatch()
4354 stevensc 18
 
5199 stevensc 19
  const getMessages = async (url = '', page = DEFAULT_PAGES.current) => {
5185 stevensc 20
    try {
5187 stevensc 21
      setLoading(true)
5199 stevensc 22
      const { data: response } = await axios.get(`${url}?page=${page}`)
891 stevensc 23
 
5187 stevensc 24
      if (!response.success) {
25
        const errorMessage = response.data
26
 
27
        dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))
28
        return
5185 stevensc 29
      }
1734 stevensc 30
 
5189 stevensc 31
      if (page === 1) {
32
        setMessages(response.data)
33
      } else {
5200 stevensc 34
        const newMessages = response.data
35
        setMessages((prevMessages) => ([...prevMessages, ...newMessages]))
5187 stevensc 36
      }
37
 
5190 stevensc 38
      setPages((prevPages) => ({ ...prevPages, current: response.pagination.current, last: response.pagination.last }))
5185 stevensc 39
    } catch (error) {
5187 stevensc 40
      const errorMessage = new Error(error)
41
      dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))
5189 stevensc 42
    } finally {
43
      setLoading(false)
5185 stevensc 44
    }
45
  }
1774 stevensc 46
 
5187 stevensc 47
  const handleSend = async (sendUrl = '', message = {}) => {
48
    try {
49
      const formData = new FormData()
5185 stevensc 50
 
5187 stevensc 51
      Object.entries(message).forEach(([key, value]) => formData.append(key, value))
5185 stevensc 52
 
5187 stevensc 53
      const { data: response } = await axios.post(sendUrl, formData)
54
      setMessages(prev => [response.data, ...prev])
55
    } catch (error) {
5189 stevensc 56
      const errorMessage = new Error(error)
57
      dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))
1 www 58
    }
5185 stevensc 59
  }
727 stevensc 60
 
5189 stevensc 61
  const changeConversation = (conversation) => {
62
    setSelectedConversation(conversation)
63
  }
5187 stevensc 64
 
5185 stevensc 65
  const getMoreMessages = () => {
5201 stevensc 66
    if (!loading) {
67
      if (pages.current + 1 > pages.last) {
68
        return null
69
      }
70
 
71
      getMessages(selectedConversation.messages_link, pages.current + 1)
1 www 72
    }
5185 stevensc 73
  }
1 www 74
 
5185 stevensc 75
  useEffect(() => {
76
    let timer
5187 stevensc 77
    if (!loading && selectedConversation) {
5185 stevensc 78
      timer = setTimeout(() => {
5200 stevensc 79
        getMessages(selectedConversation.messages_link)
5185 stevensc 80
      }, 2000)
1 www 81
    }
5185 stevensc 82
    return () => {
83
      clearTimeout(timer)
84
    }
5187 stevensc 85
  }, [loading, selectedConversation])
888 stevensc 86
 
5185 stevensc 87
  useEffect(() => {
5189 stevensc 88
    setPages(DEFAULT_PAGES)
5199 stevensc 89
    if (selectedConversation) getMessages(selectedConversation.messages_link)
5189 stevensc 90
  }, [selectedConversation])
1734 stevensc 91
 
5185 stevensc 92
  return (
5187 stevensc 93
  <div className="messages-sec container">
94
    <div className="row">
95
      <div className={`col-12 col-md-4 ${selectedConversation && 'msgs-hide'}`}>
96
        <Sidebar
97
          setConversation={changeConversation}
98
          selectedConversation={selectedConversation}
99
        />
5185 stevensc 100
      </div>
5187 stevensc 101
      <div className={`col-12 col-md-8 ${!selectedConversation && 'msgs-hide'}`}>
102
        <ChatMail
103
          messages={messages}
104
          selectedConversation={selectedConversation}
105
          setConversation={changeConversation}
106
          getMoreMessages={() => getMoreMessages()}
107
          onSend={handleSend}
108
        />
109
      </div>
5185 stevensc 110
    </div>
5187 stevensc 111
  </div>
5185 stevensc 112
  )
3074 stevensc 113
}
114
 
5185 stevensc 115
export default Inmail