Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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