Proyectos de Subversion LeadersLinked - SPA

Rev

Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3436 stevensc 1
import React, { useState } from 'react';
3435 stevensc 2
import { Link, useNavigate } from 'react-router-dom';
3
import { useSelector } from 'react-redux';
4
import { AppBar, Box, Container, Toolbar } from '@mui/material';
3201 stevensc 5
import {
6
  Menu,
7
  Chat,
8
  Home,
9
  Sell,
10
  School,
11
  People,
12
  Groups,
13
  BusinessCenter,
14
  Search
3435 stevensc 15
} from '@mui/icons-material';
3201 stevensc 16
 
3435 stevensc 17
import { useNavbar } from '@hooks';
3201 stevensc 18
 
3435 stevensc 19
import MenuDrawer from './Drawer';
20
import NavigationItem from './navigation-item';
21
import UserOptions from './user-options';
22
import Input from '@components/UI/inputs/Input';
3201 stevensc 23
 
24
export default function Navbar() {
3435 stevensc 25
  const { menuData } = useNavbar();
3201 stevensc 26
 
27
  const {
28
    menu = [],
29
    image = '',
30
    fullName,
31
    linkAdmin,
32
    linkImpersonate,
33
    linkKnowledgeArea,
34
    routeKnowledgeArea,
35
    routeAbuseReport,
36
    urlImpersonate,
37
    urlAdmin,
38
    defaultNetwork
3435 stevensc 39
  } = menuData;
3201 stevensc 40
 
3693 stevensc 41
  const [showMenu, setShowMenu] = useState(false);
3435 stevensc 42
  const logo = useSelector(({ auth }) => auth.navbar_url);
43
  const labels = useSelector(({ intl }) => intl.labels);
44
  const navigate = useNavigate();
45
  const userAgent = navigator.userAgent;
46
  const isIphone = /iPad|iPhone|iPod|Mac/.test(userAgent);
3201 stevensc 47
 
3435 stevensc 48
  const ICON_OPTIONS = [Home, People, BusinessCenter, Groups, Sell, Chat, School];
3201 stevensc 49
 
3693 stevensc 50
  const showDrawer = () => setShowMenu(true);
51
  const hideDrawer = () => setShowMenu(false);
52
 
3201 stevensc 53
  const handleSearch = ({ key, target }) => {
54
    if (key !== 'Enter') {
3435 stevensc 55
      return;
3201 stevensc 56
    }
57
 
3435 stevensc 58
    navigate(`/search/entity/user?keyword=${target.value}`);
59
    target.value = '';
60
    target.blur();
61
  };
3201 stevensc 62
 
63
  return (
64
    <>
65
      <AppBar
66
        sx={{
67
          position: 'sticky',
68
          paddingTop: isIphone ? '50px' : '0',
69
          boxShadow: 'none',
70
          borderBottom: '1px solid var(--border-primary)'
71
        }}
72
      >
73
        <Container>
74
          <Toolbar
75
            sx={{
76
              gap: 2,
77
              minHeight: 'none',
78
              paddingLeft: 0,
79
              paddingRight: 0
80
            }}
81
          >
82
            <Box
83
              sx={{
84
                display: 'flex',
85
                alignItems: 'center',
86
                gap: { xs: 0, md: 2 },
87
                flexGrow: 1,
88
                '& img': {
89
                  display: { xs: 'none', md: 'block' },
90
                  height: { xs: '50px', md: '60px' },
91
                  width: { xs: '50px', md: '60px' }
92
                }
93
              }}
94
            >
95
              <Link to='/'>
96
                <img src={logo} alt='Logo' />
97
              </Link>
98
              <Input
99
                placeholder={labels.search}
100
                icon={<Search />}
101
                variant='search'
102
                onKeyDown={handleSearch}
103
              />
104
            </Box>
105
 
106
            <Box
107
              sx={{
108
                alignItems: 'center',
109
                display: 'flex',
110
                '& > ul': {
111
                  display: 'flex',
112
                  flex: 1,
113
                  justifyContent: 'space-evenly',
114
                  gap: { xs: 1, md: 2 },
115
                  '& > li': {
116
                    position: 'relative',
117
                    display: 'flex',
118
                    '&:not(:nth-last-child(-n + 4))': {
119
                      display: { xs: 'none', md: 'flex' }
120
                    },
121
                    '&:nth-last-child(-n + 1)': {
122
                      display: { xs: 'flex', md: 'none' }
123
                    }
124
                  }
125
                }
126
              }}
127
            >
128
              <ul>
3435 stevensc 129
                {menu.map(({ label, href, childs }, index) => {
130
                  const Icon = ICON_OPTIONS[index];
3201 stevensc 131
 
132
                  return (
3435 stevensc 133
                    <NavigationItem key={index} url={href} childs={childs}>
3201 stevensc 134
                      <Icon />
135
                      {label}
136
                    </NavigationItem>
3435 stevensc 137
                  );
3201 stevensc 138
                })}
139
 
140
                <UserOptions
141
                  image={image}
142
                  name={fullName}
143
                  adminUrl={linkAdmin}
144
                  impersonateUrl={linkImpersonate}
145
                  defaultNetwork={defaultNetwork}
146
                  knowledgeAuth={linkKnowledgeArea}
147
                  routeKnowledge={routeKnowledgeArea}
148
                  routeAdmin={urlAdmin}
149
                  routeImpersonate={urlImpersonate}
150
                  routeAbuseReport={routeAbuseReport}
151
                />
152
 
3693 stevensc 153
                <NavigationItem onClick={showDrawer}>
3201 stevensc 154
                  <Menu />
155
                </NavigationItem>
156
              </ul>
157
            </Box>
158
          </Toolbar>
159
        </Container>
160
      </AppBar>
161
 
3693 stevensc 162
      <MenuDrawer items={menu} show={showMenu} onClose={hideDrawer} />
3201 stevensc 163
    </>
3435 stevensc 164
  );
3201 stevensc 165
}