Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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