Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3769 stevensc 1
/* eslint-disable react/prop-types */
4358 stevensc 2
import React, { useEffect, useRef, useState } from 'react'
4347 stevensc 3
import EmptySection from '../../shared/empty-section/EmptySection';
4354 stevensc 4
import SearchIcon from '@mui/icons-material/Search'
5
import { axios } from '../../utils';
6
import { Modal } from 'react-bootstrap';
1 www 7
 
4354 stevensc 8
let path_id = window.location.pathname.split('/inmail/')[1]
9
 
4347 stevensc 10
const Sidebar = ({
11
    selectedConversation = null,
4354 stevensc 12
    setConversation = function () { },
4347 stevensc 13
}) => {
4354 stevensc 14
    const [conversations, setConversations] = useState([])
15
    const [searchActive, setSearchActive] = useState(false)
4357 stevensc 16
    const [search, setSearch] = useState('')
4354 stevensc 17
    const [visible, setVisible] = useState(false)
4358 stevensc 18
    const searchContainer = useRef()
821 stevensc 19
 
4396 stevensc 20
    const filtredConversations = conversations.filter((conversation) => conversation.name.toLowerCase().includes(search.toLowerCase()))
4357 stevensc 21
 
4354 stevensc 22
    const load = async () => {
23
        try {
24
            const { data } = await axios.get(window.location.href)
25
            if (data.success) setConversations(data.data)
26
        } catch (error) {
27
            console.log('>>: error > ', error)
28
        }
841 stevensc 29
    }
2539 stevensc 30
 
4354 stevensc 31
    useEffect(() => {
4358 stevensc 32
        const handleClickOutside = (event) => {
33
            if (searchContainer.current && !searchContainer.current.contains(event.target)) {
34
                setSearchActive(false)
35
            }
36
        }
37
        document.addEventListener("mousedown", handleClickOutside);
38
 
39
        return () => {
40
            document.removeEventListener("mousedown", handleClickOutside);
41
        };
42
    }, [searchContainer]);
43
 
44
    useEffect(() => {
4354 stevensc 45
        if (path_id && conversations.length) {
46
            setConversation(conversations.find(conversation => conversation.uuid === path_id))
47
            path_id = null
48
        }
49
    }, [conversations]);
50
 
51
    useEffect(() => {
52
        const interval = setInterval(() => {
53
            load()
54
        }, 3000)
55
 
56
        return () => {
57
            clearInterval(interval)
58
        };
59
    }, []);
60
 
61
    return (
62
        <>
63
            <Sidebar.StartConversationModal
64
                show={visible}
65
                setConversation={setConversation}
66
            />
67
            <div className="chat_contacts">
68
                <h1 className='chat-title'>Personas</h1>
69
                <div className="msgs_icons-container">
4772 stevensc 70
                    <div className="d-inline-flex align-items-center" style={{ gap: '.5rem' }}>
71
                        <div
72
                            className={`contact__search show`}
73
                            ref={searchContainer}
74
                        >
75
                            <SearchIcon onClick={() => setSearchActive(!searchActive)} />
76
                            <input
77
                                type='text'
78
                                placeholder='Buscar'
79
                                onChange={(e) => setSearch(e.target.value)}
80
                            />
81
                        </div>
82
                        Buscar conversación
83
                    </div>
84
                    <div className="d-inline-flex align-items-center" style={{ gap: '.5rem' }}>
85
                        <i
86
                            className='fa fa-plus icon text-gray'
87
                            onClick={() => setVisible(true)}
4354 stevensc 88
                        />
4772 stevensc 89
                        Iniciar conversación
4354 stevensc 90
                    </div>
91
                </div>
4357 stevensc 92
                {!filtredConversations.length
4354 stevensc 93
                    ? <EmptySection message='Sin conversaciones' />
94
                    : <ul className='messages-list'>
4359 stevensc 95
                        {filtredConversations.map((conversation) => {
4354 stevensc 96
                            return (
4359 stevensc 97
                                <li key={conversation.uuid} onClick={() => setConversation(conversation)}>
98
                                    <div className={`usr-msg-details ${selectedConversation?.uuid === conversation.uuid && 'is_selected'}`}>
4354 stevensc 99
                                        <div className="usr-ms-img">
4359 stevensc 100
                                            <img src={conversation.image} alt={conversation.name} />
4354 stevensc 101
                                        </div>
102
                                        <div className="usr-mg-info">
4359 stevensc 103
                                            <h3>{conversation.name}</h3>
104
                                            {Number(conversation.count_unread) > 0 &&
4354 stevensc 105
                                                <p className="text-gray">
4359 stevensc 106
                                                    {conversation.count_unread} mensajes nuevos | <span> {conversation.last_message} </span>
4354 stevensc 107
                                                </p>
108
                                            }
109
                                        </div>
110
                                    </div>
111
                                </li>
112
                            )
113
                        })}
114
                    </ul>
115
                }
116
            </div>
117
        </>
118
    )
119
}
120
 
