Proyectos de Subversion LeadersLinked - SPA

Rev

Autoría | Ultima modificación | Ver Log |

import React, { useState } from 'react'
import { Link, useNavigate } from 'react-router-dom'
import { useSelector } from 'react-redux'
import { AppBar, Box, Container, Toolbar } from '@mui/material'
import {
  Menu,
  Chat,
  Home,
  Sell,
  School,
  People,
  Groups,
  BusinessCenter,
  Search
} from '@mui/icons-material'

import { useNavbar } from '@hooks'

import MenuDrawer from './Drawer'
import NavigationItem from './navigation-item'
import UserOptions from './user-options'
import Input from '@components/UI/inputs/Input'

export default function Navbar() {
  const { menuData, totalMessages, totalNotifications } = useNavbar()

  const {
    menu = [],
    image = '',
    fullName,
    linkAdmin,
    linkImpersonate,
    linkKnowledgeArea,
    routeKnowledgeArea,
    routeAbuseReport,
    urlImpersonate,
    urlAdmin,
    defaultNetwork
  } = menuData

  const [showDrawer, setShowDrawer] = useState(false)
  const logo = useSelector(({ auth }) => auth.navbar_url)
  const labels = useSelector(({ intl }) => intl.labels)
  const navigate = useNavigate()
  const userAgent = navigator.userAgent
  const isIphone = /iPad|iPhone|iPod|Mac/.test(userAgent)

  const ICON_OPTIONS = [
    Home,
    People,
    BusinessCenter,
    Groups,
    Sell,
    Chat,
    School
  ]

  const handleSearch = ({ key, target }) => {
    if (key !== 'Enter') {
      return
    }

    navigate(`/search/entity/user?keyword=${target.value}`)
    target.value = ''
    target.blur()
  }

  return (
    <>
      <AppBar
        sx={{
          position: 'sticky',
          paddingTop: isIphone ? '50px' : '0',
          boxShadow: 'none',
          borderBottom: '1px solid var(--border-primary)'
        }}
      >
        <Container>
          <Toolbar
            sx={{
              gap: 2,
              minHeight: 'none',
              paddingLeft: 0,
              paddingRight: 0
            }}
          >
            <Box
              sx={{
                display: 'flex',
                alignItems: 'center',
                gap: { xs: 0, md: 2 },
                flexGrow: 1,
                '& img': {
                  display: { xs: 'none', md: 'block' },
                  height: { xs: '50px', md: '60px' },
                  width: { xs: '50px', md: '60px' }
                }
              }}
            >
              <Link to='/'>
                <img src={logo} alt='Logo' />
              </Link>
              <Input
                placeholder={labels.search}
                icon={<Search />}
                variant='search'
                onKeyDown={handleSearch}
              />
            </Box>

            <Box
              sx={{
                alignItems: 'center',
                display: 'flex',
                '& > ul': {
                  display: 'flex',
                  flex: 1,
                  justifyContent: 'space-evenly',
                  gap: { xs: 1, md: 2 },
                  '& > li': {
                    position: 'relative',
                    display: 'flex',
                    '&:not(:nth-last-child(-n + 4))': {
                      display: { xs: 'none', md: 'flex' }
                    },
                    '&:nth-last-child(-n + 1)': {
                      display: { xs: 'flex', md: 'none' }
                    }
                  }
                }
              }}
            >
              <ul>
                {menu.map(({ label, href, childs, ajax }, index) => {
                  const totalCount = totalNotifications + totalMessages
                  const Icon = ICON_OPTIONS[index]

                  return (
                    <NavigationItem
                      key={index}
                      url={href}
                      childs={childs}
                      count={label === 'Comunicación' ? totalCount : 0}
                    >
                      <Icon />
                      {label}
                    </NavigationItem>
                  )
                })}

                <UserOptions
                  image={image}
                  name={fullName}
                  adminUrl={linkAdmin}
                  impersonateUrl={linkImpersonate}
                  defaultNetwork={defaultNetwork}
                  knowledgeAuth={linkKnowledgeArea}
                  routeKnowledge={routeKnowledgeArea}
                  routeAdmin={urlAdmin}
                  routeImpersonate={urlImpersonate}
                  routeAbuseReport={routeAbuseReport}
                />

                <NavigationItem onClick={() => setShowDrawer(!showDrawer)}>
                  <Menu />
                </NavigationItem>
              </ul>
            </Box>
          </Toolbar>
        </Container>
      </AppBar>

      <MenuDrawer
        items={menu}
        icons={ICON_OPTIONS}
        isOpen={showDrawer}
        closeDrawer={() => setShowDrawer(false)}
      />
    </>
  )
}