Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6984 | Rev 6987 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
6956 stevensc 1
import React, { useCallback, useEffect, useRef, useState } from 'react'
2
import { axios } from '../../utils'
6981 stevensc 3
import { useParams } from 'react-router-dom'
6956 stevensc 4
import { addNotification } from '../../redux/notification/notification.actions'
5
import { Col, Container, Row } from 'react-bootstrap'
6981 stevensc 6
import { useDispatch, useSelector } from 'react-redux'
6956 stevensc 7
import QuestionAnswerRoundedIcon from '@mui/icons-material/QuestionAnswerRounded'
8
import SearchIcon from '@mui/icons-material/Search'
9
 
10
import EmptySection from '../../components/UI/EmptySection'
11
import InmailChat from '../../components/chat/InmailChat'
12
import Contacts from '../../components/chat/Contacts'
13
import StartConversationModal from '../../components/modals/StartConversationModal'
14
 
15
const InmailPage = () => {
16
  const [conversations, setConversations] = useState([])
17
  const [currentConversation, setCurrentConversation] = useState(null)
18
  const [search, setSearch] = useState('')
19
  const [loading, setLoading] = useState(false)
20
  const [showConversationModal, setShowConversationModal] = useState(false)
21
  const options = useRef([
22
    {
23
      label: 'Iniciar conversación',
24
      action: () => toggleConversationModal(),
25
    },
26
  ])
6968 stevensc 27
  const { uuid } = useParams()
6956 stevensc 28
  const labels = useSelector(({ intl }) => intl.labels)
29
  const dispatch = useDispatch()
30
 
31
  const toggleConversationModal = () => {
32
    setShowConversationModal(!showConversationModal)
33
  }
34
 
35
  const getConversations = async () => {
6984 stevensc 36
    setLoading(true)
37
    axios
38
      .get(window.location.href)
39
      .then((response) => {
40
        const { data, success } = response.data
41
 
42
        if (!success) {
43
          return
44
        }
45
 
46
        const resConversations = data
47
        const newConversations = resConversations.reduce(
48
          (acum, conversation) => {
49
            const messageIndex = conversations.findIndex(
6985 stevensc 50
              ({ uuid }) => uuid === conversation.uuid
6984 stevensc 51
            )
52
 
53
            if (messageIndex === -1) {
54
              acum = [...acum, conversation]
55
            }
56
 
57
            return acum
58
          },
59
          []
60
        )
61
 
62
        if (!newConversations.length) {
63
          return
64
        }
65
 
66
        setConversations((prevConversations) => [
67
          ...newConversations,
68
          ...prevConversations,
69
        ])
70
      })
71
      .catch((error) => {
72
        const errorMessage = new Error(error)
73
        dispatch(
74
          addNotification({ style: 'danger', msg: errorMessage.message })
75
        )
76
      })
77
      .finally(() => setLoading(false))
6956 stevensc 78
  }
79
 
80
  const changeConversation = (conversation) => {
81
    setCurrentConversation(conversation)
82
  }
83
 
84
  const filterConversations = useCallback(
85
    () =>
86
      conversations.filter((conversation) =>
87
        conversation.name.toLowerCase().includes(search.toLowerCase())
88
      ),
89
 
90
    [search, conversations]
91
  )
92
 
93
  useEffect(() => {
94
    if (loading) return
95
 
96
    const messagesInterval = setTimeout(() => {
97
      getConversations()
98
    }, 2000)
99
 
100
    return () => {
101
      clearTimeout(messagesInterval)
102
    }
103
  }, [loading])
104
 
6968 stevensc 105
  useEffect(() => {
6985 stevensc 106
    if (uuid && !currentConversation) {
6968 stevensc 107
      const conversation = conversations.find((c) => c.uuid === uuid)
6980 stevensc 108
      conversation && setCurrentConversation(conversation)
6968 stevensc 109
    }
6980 stevensc 110
  }, [conversations, uuid])
6968 stevensc 111
 
6956 stevensc 112
  return (
113
    <>
114
      <Container>
115
        <Row>
6976 stevensc 116
          <Col
117
            md="4"
6977 stevensc 118
            className={currentConversation ? 'd-none d-md-flex' : 'd-flex'}
6976 stevensc 119
          >
6956 stevensc 120
            <Contacts>
6959 stevensc 121
              <Contacts.Header options={options.current}>
122
                <h1>Inmail</h1>
6956 stevensc 123
              </Contacts.Header>
124
 
125
              <div className="contact__search show">
126
                <SearchIcon />
127
                <input
128
                  type="text"
129
                  placeholder="Buscar"
130
                  onChange={(e) => setSearch(e.target.value)}
131
                />
132
              </div>
133
 
134
              <Contacts.List
135
                contacts={filterConversations()}
136
                onChange={changeConversation}
137
                currentConversation={currentConversation}
138
              />
139
            </Contacts>
140
          </Col>
6976 stevensc 141
          <Col
142
            md="8"
6977 stevensc 143
            className={currentConversation ? 'd-flex' : 'd-none d-md-flex'}
6976 stevensc 144
          >
6956 stevensc 145
            {currentConversation ? (
146
              <InmailChat
147
                conversation={currentConversation}
148
                changeConversation={changeConversation}
149
              />
150
            ) : (
151
              <EmptySection
152
                message={labels.select_conversation}
153
                Icon={<QuestionAnswerRoundedIcon />}
154
                align="center"
155
              />
156
            )}
157
          </Col>
158
        </Row>
159
      </Container>
160
      <StartConversationModal
161
        show={showConversationModal}
162
        setConversation={changeConversation}
163
        onClose={toggleConversationModal}
164
      />
165
    </>
166
  )
167
}
168
 
169
export default InmailPage