Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6914 | Rev 6916 | Ir a la última revisión | | Comparar con el anterior | 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)
6913 stevensc 17
  const [conversations, setConversations] = useState([])
6911 stevensc 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),
6914 stevensc 60
    [tab, conversations]
6911 stevensc 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
6915 stevensc 113
          contacts={filterConversations(getConversations())}
114
          selectConversation={changeConversation}
6911 stevensc 115
        />
116
      </aside>
117
      <ContactsModal
118
        show={showContactModal}
119
        onClose={() => setShowContactModal(false)}
120
        onComplete={onCreateConversation}
121
      />
122
      <CreateGroupModal
123
        isOpen={showGroupModal}
124
        onClose={() => setShowGroupModal(false)}
125
      />
126
    </>
127
  )
128
}
129
 
130
const List = ({ contacts = [], selectConversation = () => null }) => {
131
  const labels = useSelector(({ intl }) => intl.labels)
132
 
133
  return (
134
    <div className="contacts-list">
135
      <ul>
136
        {!contacts.length ? (
137
          <EmptySection message={labels.datatable_szerorecords} />
138
        ) : (
139
          contacts.map((contact) => (
140
            <li key={contact.id}>
141
              <List.Item contact={contact} onClick={selectConversation} />
142
            </li>
143
          ))
144
        )}
145
      </ul>
146
    </div>
147
  )
148
}
149
 
150
const Item = ({ contact, onClick }) => {
151
  const labels = useSelector(({ intl }) => intl.labels)
152
 
153
  return (
154
    <div className="contacts-list__item">
155
      <img
156
        className="chat-image img-circle"
157
        height="36"
158
        width="36"
159
        src={contact.image || '/images/users-group.png'}
160
        alt="image-image"
161
      />
162
      <div className="contacts-list__item-content">
163
        <span onClick={() => onClick(contact)}>{contact.name}</span>
164
        {contact.last_message && (
165
          <p>
166
            {`${contact.count_not_seen_messages} ${labels.new_messages} |
167
            ${contact.last_message}`}
168
          </p>
169
        )}
170
      </div>
171
    </div>
172
  )
173
}
174
 
175
List.Item = Item
176
Contacts.List = List
177
 
178
export default Contacts