Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6968 | Rev 6977 | 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'
3
import { useDispatch, useSelector } from 'react-redux'
4
import { addNotification } from '../../redux/notification/notification.actions'
5
import { Col, Container, Row } from 'react-bootstrap'
6
import QuestionAnswerRoundedIcon from '@mui/icons-material/QuestionAnswerRounded'
7
import SearchIcon from '@mui/icons-material/Search'
8
 
9
import EmptySection from '../../components/UI/EmptySection'
10
import InmailChat from '../../components/chat/InmailChat'
11
import Contacts from '../../components/chat/Contacts'
12
import StartConversationModal from '../../components/modals/StartConversationModal'
6968 stevensc 13
import { useParams } from 'react-router-dom'
6956 stevensc 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 () => {
36
    try {
37
      setLoading(true)
38
      const { data } = await axios.get(window.location.href)
39
      if (data.success) setConversations(data.data)
40
    } catch (error) {
41
      const errorMessage = new Error(error)
42
      dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))
43
    } finally {
44
      setLoading(false)
45
    }
46
  }
47
 
48
  const changeConversation = (conversation) => {
49
    setCurrentConversation(conversation)
50
  }
51
 
52
  const filterConversations = useCallback(
53
    () =>
54
      conversations.filter((conversation) =>
55
        conversation.name.toLowerCase().includes(search.toLowerCase())
56
      ),
57
 
58
    [search, conversations]
59
  )
60
 
61
  useEffect(() => {
62
    if (loading) return
63
 
64
    const messagesInterval = setTimeout(() => {
65
      getConversations()
66
    }, 2000)
67
 
68
    return () => {
69
      clearTimeout(messagesInterval)
70
    }
71
  }, [loading])
72
 
6968 stevensc 73
  useEffect(() => {
74
    if (uuid && conversations.length) {
75
      const conversation = conversations.find((c) => c.uuid === uuid)
76
 
77
      setCurrentConversation(conversation)
78
    }
79
  }, [conversations])
80
 
6956 stevensc 81
  return (
82
    <>
83
      <Container>
84
        <Row>
6976 stevensc 85
          <Col
86
            md="4"
87
            className={currentConversation ? 'd-sm-none d-md-flex' : 'd-flex'}
88
          >
6956 stevensc 89
            <Contacts>
6959 stevensc 90
              <Contacts.Header options={options.current}>
91
                <h1>Inmail</h1>
6956 stevensc 92
              </Contacts.Header>
93
 
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
104
                contacts={filterConversations()}
105
                onChange={changeConversation}
106
                currentConversation={currentConversation}
107
              />
108
            </Contacts>
109
          </Col>
6976 stevensc 110
          <Col
111
            md="8"
112
            className={currentConversation ? 'd-flex' : 'd-sm-none d-md-flex'}
113
          >
6956 stevensc 114
            {currentConversation ? (
115
              <InmailChat
116
                conversation={currentConversation}
117
                changeConversation={changeConversation}
118
              />
119
            ) : (
120
              <EmptySection
121
                message={labels.select_conversation}
122
                Icon={<QuestionAnswerRoundedIcon />}
123
                align="center"
124
              />
125
            )}
126
          </Col>
127
        </Row>
128
      </Container>
129
      <StartConversationModal
130
        show={showConversationModal}
131
        setConversation={changeConversation}
132
        onClose={toggleConversationModal}
133
      />
134
    </>
135
  )
136
}
137
 
138
export default InmailPage