Proyectos de Subversion LeadersLinked - SPA

Rev

| 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
 
3435 stevensc 41
  const [showDrawer, setShowDrawer] = useState(false);
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
 
50
  const handleSearch = ({ key, target }) => {
51
    if (key !== 'Enter') {
3435 stevensc 52
      return;
3201 stevensc 53
    }
54
 
3435 stevensc 55
    navigate(`/search/entity/user?keyword=${target.value}`);
56
    target.value = '';
57
    target.blur();
58
  };
3201 stevensc 59
 
60
  return (
61
    <>
62
      <AppBar
63
        sx={{
64
          position: 'sticky',
65
          paddingTop: isIphone ? '50px' : '0',
66
          boxShadow: 'none',
67
          borderBottom: '1px solid var(--border-primary)'
68
        }}
69
      >
70
        <Container>
71
          <Toolbar
72
            sx={{
73
              gap: 2,
74
              minHeight: 'none',
75
              paddingLeft: 0,
76
              paddingRight: 0
77
            }}
78
          >
79
            <Box
80
              sx={{
81
                display: 'flex',
82
                alignItems: 'center',
83
                gap: { xs: 0, md: 2 },
84
                flexGrow: 1,
85
                '& img': {
86
                  display: { xs: 'none', md: 'block' },
87
                  height: { xs: '50px', md: '60px' },
88
                  width: { xs: '50px', md: '60px' }
89
                }
90
              }}
91
            >
92
              <Link to='/'>
93
                <img src={logo} alt='Logo' />
94
              </Link>
95
              <Input
96
                placeholder={labels.search}
97
                icon={<Search />}
98
                variant='search'
99
                onKeyDown={handleSearch}
100
              />
101
            </Box>
102
 
103
            <Box
104
              sx={{
105
                alignItems: 'center',
106
                display: 'flex',
107
                '& > ul': {
108
                  display: 'flex',
109
                  flex: 1,
110
                  justifyContent: 'space-evenly',
111
                  gap: { xs: 1, md: 2 },
112
                  '& > li': {
113
                    position: 'relative',
114
                    display: 'flex',
115
                    '&:not(:nth-last-child(-n + 4))': {
116
                      display: { xs: 'none', md: 'flex' }
117
                    },
118
                    '&:nth-last-child(-n + 1)': {
119
                      display: { xs: 'flex', md: 'none' }
120
                    }
121
                  }
122
                }
123
              }}
124
            >
125
              <ul>
3435 stevensc 126
                {menu.map(({ label, href, childs }, index) => {
127
                  const Icon = ICON_OPTIONS[index];
3201 stevensc 128
 
129
                  return (
3435 stevensc 130
                    <NavigationItem key={index} url={href} childs={childs}>
3201 stevensc 131
                      <Icon />
132
                      {label}
133
                    </NavigationItem>
3435 stevensc 134
                  );
3201 stevensc 135
                })}
136
 
137
                <UserOptions
138
                  image={image}
139
                  name={fullName}
140
                  adminUrl={linkAdmin}
141
                  impersonateUrl={linkImpersonate}
142
                  defaultNetwork={defaultNetwork}
143
                  knowledgeAuth={linkKnowledgeArea}
144
                  routeKnowledge={routeKnowledgeArea}
145
                  routeAdmin={urlAdmin}
146
                  routeImpersonate={urlImpersonate}
147
                  routeAbuseReport={routeAbuseReport}
148
                />
149
 
150
                <NavigationItem onClick={() => setShowDrawer(!showDrawer)}>
151
                  <Menu />
152
                </NavigationItem>
153
              </ul>
154
            </Box>
155
          </Toolbar>
156
        </Container>
157
      </AppBar>
158
 
159
      <MenuDrawer
160
        items={menu}
161
        icons={ICON_OPTIONS}
162
        isOpen={showDrawer}
163
        closeDrawer={() => setShowDrawer(false)}
164
      />
165
    </>
3435 stevensc 166
  );
3201 stevensc 167
}