Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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