Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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