Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6977 | Rev 6981 | 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(() => {
6980 stevensc 74
    if (uuid) {
6968 stevensc 75
      const conversation = conversations.find((c) => c.uuid === uuid)
6980 stevensc 76
      conversation && setCurrentConversation(conversation)
6968 stevensc 77
    }
6980 stevensc 78
  }, [conversations, uuid])
6968 stevensc 79
 
6956 stevensc 80
  return (
81
    <>
82
      <Container>
83
        <Row>
6976 stevensc 84
          <Col
85
            md="4"
6977 stevensc 86
            className={currentConversation ? 'd-none d-md-flex' : 'd-flex'}
6976 stevensc 87
          >
6956 stevensc 88
            <Contacts>
6959 stevensc 89
              <Contacts.Header options={options.current}>
90
                <h1>Inmail</h1>
6956 stevensc 91
              </Contacts.Header>
92
 
93
              <div className="contact__search show">
94
                <SearchIcon />
95
                <input
96
                  type="text"
97
                  placeholder="Buscar"
98
                  onChange={(e) => setSearch(e.target.value)}
99
                />
100
              </div>
101
 
102
              <Contacts.List
103
                contacts={filterConversations()}
104
                onChange={changeConversation}
105
                currentConversation={currentConversation}
106
              />
107
            </Contacts>
108
          </Col>
6976 stevensc 109
          <Col
110
            md="8"
6977 stevensc 111
            className={currentConversation ? 'd-flex' : 'd-none d-md-flex'}
6976 stevensc 112
          >
6956 stevensc 113
            {currentConversation ? (
114
              <InmailChat
115
                conversation={currentConversation}
116
                changeConversation={changeConversation}
117
              />
118
            ) : (
119
              <EmptySection
120
                message={labels.select_conversation}
121
                Icon={<QuestionAnswerRoundedIcon />}
122
                align="center"
123
              />
124
            )}
125
          </Col>
126
        </Row>
127
      </Container>
128
      <StartConversationModal
129
        show={showConversationModal}
130
        setConversation={changeConversation}
131
        onClose={toggleConversationModal}
132
      />
133
    </>
134
  )
135
}
136
 
137
export default InmailPage