Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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