mirror of
https://github.com/yzernik/squeaknode.git
synced 2026-08-13 12:33:25 +02:00
* Remove intermediate squeak-node-frontend dir * Create build-protos.sh * Fix build-protos script in readme
209 lines
5.6 KiB
JavaScript
209 lines
5.6 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
|
import {useHistory} from "react-router-dom";
|
|
import {
|
|
AppBar,
|
|
Toolbar,
|
|
IconButton,
|
|
InputBase,
|
|
Menu,
|
|
MenuItem,
|
|
Fab,
|
|
Link
|
|
} from "@material-ui/core";
|
|
import {
|
|
Menu as MenuIcon,
|
|
MailOutline as MailIcon,
|
|
NotificationsNone as NotificationsIcon,
|
|
Person as AccountIcon,
|
|
Search as SearchIcon,
|
|
Send as SendIcon,
|
|
ArrowBack as ArrowBackIcon,
|
|
} from "@material-ui/icons";
|
|
import classNames from "classnames";
|
|
|
|
// styles
|
|
import useStyles from "./styles";
|
|
|
|
// components
|
|
import { Badge, Typography, Button } from "../Wrappers/Wrappers";
|
|
import Notification from "../Notification/Notification";
|
|
import UserAvatar from "../UserAvatar/UserAvatar";
|
|
|
|
// context
|
|
import {
|
|
useLayoutState,
|
|
useLayoutDispatch,
|
|
toggleSidebar,
|
|
} from "../../context/LayoutContext";
|
|
import { useUserDispatch, signOut } from "../../context/UserContext";
|
|
|
|
import {
|
|
logoutRequest,
|
|
getUserRequest,
|
|
} from "../../squeakclient/requests"
|
|
|
|
const notifications = [];
|
|
|
|
export default function Header(props) {
|
|
var classes = useStyles();
|
|
|
|
const history = useHistory();
|
|
|
|
// global
|
|
var layoutState = useLayoutState();
|
|
var layoutDispatch = useLayoutDispatch();
|
|
var userDispatch = useUserDispatch();
|
|
|
|
// local
|
|
var [notificationsMenu, setNotificationsMenu] = useState(null);
|
|
var [isNotificationsUnread, setIsNotificationsUnread] = useState(true);
|
|
var [profileMenu, setProfileMenu] = useState(null);
|
|
var [isSearchOpen, setSearchOpen] = useState(false);
|
|
var [username, setUsername] = useState("bob smith");
|
|
|
|
const reloadRoute = () => {
|
|
history.go(0);
|
|
};
|
|
|
|
const getUser = () => {
|
|
getUserRequest(setUsername);
|
|
};
|
|
|
|
useEffect(()=>{
|
|
getUser()
|
|
},[]);
|
|
|
|
return (
|
|
<AppBar position="fixed" className={classes.appBar}>
|
|
<Toolbar className={classes.toolbar}>
|
|
<IconButton
|
|
color="inherit"
|
|
onClick={() => toggleSidebar(layoutDispatch)}
|
|
className={classNames(
|
|
classes.headerMenuButton,
|
|
classes.headerMenuButtonCollapse,
|
|
)}
|
|
>
|
|
{layoutState.isSidebarOpened ? (
|
|
<ArrowBackIcon
|
|
classes={{
|
|
root: classNames(
|
|
classes.headerIcon,
|
|
classes.headerIconCollapse,
|
|
),
|
|
}}
|
|
/>
|
|
) : (
|
|
<MenuIcon
|
|
classes={{
|
|
root: classNames(
|
|
classes.headerIcon,
|
|
classes.headerIconCollapse,
|
|
),
|
|
}}
|
|
/>
|
|
)}
|
|
</IconButton>
|
|
<Typography variant="h6" weight="medium" className={classes.logotype}>
|
|
Squeak Node
|
|
</Typography>
|
|
<div className={classes.grow} />
|
|
<div
|
|
className={classNames(classes.search, {
|
|
[classes.searchFocused]: isSearchOpen,
|
|
})}
|
|
>
|
|
<div
|
|
className={classNames(classes.searchIcon, {
|
|
[classes.searchIconOpened]: isSearchOpen,
|
|
})}
|
|
onClick={() => setSearchOpen(!isSearchOpen)}
|
|
>
|
|
<SearchIcon classes={{ root: classes.headerIcon }} />
|
|
</div>
|
|
<InputBase
|
|
placeholder="Search…"
|
|
classes={{
|
|
root: classes.inputRoot,
|
|
input: classes.inputInput,
|
|
}}
|
|
/>
|
|
</div>
|
|
<IconButton
|
|
color="inherit"
|
|
aria-haspopup="true"
|
|
aria-controls="mail-menu"
|
|
onClick={e => {
|
|
setNotificationsMenu(e.currentTarget);
|
|
setIsNotificationsUnread(false);
|
|
}}
|
|
className={classes.headerMenuButton}
|
|
>
|
|
<Badge
|
|
badgeContent={isNotificationsUnread ? notifications.length : null}
|
|
color="warning"
|
|
>
|
|
<NotificationsIcon classes={{ root: classes.headerIcon }} />
|
|
</Badge>
|
|
</IconButton>
|
|
<IconButton
|
|
aria-haspopup="true"
|
|
color="inherit"
|
|
className={classes.headerMenuButton}
|
|
aria-controls="profile-menu"
|
|
onClick={e => setProfileMenu(e.currentTarget)}
|
|
>
|
|
<AccountIcon classes={{ root: classes.headerIcon }} />
|
|
</IconButton>
|
|
<Menu
|
|
id="notifications-menu"
|
|
open={Boolean(notificationsMenu)}
|
|
anchorEl={notificationsMenu}
|
|
onClose={() => setNotificationsMenu(null)}
|
|
className={classes.headerMenu}
|
|
disableAutoFocusItem
|
|
>
|
|
{notifications.map(notification => (
|
|
<MenuItem
|
|
key={notification.id}
|
|
onClick={() => setNotificationsMenu(null)}
|
|
className={classes.headerMenuItem}
|
|
>
|
|
<Notification {...notification} typographyVariant="inherit" />
|
|
</MenuItem>
|
|
))}
|
|
</Menu>
|
|
|
|
<Menu
|
|
id="profile-menu"
|
|
open={Boolean(profileMenu)}
|
|
anchorEl={profileMenu}
|
|
onClose={() => setProfileMenu(null)}
|
|
className={classes.headerMenu}
|
|
classes={{ paper: classes.profileMenu }}
|
|
disableAutoFocusItem
|
|
>
|
|
<div className={classes.profileMenuUser}>
|
|
<Typography variant="h4" weight="medium">
|
|
{username}
|
|
</Typography>
|
|
</div>
|
|
<div className={classes.profileMenuUser}>
|
|
<Typography
|
|
className={classes.profileMenuLink}
|
|
color="primary"
|
|
onClick={() => logoutRequest(
|
|
() => {
|
|
reloadRoute();
|
|
}
|
|
)}
|
|
>
|
|
Sign Out
|
|
</Typography>
|
|
</div>
|
|
</Menu>
|
|
|
|
</Toolbar>
|
|
</AppBar>
|
|
);
|
|
}
|