Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15801 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
11347 nelberth 1
import React from 'react'
2
import ChatMail from "./ChatRoom"
3
import Sidebar from './Sidebar'
4
import { Modal } from 'react-bootstrap'
5
import { axios } from '../../../utils'
6
import Chat from '../chat/Chat'
7
import styled from "styled-components";
8
import Spinner from '../../../shared/loading-spinner/Spinner'
9
 
10
const StyledSpinnerContainer = styled.div`
11
  position: absolute;
12
  left: 0;
13
  top: 0;
14
  width: 100%;
15
  height: 100%;
16
  background: rgba(255, 255, 255, 0.4);
17
  display: flex;
18
  justify-content: center;
19
  align-items: center;
20
  z-index: 300;
21
`;
22
export default props => {
23
    const defaultPage = {current: 1, last: 1}
24
    const [conversations, setConversations] = React.useState([])
25
    const [selectedConversation, setSelectedConversation] = React.useState(null)
26
    const [page, setPage] = React.useState(defaultPage)
27
    const [messages, setMessages] = React.useState([])
28
    const [isGettingMessages, setIsGettingMessages] = React.useState(false)
29
    const [visible, setVisible] = React.useState(false)
30
    const [inmailPersons, setInmailPersons] = React.useState([])
31
    const [search, setSearch] = React.useState('')
32
    const [loading, setLoading] = React.useState(false)
33
    const getMessages = async (conversation = selectedConversation, _page=page.current, justPaginate = false) => {
34
        try {
35
            const res = await axios.get(conversation.messages_link+'?page='+_page)
36
            if(justPaginate){
37
                const _messages = [... messages, ... res.data.data]
38
                setMessages(_messages)
39
            }else{
40
                setMessages(res.data.data || [])
41
            }
42
            if(res.data.pagination && res.data.pagination.last && res.data.pagination.last !== page.last){
43
                setPage({
44
                    ... page,
45
                    last: res.data.pagination.last
46
                })
47
            }
48
        } catch (error) {
49
            console.log('>>: error > ', error)
50
        }finally{
51
            if(isGettingMessages){
52
                setIsGettingMessages(false)
53
            }
54
        }
55
    }
56
    const handleChangeConversation = async conversation => {
57
        // setPage(defaultPage)
58
        setLoading(true)
59
        setSelectedConversation(null)
60
        setTimeout(() => {
61
            setSelectedConversation(conversation)
62
            setLoading(false)
63
        }, 1000)
64
        // getMessages(conversation, defaultPage.current)
65
    }
66
 
67
    const handleSend = async message => {
68
        if(selectedConversation){
69
            try {
70
                const params = {
71
                    message
72
                }
73
                const formData = new FormData();
74
                Object.entries(params).map(([key, value]) => {
75
                    formData.append(key, value);
76
                });
77
                const res = await axios.post(selectedConversation.send_link, formData)
78
                const _messages = [... messages]
79
                _messages.push(res.data.data)
80
                setMessages(_messages)
81
            } catch (error) {
82
                console.log('>>: err0r > ', error)
83
            }finally{
84
                getMessages()
85
            }
86
        }
87
    }
88
 
89
    const getMoreMessages = () => {
90
        if(page.last > page.current){
91
            let {current} = page
92
            current+=1
93
            if(!isGettingMessages){
94
                setIsGettingMessages(true)
95
                setPage({
96
                    ... page,
97
                    current
98
                })
99
                getMessages(selectedConversation, current, true)
100
            }
101
        }
102
    }
103
    const onClose = () => {
104
        setVisible(false)
105
    }
106
 
107
    const handleChange = async e => {
108
        const value = e.target.value
109
        setSearch(value)
110
        try {
111
            const res = await axios.get('/helpers/search-people?search='+value)
112
            if(res.data.success){
113
                setInmailPersons(res.data.data)
114
            }
115
        } catch (error) {
116
            console.log('>>: error > ', error)
117
        }
118
    }
119
 
120
    const handleInmailPerson = uuid => {
121
        onClose()
122
        window.location.href = '/inmail/'+uuid
123
        setTimeout(() => {
124
            window.location.reload()
125
        }, 1000)
126
    }
127
 
128
    const handleCloseChat = () => {
129
        console.log('>>: close chat')
130
    }
131
 
132
    return(
133
        <>
134
            {
135
                loading && (
136
                    <StyledSpinnerContainer>
137
                        <Spinner />
138
                    </StyledSpinnerContainer>
139
                )
140
            }
141
            <Modal
142
                show={visible}
143
                onHide={onClose}
144
            >
145
                <div className="card">
146
                    <div className="card-body">
147
                        <h3 className="card-title font-weight-bold">Crear sala de Chat</h3>
148
                        <div class="form-group">
149
                            <label for="search-people">Direccion de email</label>
150
                            <input
151
                                type="email"
152
                                className="form-control"
153
                                id="search-people"
154
                                aria-describedby="Buscador de personas"
155
                                placeholder="Escribe el nombre de la persona"
156
                                onChange={handleChange}
157
                            />
158
                        </div>
159
                        <div
160
                            className='container'
161
                        >
162
                            {
163
                                inmailPersons.map(element => {
164
                                    return(
165
                                        <div
166
                                            className='row'
167
                                            key={element.value}
168
                                        >
169
                                            <div
170
                                                className='col-8'
171
                                            >
172
                                                <p> {element.text} </p>
173
                                            </div>
174
                                            <div
175
                                                className='col-4'
176
                                            >
177
                                                <button
178
                                                    className='btn btn-primary'
179
                                                    onClick={() => handleInmailPerson(element.value)}
180
                                                >
181
                                                    <i className='fa fa-check' />
182
                                                </button>
183
                                            </div>
184
                                        </div>
185
                                    )
186
                                })
187
                            }
188
                        </div>
189
                        <a href="#" onClick={onClose} className="btn btn-danger">
190
                            Cerrar
191
                        </a>
192
                    </div>
193
                </div>
194
            </Modal>
195
            <section className="messages-page">
196
                <div className="container">
197
                    <div
198
                        className='w-100 text-center'
199
                    >
200
                        <h1 className='font-weight-bold p-2'>Chat</h1>
201
                    </div>
202
                    <div className="messages-sec">
203
                        <div className="row">
204
                            <div className="col-lg-4 col-md-12 no-pdd">
205
                                <div className="msgs-list">
206
                                    <div
207
                                        className="msg-title d-flex align-items-center"
208
                                        style={{
209
                                            minHeight: '13vh'
210
                                        }}
211
                                    >
212
                                        <h3>Personas y grupos</h3>
213
                                        {/* <button
214
                                            className='btn btn-link text-dark btn-sm'
215
                                            onClick={() => setVisible(true)}
216
                                        >
217
                                            <i className='fa fa-plus text-dark' />
218
                                        </button> */}
219
                                    </div>
220
                                    <Sidebar
221
                                        onClick={conversation => handleChangeConversation(conversation)}
222
                                        conversations={[... props.chatUsers, ... props.chatGroups]}
223
                                        selectedConversation={selectedConversation}
224
                                    />
225
                                </div>
226
                            </div>
227
                            <div
228
                                className="col-lg-8 col-md-12 pd-right-none pd-left-none"
229
                                style={{
230
                                    maxHeight: '85vh'
231
                                }}
232
                            >
233
                                {
234
                                    !!selectedConversation ?
235
                                    <Chat
236
                                        entity={selectedConversation}
237
                                        onCloseChat={handleCloseChat}
238
                                    />
239
                                    :
240
                                    <div>
241
                                        <p>Seleccione un chat</p>
242
                                    </div>
243
                                }
244
                                {/* <ChatMail
245
                                    getMoreMessages={() => getMoreMessages()}
246
                                    backendVars={props.backendVars}
247
                                    onSend={text => handleSend(text)}
248
                                    messages={messages}
249
                                    selectedConversation={selectedConversation}
250
                                /> */}
251
                            </div>
252
                        </div>
253
                    </div>
254
                </div>
255
            </section>
256
        </>
257
    )
258
}