-
Notifications
You must be signed in to change notification settings - Fork 1
/
TopNavigationBar.tsx
83 lines (78 loc) · 2.22 KB
/
TopNavigationBar.tsx
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
import {
Alignment,
Breadcrumbs,
Button,
Classes,
IBreadcrumbProps,
Menu,
MenuItem,
Navbar,
NavbarDivider,
NavbarGroup,
NavbarHeading,
Popover,
Position,
} from '@blueprintjs/core'
import classNames from 'classnames'
import React, { FunctionComponent } from 'react'
import { Link } from 'react-router-dom'
import { useMappedState } from 'redux-react-hook'
import { useContestOnly, useMe, useSignOut } from 'ugrade/auth'
import { TopToaster } from 'ugrade/common/ActionToaster'
import { usePush } from 'ugrade/router'
import { selectBreadcrumb } from './selectors'
export type TopNavigationBarBreadcrumb = IBreadcrumbProps
export const TopNavigationBar: FunctionComponent = () => {
useContestOnly()
const user = useMe()
const breadcrumbs = useMappedState(selectBreadcrumb)
const push = usePush()
const signOut = useSignOut()
const breadcrumbWithRouter = breadcrumbs.map(breadcrumbItem => ({
...breadcrumbItem,
onClick: () => {
if (breadcrumbItem.href) push(breadcrumbItem.href)
},
href: undefined,
}))
const handleSignOut = async () => {
await signOut()
TopToaster.showSuccessToast('Signed Out')
}
const handleMyAccount = () => push('/account')
const handleSetting = () => push('/setting')
return (
<Navbar>
<NavbarGroup align={Alignment.LEFT}>
<Link to='/contest'>
<NavbarHeading>UGrade</NavbarHeading>
</Link>
<NavbarDivider />
<Breadcrumbs items={breadcrumbWithRouter} />
</NavbarGroup>
<NavbarGroup align={Alignment.RIGHT}>
<Popover
disabled={!user}
content={
<Menu>
<MenuItem onClick={handleMyAccount} text='My Account' />
<MenuItem onClick={handleSetting} text='Setting' />
<MenuItem onClick={handleSignOut} text='Sign Out' />
</Menu>
}
position={Position.BOTTOM}
>
<Button
icon='caret-down'
large={true}
rightIcon='user'
className={classNames(Classes.MINIMAL, {
[Classes.SKELETON]: !user,
})}
text={(user && user.name) || 'Test'}
/>
</Popover>
</NavbarGroup>
</Navbar>
)
}