Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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