1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
import AppBar from '@mui/material/AppBar';
import Tab, { TabProps } from '@mui/material/Tab';
import Tabs from '@mui/material/Tabs';
import Toolbar from '@mui/material/Toolbar';
import Tooltip from '@mui/material/Tooltip/Tooltip';
import { alpha } from '@mui/material/styles';
import makeStyles from '@mui/styles/makeStyles';
import { Link, useLocation } from 'react-router-dom';
import CurrentIdentity from '../Identity/CurrentIdentity';
import { LightSwitch } from '../Themer';
const useStyles = makeStyles((theme) => ({
offset: {
...theme.mixins.toolbar,
},
filler: {
flexGrow: 1,
},
appBar: {
backgroundColor: theme.palette.primary.dark,
color: theme.palette.primary.contrastText,
},
appTitle: {
...theme.typography.h6,
color: theme.palette.primary.contrastText,
textDecoration: 'none',
display: 'flex',
alignItems: 'center',
},
lightSwitch: {
marginRight: '20px',
color: alpha(theme.palette.primary.contrastText, 0.5),
},
logo: {
height: '42px',
marginRight: theme.spacing(2),
},
}));
function a11yProps(index: any) {
return {
id: `nav-tab-${index}`,
'aria-controls': `nav-tabpanel-${index}`,
};
}
const DisabledTabWithTooltip = (props: TabProps) => {
/*The span elements around disabled tabs are needed, as the tooltip
* won't be triggered by disabled elements.
* See: https://material-ui.com/components/tooltips/#disabled-elements
* This must be done in a wrapper component, otherwise the TabS component
* cannot pass it styles down to the Tab component. Resulting in (console)
* warnings. This wrapper acceps the passed down TabProps and pass it around
* the span element to the Tab component.
*/
const msg = `This feature doesn't exist yet. Come help us build it.`;
return (
<Tooltip title={msg}>
<span>
<Tab disabled {...props} />
</span>
</Tooltip>
);
};
function Header() {
const classes = useStyles();
const location = useLocation();
// Prevents error of invalid tab selection in <Tabs>
// Will return a valid tab path or false if path is unknown.
function highlightTab() {
const validTabs = ['/', '/code', '/pulls', '/settings'];
const tab = validTabs.find((tabPath) => tabPath === location.pathname);
return tab === undefined ? false : tab;
}
return (
<>
<AppBar position="fixed" className={classes.appBar}>
<Toolbar>
<Link to="/" className={classes.appTitle}>
<img src="/logo.svg" className={classes.logo} alt="git-bug logo" />
git-bug
</Link>
<div className={classes.filler} />
<LightSwitch className={classes.lightSwitch} />
<CurrentIdentity />
</Toolbar>
</AppBar>
<div className={classes.offset} />
<Tabs centered value={highlightTab()} aria-label="nav tabs">
<DisabledTabWithTooltip label="Code" value="/code" {...a11yProps(1)} />
<Tab label="Bugs" value="/" component={Link} to="/" {...a11yProps(2)} />
<DisabledTabWithTooltip
label="Pull Requests"
value="/pulls"
{...a11yProps(3)}
/>
<DisabledTabWithTooltip
label="Settings"
value="/settings"
{...a11yProps(4)}
/>
</Tabs>
</>
);
}
export default Header;
|