|
import { DashboardOutlined, GithubOutlined, LoginOutlined, LogoutOutlined, MenuOutlined, SettingOutlined, UserOutlined, UserSwitchOutlined, WarningOutlined } from '@ant-design/icons' |
|
import { Button, Checkbox, Form, Layout, Menu, Modal, Popover, Tag, Typography } from 'antd' |
|
import Avatar from 'antd/lib/avatar/avatar' |
|
import React, { useState } from 'react' |
|
import { useThemeSwitcher } from 'react-css-theme-switcher' |
|
import { useHistory } from 'react-router' |
|
import { Link, useLocation } from 'react-router-dom' |
|
import { apiUrl, req } from '../../utils/Fetcher' |
|
|
|
interface Props { |
|
user?: any |
|
} |
|
|
|
|
|
const Navbar: React.FC<Props> = ({ user }) => { |
|
const history = useHistory() |
|
const { pathname } = useLocation() |
|
const { currentTheme } = useThemeSwitcher() |
|
const [logoutConfirmation, setLogoutConfirmation] = useState<boolean>(false) |
|
const [popoverVisibility, setPopoverVisibility] = useState<boolean>(false) |
|
const [destroySession, setDestroySession] = useState<boolean>(false) |
|
|
|
|
|
const logout = async () => { |
|
await req.post('/auth/logout', {}, destroySession ? { params: { destroySession: 1 } } : undefined) |
|
window.localStorage.removeItem('experimental') |
|
return window.location.replace('/') |
|
} |
|
|
|
return <> |
|
<Layout.Header style={{ background: currentTheme === 'dark' ? '#1f1f1f' : '#0088CC', padding: '0 20px' }}> |
|
<div key="logo" className="logo" style={{ marginRight: '30px' }}> |
|
{/\/startup/.test(pathname) ? <img src="/teledrive-logo/logoteledrive-white.png" style={{ height: '24px' }} /> : <Link to="/dashboard" style={{ color: '#fff' }}> |
|
<img src="/teledrive-logo/logoteledrive-white.png" style={{ height: '24px' }} /> |
|
</Link>} |
|
</div> |
|
{!/\/startup/.test(pathname) && <> |
|
{user ? <>{/\/dashboard/.test(pathname) || /\/settings/.test(pathname) || /\/admin/.test(pathname) ? <> |
|
<Popover visible={popoverVisibility} onVisibleChange={setPopoverVisibility} placement="bottomRight" trigger={['click']} content={<div> |
|
<div style={{ padding: '10px' }}> |
|
Bandwidth: { } |
|
<Tag color="green">Unlimited</Tag> |
|
</div> |
|
<Menu selectable={false} triggerSubMenuAction="click" onClick={({ key }) => { |
|
setPopoverVisibility(false) |
|
if (key === 'admin' && user?.role === 'admin') { |
|
history.push('/admin') |
|
} else if (key === 'settings') { |
|
history.push('/settings') |
|
} else if (key === 'logout') { |
|
setLogoutConfirmation(true) |
|
} |
|
}}> |
|
{user?.role === 'admin' && <Menu.Item key="admin" icon={<UserSwitchOutlined />}>Admin</Menu.Item>} |
|
<Menu.Item key="settings" icon={<SettingOutlined />}>Settings</Menu.Item> |
|
<Menu.Item danger key="logout" icon={<LogoutOutlined />}>Logout</Menu.Item> |
|
</Menu> |
|
</div>}> |
|
<Button type="link" style={{ color: '#ffff', float: 'right', top: '12px' }} icon={<Avatar src={`${apiUrl}/users/me/photo`} icon={<UserOutlined />} />} /> |
|
</Popover> |
|
</> : <Button type="link" style={{ color: '#ffff', float: 'right', top: '16px' }} icon={<DashboardOutlined />} onClick={() => history.push('/dashboard')}>{window.innerWidth > 359 && 'Dashboard'}</Button>}</> : |
|
<Button onClick={() => history.push('/login')} type="link" style={{ color: '#ffff', float: 'right', top: '16px' }} icon={<LoginOutlined />}>Login</Button>} |
|
<Menu selectable={false} overflowedIndicator={<MenuOutlined />} mode="horizontal" triggerSubMenuAction="click" theme={currentTheme === 'dark' ? 'light' : 'dark'} |
|
style={{ background: currentTheme === 'dark' ? '#1f1f1f' : '#0088CC', position: 'relative', display: 'flex', justifyContent: 'right' }}> |
|
<Menu.Item onClick={() => history.push('/dashboard')} key="dashboard">Dashboard</Menu.Item> |
|
<Menu.Item onClick={() => window.open('https://github.com/mgilangjanuar/teledrive', '_blank')} key="github" icon={<GithubOutlined />}>GitHub</Menu.Item> |
|
</Menu> |
|
</>} |
|
</Layout.Header> |
|
|
|
<Modal title={<Typography.Text> |
|
<Typography.Text type="warning"><WarningOutlined /></Typography.Text> Confirmation |
|
</Typography.Text>} |
|
visible={logoutConfirmation} |
|
onCancel={() => setLogoutConfirmation(false)} |
|
onOk={logout} |
|
cancelButtonProps={{ shape: 'round' }} |
|
okButtonProps={{ danger: true, type: 'primary', shape: 'round' }}> |
|
<Typography.Paragraph> |
|
Are you sure to logout? |
|
</Typography.Paragraph> |
|
<Form.Item help="All files you share will not be able to download once you sign out"> |
|
<Checkbox checked={destroySession} onChange={({ target }) => setDestroySession(target.checked)}> |
|
Also delete my active session |
|
</Checkbox> |
|
</Form.Item> |
|
</Modal> |
|
</> |
|
} |
|
|
|
export default Navbar |
|
|