Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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