Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
5260 stevensc 1
/* eslint-disable camelcase */
4243 stevensc 2
/* eslint-disable react/prop-types */
4263 stevensc 3
import React, { useEffect, useRef, useState } from 'react'
4948 stevensc 4
import { axios, useWindowSize } from '../../../utils'
5
import { useForm } from 'react-hook-form'
6
 
4243 stevensc 7
import SearchIcon from '@mui/icons-material/Search'
8
import HomeIcon from '@mui/icons-material/Home'
4252 stevensc 9
import BusinessCenterIcon from '@mui/icons-material/BusinessCenter'
4946 stevensc 10
import SellIcon from '@mui/icons-material/Sell'
11
import PeopleIcon from '@mui/icons-material/People'
12
import GroupsIcon from '@mui/icons-material/Groups'
4243 stevensc 13
import ChatIcon from '@mui/icons-material/Chat'
4779 stevensc 14
import MenuIcon from '@mui/icons-material/Menu'
4948 stevensc 15
 
16
import HeaderOptions from './HeaderOptions'
4250 stevensc 17
import UserOptions from './UserOptions'
4432 stevensc 18
 
4791 stevensc 19
import './Header.scss'
5256 stevensc 20
let MenuDrawer
4791 stevensc 21
 
4243 stevensc 22
const ICON_OPTIONS = [
23
  HomeIcon,
4252 stevensc 24
  PeopleIcon,
4243 stevensc 25
  BusinessCenterIcon,
4252 stevensc 26
  GroupsIcon,
6014 stevensc 27
  SellIcon,
4243 stevensc 28
]
29
 
