Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6913 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
6911 stevensc 1
import React, { useCallback, useEffect, useState } from 'react'
2
import { axios } from '../../utils'
3
import { Button, Row } from 'react-bootstrap'
4
import { useSelector } from 'react-redux'
5
import SearchIcon from '@mui/icons-material/Search'
6
 
7
import Options from '../UI/Option'
8
import EmptySection from '../UI/EmptySection'
9
import ContactsModal from '../modals/ContactsModal'
10
import CreateGroupModal from '../modals/CreateGroupModal'
11
 
12
const notifyAudio = new Audio('/audio/chat.mp3')
13
 
14
const Contacts = ({ selectedConversation, changeConversation }) => {
15
  const [showContactModal, setShowContactModal] = useState(false)
16
  const [showGroupModal, setShowGroupModal] = useState(false)
17
  const [conversations, setConversations] = useState()
18
  const [search, setSearch] = useState('')
19
  const [tab, setTab] = useState('user')
20
 
21
  const options = [
22
    {
23
      label: 'Iniciar conversación',
24
      action: () => setShowContactModal(!showContactModal),
25
    },
26
    { label: 'Crear grupo', action: () => setShowGroupModal(true) },
27
  ]
28
 
29
  const onCreateConversation = (url) => {
30
    const conversation = conversations.find((user) => user.url_send === url)
31
    changeConversation(conversation)
32
  }
33
 
34
  const heartBeat = async () => {
35
    axios.get('/chat/heart-beat').then((response) => {
36
      const { data: entities, success } = response.data
37
 
38
      if (!success) {
39
        return
40
      }
41
 
42
      entities.map(
43
        (entity) =>
44
          entity.not_received_messages &&
45
          playNewMessage(entity.url_mark_received)
46
      )
47
 
48
      setConversations(entities)
49
    })
50
  }
51
 
52
  const playNewMessage = async (url) => {
53
    notifyAudio.play()
54
    const { data } = await axios.post(url)
55
    return data.success
56
  }
57
 
58
  const getConversations = useCallback(
59
    () => conversations.filter((conversation) => conversation.type === tab),
60
    [tab]
61
  )
62
 
63
  const filterConversations = useCallback(
64
    (conversations) =>
65
      conversations.filter((conversation) =>
66
        conversation.name.toLowerCase().includes(search.toLowerCase())
67
      ),
68
 
69
    [search]
70
  )
71
 
72
  useEffect(() => {
73
    const heartBeatInterval = setInterval(heartBeat, 3000)
74
    heartBeat()
75
 
76
    return () => {
77
      clearInterval(heartBeatInterval)
78
    }
79
  }, [])
80
 
81
  return (
82
    <>
83
      <aside className="chat_contacts">
84
        <div className="position-relative">
85
          <h1>Chat</h1>
86
          <Options options={options} />
87
        </div>
88
 
89
        <Row>
90
          <Button
91
            className={tab === 'user' && 'active-tab'}
92
            onClick={() => setTab('user')}
93
          >
94
            Personas
95
          </Button>
96
          <Button
97
            className={tab === 'group' && 'active-tab'}
98
            onClick={() => setTab('group')}
99
          >
100
            Grupos
101
          </Button>
102
        </Row>
103
        <div className="contact__search show">
104
          <SearchIcon />
105
          <input
106
            type="text"
107
            placeholder="Buscar"
108
            onChange={(e) => setSearch(e.target.value)}
109
          />
110
        </div>
111
 
112
        <Contacts.List
113
          conversations={filterConversations(getConversations())}
114
          selectedConversation={selectedConversation}
115
          onClick={changeConversation}
116
        />
117
      </aside>
118
      <ContactsModal
119
        show={showContactModal}
120
        onClose={() => setShowContactModal(false)}
121
        onComplete={onCreateConversation}
122
      />
123
      <CreateGroupModal
124
        isOpen={showGroupModal}
125
        onClose={() => setShowGroupModal(false)}
126
      />
127
    </>
128
  )
129
}
130
 
131
const List = ({ contacts = [], selectConversation = () => null }) => {
132
  const labels = useSelector(({ intl }) => intl.labels)
133
 
134
  return (
135
    <div className="contacts-list">
136
      <ul>
137
        {!contacts.length ? (
138
          <EmptySection message={labels.datatable_szerorecords} />
139
        ) : (
140
          contacts.map((contact) => (
141
            <li key={contact.id}>
142
              <List.Item contact={contact} onClick={selectConversation} />
143
            </li>
144
          ))
145
        )}
146
      </ul>
147
    </div>
148
  )
149
}
150
 
151
const Item = ({ contact, onClick }) => {
152
  const labels = useSelector(({ intl }) => intl.labels)
153
 
154
  return (
155
    <div className="contacts-list__item">
156
      <img
157
        className="chat-image img-circle"
158
        height="36"
159
        width="36"
160
        src={contact.image || '/images/users-group.png'}
161
        alt="image-image"
162
      />
163
      <div className="contacts-list__item-content">
164
        <span onClick={() => onClick(contact)}>{contact.name}</span>
165
        {contact.last_message && (
166
          <p>
167
            {`${contact.count_not_seen_messages} ${labels.new_messages} |
168
            ${contact.last_message}`}
169
          </p>
170
        )}
171
      </div>
172
    </div>
173
  )
174
}
175
 
176
List.Item = Item
177
Contacts.List = List
178
 
179
export default Contacts