Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3719 | | Comparar con el anterior | Ultima modificación | Ver Log |

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