Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
4346 stevensc 1
/* eslint-disable react/prop-types */
888 stevensc 2
import React, { useEffect, useState } from 'react'
3713 stevensc 3
import { axios } from '../utils'
1 www 4
import ChatMail from "./inmail/inmail"
5
import Sidebar from './inmail/sidebar'
6
 
4354 stevensc 7
const defaultPages = { current: 1, last: 1 }
2704 stevensc 8
 
3074 stevensc 9
const Inmail = props => {
4354 stevensc 10
 
11
    const [messages, setMessages] = useState([])
12
    const [page, setPage] = useState(defaultPages)
888 stevensc 13
    const [selectedConversation, setSelectedConversation] = useState(null)
14
    const [isGettingMessages, setIsGettingMessages] = useState(false)
891 stevensc 15
 
1734 stevensc 16
    const getMessages = async ({ messages_link = selectedConversation.messages_link, _page = defaultPages.current }) => {
1732 stevensc 17
        try {
1734 stevensc 18
            setIsGettingMessages(true)
19
            const { data } = await axios.get(messages_link + '?page=' + _page)
20
 
21
            if (data.success) {
22
                setIsGettingMessages(false)
23
                return { pages: data.pagination, msgs: data.data }
1732 stevensc 24
            }
1774 stevensc 25
 
3137 stevensc 26
            setIsGettingMessages(false)
1774 stevensc 27
            return { pages: defaultPages.current, msgs: data.data }
893 stevensc 28
        }
1732 stevensc 29
        catch (error) {
30
            console.log('>>: error > ', error)
31
        }
1 www 32
    }
727 stevensc 33
 
4354 stevensc 34
    const changeConversation = (conversation) => {
891 stevensc 35
        setPage(defaultPages)
1 www 36
        setSelectedConversation(conversation)
37
    }
38
 
3710 stevensc 39
    const handleSend = async (message = '') => {
776 stevensc 40
        if (selectedConversation) {
1 www 41
            try {
42
                const params = {
3710 stevensc 43
                    message: message
1 www 44
                }
45
                const formData = new FormData();
46
                Object.entries(params).map(([key, value]) => {
47
                    formData.append(key, value);
48
                });
898 stevensc 49
                const res = await axios.post(selectedConversation.send_link, formData)
1768 stevensc 50
                setMessages(prev => [res.data.data, ...prev])
1 www 51
            } catch (error) {
52
                console.log('>>: err0r > ', error)
53
            }
54
        }
55
    }
56
 
913 stevensc 57
    const getMoreMessages = () => {
888 stevensc 58
        if (page.last > page.current) {
894 stevensc 59
            setPage({ ...page, current: page.current += 1 })
884 stevensc 60
        }
1 www 61
    }
888 stevensc 62
 
1733 stevensc 63
    useEffect(() => {
1737 stevensc 64
        if (selectedConversation) {
65
            getMessages(selectedConversation.messages_link)
1734 stevensc 66
                .then(({ pages, msgs }) => {
67
                    setPage({ ...page, last: pages.last })
68
                    setMessages(msgs)
69
                })
70
        }
71
    }, [selectedConversation]);
72
 
73
    useEffect(() => {
3137 stevensc 74
        let timer;
3144 stevensc 75
        if (!isGettingMessages && selectedConversation) {
3137 stevensc 76
            timer = setTimeout(() => {
77
                getMessages(selectedConversation.messages_link)
78
                    .then(({ pages, msgs }) => {
79
                        setPage({ ...page, last: pages.last })
80
                        setMessages(msgs)
81
                    })
82
            }, 2000);
83
        }
84
        return () => {
85
            clearTimeout(timer);
86
        };
3144 stevensc 87
    }, [isGettingMessages, selectedConversation]);
3137 stevensc 88
 
89
    useEffect(() => {
1737 stevensc 90
        if (page.current > 1) {
1740 stevensc 91
            setIsGettingMessages(true)
1741 stevensc 92
 
1734 stevensc 93
            getMessages({ _page: page.current })
94
                .then(({ pages, msgs }) => {
95
 
96
                    setPage({ ...page, last: pages.last })
1740 stevensc 97
                    setMessages(prev => [...prev, ...msgs])
1734 stevensc 98
                })
99
        }
100
    }, [page.current]);
101
 
776 stevensc 102
    return (
4354 stevensc 103
        <div className="messages-sec container">
104
            <div className="row">
105
                <div className={`col-12 col-md-4 ${selectedConversation && 'msgs-hide'}`}>
106
                    <Sidebar
107
                        setConversation={changeConversation}
108
                        selectedConversation={selectedConversation}
109
                    />
1 www 110
                </div>
4354 stevensc 111
                <div className={`col-12 col-md-8 ${!selectedConversation && 'msgs-hide'}`}>
112
                    {selectedConversation
113
                        ?
114
                        <ChatMail
115
                            getMoreMessages={() => getMoreMessages()}
116
                            backendVars={props.backendVars}
117
                            onSend={handleSend}
118
                            messages={messages}
119
                            setMsgs={setMessages}
120
                            selectedConversation={selectedConversation}
121
                            loading={isGettingMessages}
122
                        />
123
                        :
124
                        <div className='message-select-conversation'>
125
                            <div className='msgs-select-container'>
126
                                <i className='fas fa-comments icon' />
127
                                <h3>
128
                                    No hay mensajes
129
                                </h3>
1864 steven 130
                            </div>
4346 stevensc 131
                        </div>
4354 stevensc 132
                    }
1 www 133
                </div>
4346 stevensc 134
            </div>
4354 stevensc 135
        </div>
1 www 136
    )
3074 stevensc 137
}
138
 
139
export default Inmail