Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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