Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6915 | Rev 6917 | 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'
6916 stevensc 11
import { BottomNavigation, BottomNavigationAction } from '@mui/material'
6911 stevensc 12
 
13
const notifyAudio = new Audio('/audio/chat.mp3')
14
 
15
const Contacts = ({ selectedConversation, changeConversation }) => {
16
  const [showContactModal, setShowContactModal] = useState(false)
17
  const [showGroupModal, setShowGroupModal] = useState(false)
6913 stevensc 18
  const [conversations, setConversations] = useState([])
6911 stevensc 19
  const [search, setSearch] = useState('')
20
  const [tab, setTab] = useState('user')
21
 
22
  const options = [
23
    {
24
      label: 'Iniciar conversación',
25
      action: () => setShowContactModal(!showContactModal),
26
    },
6916 stevensc 27
    { label: 'Crear grupo', action: () => setShowGroupModal(!showGroupModal) },
6911 stevensc 28
  ]
29
 
30
  const onCreateConversation = (url) => {
31
    const conversation = conversations.find((user) => user.url_send === url)
32
    changeConversation(conversation)
33
  }
34
 
35
  const heartBeat = async () => {
36
    axios.get('/chat/heart-beat').then((response) => {
37
      const { data: entities, success } = response.data
38
 
39
      if (!success) {
40
        return
41
      }
42
 
43
      entities.map(
44
        (entity) =>
45
          entity.not_received_messages &&
46
          playNewMessage(entity.url_mark_received)
47
      )
48
 
49
      setConversations(entities)
50
    })
51
  }
52
 
53
  const playNewMessage = async (url) => {
54
    notifyAudio.play()
55
    const { data } = await axios.post(url)
56
    return data.success
57
  }
58
 
59
  const getConversations = useCallback(
6916 stevensc 60
    () =>
61
      conversations.filter((conversation) =>
62
        tab === 'Personas'
63
          ? conversation.type === 'user'
64
          : conversation.type === 'group'
65
      ),
6914 stevensc 66
    [tab, conversations]
6911 stevensc 67
  )
68
 
69
  const filterConversations = useCallback(
70
    (conversations) =>
71
      conversations.filter((conversation) =>
72
        conversation.name.toLowerCase().includes(search.toLowerCase())
73
      ),
74
 
75
    [search]
76
  )
77
 
78
  useEffect(() => {
79
    const heartBeatInterval = setInterval(heartBeat, 3000)
80
    heartBeat()
81
 
82
    return () => {
83
      clearInterval(heartBeatInterval)
84
    }
85
  }, [])
86
 
87
  return (
88
    <>
89
      <aside className="chat_contacts">
90
        <div className="position-relative">
91
          <h1>Chat</h1>
92
          <Options options={options} />
93
        </div>
94
 
6916 stevensc 95
        <BottomNavigation
96
          showLabels
97
          value={tab}
98
          onChange={(event, newValue) => setTab(newValue)}
99
        >
100
          <BottomNavigationAction label="Personas" />
101
          <BottomNavigationAction label="Grupos" />
102
        </BottomNavigation>
103
 
6911 stevensc 104
        <div className="contact__search show">
105
          <SearchIcon />
106
          <input
107
            type="text"
108
            placeholder="Buscar"
109
            onChange={(e) => setSearch(e.target.value)}
110
          />
111
        </div>
112
 
113
        <Contacts.List
6915 stevensc 114
          contacts={filterConversations(getConversations())}
115
          selectConversation={changeConversation}
6911 stevensc 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