4250 stevensc 30
const Header = ({
4629 stevensc 31
  menu,
4250 stevensc 32
  image = '',
33
  logoForNavbar = '',
34
  fullName,
4251 stevensc 35
  linkAdmin,
36
  linkImpersonate,
6159 stevensc 37
  linkKnowledgeArea,
38
  routeKnowledgeArea,
5256 stevensc 39
  // companyVars,
40
  // isChatPage,
4630 stevensc 41
  routeCheckSession,
6014 stevensc 42
  defaultNetwork,
4250 stevensc 43
}) => {
4629 stevensc 44
  const [menuItems, setMenuItems] = useState(menu || [])
4946 stevensc 45
  const [notificationsCount, setNotificationsCount] = useState(0)
4629 stevensc 46
  const [aditionalItems, setAditionalItems] = useState([])
4946 stevensc 47
  const [messagesCount, setMessagesCount] = useState(0)
4250 stevensc 48
  const [userImage, setUserImage] = useState(image)
4946 stevensc 49
 
4243 stevensc 50
  const [showMobileSearch, setShowMobileSearch] = useState(false)
4779 stevensc 51
  const [showDrawer, setShowDrawer] = useState(false)
4946 stevensc 52
  const [loading, setLoading] = useState(false)
4243 stevensc 53
 
4948 stevensc 54
  const [innerWidth] = useWindowSize()
55
 
4946 stevensc 56
  const searchInput = useRef(null)
57
 
4444 stevensc 58
  const { handleSubmit, register } = useForm()
4946 stevensc 59
 
6014 stevensc 60
  const handleOnSubmit = (data) =>
61
    window.location.replace(`/search/entity/user?keyword=${data.keyword}`)
4444 stevensc 62
 
4250 stevensc 63
  const checkUserImage = async () => {
4946 stevensc 64
    setLoading(true)
4243 stevensc 65
    const session_image = sessionStorage.getItem('user_session_image')
66
    if (session_image) {
4250 stevensc 67
      await setUserImage(session_image)
4243 stevensc 68
      sessionStorage.removeItem('user_session_image')
69
    }
4946 stevensc 70
    setLoading(false)
4243 stevensc 71
  }
72
 
4946 stevensc 73
  const checkSession = async () => {
74
    try {
75
      setLoading(true)
76
      const { data: response } = await axios.get(routeCheckSession)
77
      const { total_messages, total_notifications } = response.data
78
 
79
      if (response.success) {
80
        setMessagesCount(Number(total_messages))
81
        setNotificationsCount(Number(total_notifications))
82
      }
83
      setLoading(false)
84
    } catch (error) {
85
      console.log(error)
86
    }
87
  }
88
 
4243 stevensc 89
  const handleDisplayMobileSearch = () => {
4436 stevensc 90
    if (window.innerWidth < 992) {
4243 stevensc 91
      setShowMobileSearch(true)
92
    }
93
  }
94
 
4263 stevensc 95
  useEffect(() => {
4946 stevensc 96
    let timer
4629 stevensc 97
    if (!loading) {
4946 stevensc 98
      timer = setTimeout(() => {
99
        checkUserImage()
100
        checkSession()
5360 stevensc 101
      }, 2000)
4629 stevensc 102
    }
103
    return () => {
4946 stevensc 104
      clearTimeout(timer)
105
    }
4629 stevensc 106
  }, [loading])
107
 
108
  useEffect(() => {
109
    if (menu.length > 5) {
110
      setMenuItems(menu.splice(0, 5))
111
      setAditionalItems(menu.splice(menu.length - 5))
112
    }
113
  }, [])
114
 
115
  useEffect(() => {
4948 stevensc 116
    if (innerWidth < 992) {
117
      MenuDrawer = React.lazy(() => import('./Drawer'))
118
    }
119
  }, [innerWidth])
120
 
121
  useEffect(() => {
4263 stevensc 122
    const handleClickOutside = (event) => {
6014 stevensc 123
      if (
124
        searchInput?.current &&
125
        !searchInput?.current?.contains(event.target)
126
      ) {
4263 stevensc 127
        setShowMobileSearch(false)
128
      }
129
    }
5256 stevensc 130
    document.addEventListener('mousedown', handleClickOutside)
4263 stevensc 131
 
132
    return () => {
5256 stevensc 133
      document.removeEventListener('mousedown', handleClickOutside)
4946 stevensc 134
    }
135
  }, [searchInput])
4263 stevensc 136
 
4243 stevensc 137
  return (
4736 stevensc 138
    <>
6014 stevensc 139
      <div className="header">
140
        <div className="container px-0">
141
          <div className="header__nav">
4924 stevensc 142
            <div className={`header__left ${showMobileSearch && 'show'}`}>
5256 stevensc 143
              <a href="/">
6014 stevensc 144
                <img src={logoForNavbar} alt="Logo" />
5256 stevensc 145
              </a>
5259 stevensc 146
 
4736 stevensc 147
              <form
6014 stevensc 148
                className="header__search show"
4736 stevensc 149
                onClick={handleDisplayMobileSearch}
150
                onSubmit={handleSubmit(handleOnSubmit)}
151
                ref={searchInput}
152
              >
153
                <SearchIcon />
154
                <input
6014 stevensc 155
                  type="text"
156
                  placeholder="Search"
157
                  name="keyword"
4736 stevensc 158
                  ref={register}
159
                />
160
              </form>
161
            </div>
162
 
163
            <nav className={`header__right ${showMobileSearch && 'd-none'}`}>
164
              <ul>
165
                {menuItems.map((item, index) => {
166
                  return (
167
                    <HeaderOptions
168
                      key={index}
169
                      Icon={ICON_OPTIONS[index]}
170
                      title={item.label}
171
                      url={item.href}
172
                      childs={item.childs}
4844 stevensc 173
                      ajaxRequest={item.ajax}
4736 stevensc 174
                    />
175
                  )
176
                })}
4946 stevensc 177
                <HeaderOptions
4736 stevensc 178
                  Icon={ChatIcon}
6014 stevensc 179
                  title="Comunicación"
4736 stevensc 180
                  childs={[
181
                    ...aditionalItems,
4946 stevensc 182
                    { label: 'Inmail', href: '/inmail', count: messagesCount },
6014 stevensc 183
                    { label: 'Chat', href: '/chat' },
6470 stevensc 184
                    {
185
                      label: 'Notificaciones',
186
                      href: '/notifications',
187
                      count: notificationsCount,
188
                    },
4736 stevensc 189
                  ]}
4946 stevensc 190
                  isMobile={true}
4736 stevensc 191
                />
192
                <UserOptions
193
                  image={userImage}
194
                  name={fullName}
195
                  adminUrl={linkAdmin}
196
                  impersonateUrl={linkImpersonate}
4964 stevensc 197
                  defaultNetwork={defaultNetwork}
6159 stevensc 198
                  knowledgeAuth={linkKnowledgeArea}
199
                  routeKnowledge={routeKnowledgeArea}
4736 stevensc 200
                />
6014 stevensc 201
                {MenuDrawer && (
202
                  <li className="d-md-none">
4954 stevensc 203
                    <a
6014 stevensc 204
                      href="/"
5256 stevensc 205
                      className={'header__option mobile'}
4954 stevensc 206
                      onClick={(e) => {
207
                        e.preventDefault()
208
                        setShowDrawer(!showDrawer)
209
                      }}
210
                    >
211
                      <MenuIcon />
212
                    </a>
213
                  </li>
6014 stevensc 214
                )}
4736 stevensc 215
              </ul>
216
            </nav>
4243 stevensc 217
          </div>
218
        </div>
219
      </div>
6014 stevensc 220
      {MenuDrawer && (
4950 stevensc 221
        <React.Suspense fallback={null}>
4949 stevensc 222
          <MenuDrawer
223
            items={menuItems}
224
            icons={ICON_OPTIONS}
225
            isOpen={showDrawer}
226
            closeDrawer={() => setShowDrawer(false)}
227
          />
228
        </React.Suspense>
6014 stevensc 229
      )}
4736 stevensc 230
    </>
4243 stevensc 231
  )
232
}
233
 
234
export default Header