Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6917 | Rev 6938 | 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'
6918 stevensc 4
import { Tab, Tabs } from '@mui/material'
6911 stevensc 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
    },
6916 stevensc 26
    { label: 'Crear grupo', action: () => setShowGroupModal(!showGroupModal) },
6911 stevensc 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(
6917 stevensc 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
 
6918 stevensc 89
        <Tabs value={tab} onChange={(e, newValue) => setTab(newValue)}>
6917 stevensc 90
          <Tab label="Personas" value="user" />
91
          <Tab label="Grupos" value="group" />
92
        </Tabs>
6916 stevensc 93
 
6911 stevensc 94
        <div className="contact__search show">
95
          <SearchIcon />
96
          <input
97
            type="text"
98
            placeholder="Buscar"
99
            onChange={(e) => setSearch(e.target.value)}
100
          />
101
        </div>
102
 
103
        <Contacts.List
6915 stevensc 104
          contacts={filterConversations(getConversations())}
105
          selectConversation={changeConversation}
6911 stevensc 106
        />
107
      </aside>
108
      <ContactsModal
109
        show={showContactModal}
110
        onClose={() => setShowContactModal(false)}
111
        onComplete={onCreateConversation}
112
      />
113
      <CreateGroupModal
114
        isOpen={showGroupModal}
115
        onClose={() => setShowGroupModal(false)}
116
      />
117
    </>
118
  )
119
}
120
 
121
const List = ({ contacts = [], selectConversation = () => null }) => {
122
  const labels = useSelector(({ intl }) => intl.labels)
123
 
124
  return (
125
    <div className="contacts-list">
126
      <ul>
127
        {!contacts.length ? (
128
          <EmptySection message={labels.datatable_szerorecords} />
129
        ) : (
130
          contacts.map((contact) => (
131
            <li key={contact.id}>
132
              <List.Item contact={contact} onClick={selectConversation} />
133
            </li>
134
          ))
135
        )}
136
      </ul>
137
    </div>
138
  )
139
}
140
 
141
const Item = ({ contact, onClick }) => {
142
  const labels = useSelector(({ intl }) => intl.labels)
143
 
144
  return (
145
    <div className="contacts-list__item">
146
      <img
147
        className="chat-image img-circle"
148
        height="36"
149
        width="36"
150
        src={contact.image || '/images/users-group.png'}
151
        alt="image-image"
152
      />
153
      <div className="contacts-list__item-content">
154
        <span onClick={() => onClick(contact)}>{contact.name}</span>
155
        {contact.last_message && (
156
          <p>
157
            {`${contact.count_not_seen_messages} ${labels.new_messages} |
158
            ${contact.last_message}`}
159
          </p>
160
        )}
161
      </div>
162
    </div>
163
  )
164
}
165
 
166
List.Item = Item
167
Contacts.List = List
168
 
169
export default Contacts