Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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