Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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