Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6985 | Rev 6989 | 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
 
6987 stevensc 66
        setConversations(resConversations)
6984 stevensc 67
      })
68
      .catch((error) => {
69
        const errorMessage = new Error(error)
70
        dispatch(
71
          addNotification({ style: 'danger', msg: errorMessage.message })
72
        )
73
      })
74
      .finally(() => setLoading(false))
6956 stevensc 75
  }
76
 
77
  const changeConversation = (conversation) => {
78
    setCurrentConversation(conversation)
79
  }
80
 
81
  const filterConversations = useCallback(
82
    () =>
83
      conversations.filter((conversation) =>
84
        conversation.name.toLowerCase().includes(search.toLowerCase())
85
      ),
86
 
87
    [search, conversations]
88
  )
89
 
90
  useEffect(() => {
91
    if (loading) return
92
 
93
    const messagesInterval = setTimeout(() => {
94
      getConversations()
95
    }, 2000)
96
 
97
    return () => {
98
      clearTimeout(messagesInterval)
99
    }
100
  }, [loading])
101
 
6968 stevensc 102
  useEffect(() => {
6985 stevensc 103
    if (uuid && !currentConversation) {
6968 stevensc 104
      const conversation = conversations.find((c) => c.uuid === uuid)
6980 stevensc 105
      conversation && setCurrentConversation(conversation)
6968 stevensc 106
    }
6980 stevensc 107
  }, [conversations, uuid])
6968 stevensc 108
 
6956 stevensc 109
  return (
110
    <>
111
      <Container>
112
        <Row>
6976 stevensc 113
          <Col
114
            md="4"
6977 stevensc 115
            className={currentConversation ? 'd-none d-md-flex' : 'd-flex'}
6976 stevensc 116
          >
6956 stevensc 117
            <Contacts>
6959 stevensc 118
              <Contacts.Header options={options.current}>
119
                <h1>Inmail</h1>
6956 stevensc 120
              </Contacts.Header>
121
 
122
              <div className="contact__search show">
123
                <SearchIcon />
124
                <input
125
                  type="text"
126
                  placeholder="Buscar"
127
                  onChange={(e) => setSearch(e.target.value)}
128
                />
129
              </div>
130
 
131
              <Contacts.List
132
                contacts={filterConversations()}
133
                onChange={changeConversation}
134
                currentConversation={currentConversation}
135
              />
136
            </Contacts>
137
          </Col>
6976 stevensc 138
          <Col
139
            md="8"
6977 stevensc 140
            className={currentConversation ? 'd-flex' : 'd-none d-md-flex'}
6976 stevensc 141
          >
6956 stevensc 142
            {currentConversation ? (
143
              <InmailChat
144
                conversation={currentConversation}
145
                changeConversation={changeConversation}
146
              />
147
            ) : (
148
              <EmptySection
149
                message={labels.select_conversation}
150
                Icon={<QuestionAnswerRoundedIcon />}
151
                align="center"
152
              />
153
            )}
154
          </Col>
155
        </Row>
156
      </Container>
157
      <StartConversationModal
158
        show={showConversationModal}
159
        setConversation={changeConversation}
160
        onClose={toggleConversationModal}
161
      />
162
    </>
163
  )
164
}
165
 
166
export default InmailPage