Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 4844 | Rev 4924 | 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'
4243 stevensc 3
import SearchIcon from '@mui/icons-material/Search'
4
import HomeIcon from '@mui/icons-material/Home'
4252 stevensc 5
import BusinessCenterIcon from '@mui/icons-material/BusinessCenter'
6
import SellIcon from '@mui/icons-material/Sell';
7
import PeopleIcon from '@mui/icons-material/People';
8
import GroupsIcon from '@mui/icons-material/Groups';
9
import HeaderOptions from './HeaderOptions'
4243 stevensc 10
import ChatIcon from '@mui/icons-material/Chat'
11
import NotificationsIcon from '@mui/icons-material/Notifications'
4779 stevensc 12
import MenuIcon from '@mui/icons-material/Menu'
4250 stevensc 13
import UserOptions from './UserOptions'
4444 stevensc 14
import { useForm } from 'react-hook-form';
4630 stevensc 15
import NotificationsOption from './NotificationsOption';
4679 stevensc 16
import ComunicationOptions from './ComunicationOptions';
4779 stevensc 17
import MenuDrawer from './Drawer';
4432 stevensc 18
 
4791 stevensc 19
import './Header.scss'
20
 
4243 stevensc 21
const ICON_OPTIONS = [
22
  HomeIcon,
4252 stevensc 23
  PeopleIcon,
4243 stevensc 24
  BusinessCenterIcon,
4252 stevensc 25
  GroupsIcon,
26
  SellIcon,
4243 stevensc 27
]
28
 
4250 stevensc 29
const Header = ({
4629 stevensc 30
  menu,
4250 stevensc 31
  image = '',
32
  logoForNavbar = '',
33
  fullName,
4251 stevensc 34
  linkAdmin,
35
  linkImpersonate,
4444 stevensc 36
  //companyVars,
37
  //isChatPage,
4630 stevensc 38
  routeCheckSession,
4250 stevensc 39
}) => {
4629 stevensc 40
  const [menuItems, setMenuItems] = useState(menu || [])
41
  const [aditionalItems, setAditionalItems] = useState([])
4250 stevensc 42
  const [userImage, setUserImage] = useState(image)
4243 stevensc 43
  const [showMobileSearch, setShowMobileSearch] = useState(false)
4779 stevensc 44
  const [showDrawer, setShowDrawer] = useState(false)
4243 stevensc 45
  const [loading, setLoading] = useState(false);
4263 stevensc 46
  const searchInput = useRef(null);
4243 stevensc 47
 
4444 stevensc 48
  const { handleSubmit, register } = useForm()
49
  const handleOnSubmit = (data) => window.location.replace(`/search/entity/user?keyword=${data.keyword}`)
50
 
4250 stevensc 51
  const checkUserImage = async () => {
4243 stevensc 52
    setLoading(true);
53
    const session_image = sessionStorage.getItem('user_session_image')
54
    if (session_image) {
4250 stevensc 55
      await setUserImage(session_image)
4243 stevensc 56
      sessionStorage.removeItem('user_session_image')
57
    }
58
    setLoading(false);
59
  }
60
 
61
  const handleDisplayMobileSearch = () => {
4436 stevensc 62
    if (window.innerWidth < 992) {
4243 stevensc 63
      setShowMobileSearch(true)
64
    }
65
  }
66
 
4263 stevensc 67
  useEffect(() => {
4629 stevensc 68
    let timer;
69
    if (!loading) {
70
      timer = setTimeout(() => checkUserImage(), 1000);
71
    }
72
    return () => {
73
      clearTimeout(timer);
74
    };
75
  }, [loading])
76
 
77
  useEffect(() => {
78
    if (menu.length > 5) {
79
      setMenuItems(menu.splice(0, 5))
80
      setAditionalItems(menu.splice(menu.length - 5))
81
    }
82
  }, [])
83
 
84
  useEffect(() => {
4263 stevensc 85
    const handleClickOutside = (event) => {
4849 stevensc 86
      if (searchInput?.current && !searchInput?.current?.contains(event.target)) {
4263 stevensc 87
        setShowMobileSearch(false)
88
      }
89
    }
90
    document.addEventListener("mousedown", handleClickOutside);
91
 
92
    return () => {
93
      document.removeEventListener("mousedown", handleClickOutside);
94
    };
95
  }, [searchInput]);
96
 
4243 stevensc 97
  return (
4736 stevensc 98
    <>
99
      <div className='header'>
100
        <div className='container'>
101
          <div className='header__nav'>
4243 stevensc 102
 
4736 stevensc 103
            <div className='header__left'>
4743 stevensc 104
              <img src={logoForNavbar} alt='Logo' />
4736 stevensc 105
              <form
4743 stevensc 106
                className={`header__search show`}
4736 stevensc 107
                onClick={handleDisplayMobileSearch}
108
                onSubmit={handleSubmit(handleOnSubmit)}
109
                ref={searchInput}
110
              >
111
                <SearchIcon />
112
                <input
113
                  type='text'
114
                  placeholder='Search'
115
                  name='keyword'
116
                  ref={register}
117
                />
118
              </form>
119
            </div>
120
 
121
            <nav className={`header__right ${showMobileSearch && 'd-none'}`}>
122
              <ul>
123
                {menuItems.map((item, index) => {
124
                  return (
125
                    <HeaderOptions
126
                      key={index}
127
                      Icon={ICON_OPTIONS[index]}
128
                      title={item.label}
129
                      url={item.href}
130
                      childs={item.childs}
4844 stevensc 131
                      ajaxRequest={item.ajax}
4736 stevensc 132
                    />
133
                  )
134
                })}
135
                <NotificationsOption
136
                  Icon={NotificationsIcon}
137
                  title='Notificaciones'
138
                  url='/notifications'
139
                  sessionLink={routeCheckSession}
140
                />
141
                <ComunicationOptions
142
                  sessionLink={routeCheckSession}
143
                  Icon={ChatIcon}
144
                  title='Comunicación'
145
                  url=''
146
                  childs={[
147
                    ...aditionalItems,
148
                    { label: 'Inmail', href: '/inmail' },
149
                    { label: 'Chat', href: '/chat' }
150
                  ]}
151
                />
152
                <UserOptions
153
                  image={userImage}
154
                  name={fullName}
155
                  adminUrl={linkAdmin}
156
                  impersonateUrl={linkImpersonate}
157
                />
4779 stevensc 158
                <li className='d-md-none'>
159
                  <a
160
                    href='/'
4783 stevensc 161
                    className={`header__option mobile`}
4779 stevensc 162
                    onClick={(e) => {
163
                      e.preventDefault()
164
                      setShowDrawer(!showDrawer)
165
                    }}
166
                  >
167
                    <MenuIcon />
168
                  </a>
169
                </li>
4736 stevensc 170
              </ul>
171
            </nav>
4243 stevensc 172
          </div>
173
        </div>
174
      </div>
4779 stevensc 175
      <MenuDrawer items={menuItems} icons={ICON_OPTIONS} isOpen={showDrawer} closeDrawer={() => setShowDrawer(false)} />
4736 stevensc 176
    </>
4243 stevensc 177
  )
178
}
179
 
180
export default Header