Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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