Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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