121
const StartConversationModal = ({ show, setConversation }) => {
122
    const [search, setSearch] = useState('')
123
    const [isShow, setIsShow] = useState(show)
124
    const [inmailPersons, setInmailPersons] = useState([])
125
 
126
    const closeModal = () => setIsShow(false)
127
    const handleSearch = ({ target }) => setSearch(target.value)
128
 
129
    const searchUsers = async value => {
130
        try {
131
            const { data } = await axios.get('/helpers/search-people?search=' + value)
132
            if (data.success) setInmailPersons(data.data)
133
        } catch (error) {
134
            console.log('>>: error > ', error)
135
        }
4349 stevensc 136
    }
4347 stevensc 137
 
4354 stevensc 138
    const handleInmailPerson = uuid => {
139
        closeModal()
140
        axios.get(`/inmail/${uuid}`)
141
            .then(({ data }) => {
142
                if (data.success) {
143
                    const newConversation = data.data.find(conversation => conversation.uuid === uuid)
144
                    setConversation(newConversation)
145
                }
146
            })
147
    }
148
 
149
    useEffect(() => {
150
        searchUsers(search)
151
    }, [search]);
152
 
4358 stevensc 153
    useEffect(() => {
154
        setIsShow(show)
155
    }, [show])
156
 
821 stevensc 157
    return (
4354 stevensc 158
        <Modal
159
            show={isShow}
160
            onHide={closeModal}
161
        >
4358 stevensc 162
            <Modal.Header closeButton />
4354 stevensc 163
            <div className="card">
164
                <div className="card-body">
165
                    <h3 className="card-title font-weight-bold">Crear sala de Intercambio Profesional</h3>
166
                    <div className="form-group">
167
                        <label htmlFor="search-people">Escribe el nombre</label>
168
                        <input
169
                            type="email"
170
                            className="form-control"
171
                            id="search-people"
172
                            aria-describedby="Buscador de personas"
173
                            placeholder="Escribe el nombre de la persona"
174
                            onChange={handleSearch}
175
                        />
176
                    </div>
177
                    <div className='container'>
178
                        {inmailPersons.map((person) => {
179
                            return (
180
                                <div className='row' key={person.value}>
181
                                    <div className='col-8'>
182
                                        <p>{person.text}</p>
183
                                    </div>
184
                                    <div className='col-4'>
185
                                        <button
186
                                            className='btn btn-primary'
187
                                            onClick={() => handleInmailPerson(person.value)}
188
                                        >
189
                                            <i className='fa fa-check' />
190
                                        </button>
191
                                    </div>
192
                                </div>
193
                            )
194
                        })}
195
                    </div>
196
                </div>
197
            </div>
198
        </Modal>
1 www 199
    )
3769 stevensc 200
}
201
 
4354 stevensc 202
Sidebar.StartConversationModal = StartConversationModal
203
 
3769 stevensc 204
export default Sidebar