Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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