Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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