Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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