mirror of
https://github.com/sasjs/server.git
synced 2026-01-15 18:00:05 +00:00
chore(web): add user name at top right
This commit is contained in:
@@ -1,13 +1,20 @@
|
|||||||
import React, { useState } from 'react'
|
import React, { useState, useContext } from 'react'
|
||||||
import { Link, useHistory, useLocation } from 'react-router-dom'
|
import { Link, useHistory, useLocation } from 'react-router-dom'
|
||||||
|
|
||||||
import AppBar from '@mui/material/AppBar'
|
import {
|
||||||
import Toolbar from '@mui/material/Toolbar'
|
AppBar,
|
||||||
import Tabs from '@mui/material/Tabs'
|
Toolbar,
|
||||||
import Tab from '@mui/material/Tab'
|
Tabs,
|
||||||
import Button from '@mui/material/Button'
|
Tab,
|
||||||
|
Button,
|
||||||
|
Menu,
|
||||||
|
MenuItem
|
||||||
|
} from '@mui/material'
|
||||||
import OpenInNewIcon from '@mui/icons-material/OpenInNew'
|
import OpenInNewIcon from '@mui/icons-material/OpenInNew'
|
||||||
|
|
||||||
|
import UserName from './userName'
|
||||||
|
import { AppContext } from '../context/appContext'
|
||||||
|
|
||||||
const NODE_ENV = process.env.NODE_ENV
|
const NODE_ENV = process.env.NODE_ENV
|
||||||
const PORT_API = process.env.PORT_API
|
const PORT_API = process.env.PORT_API
|
||||||
const baseUrl =
|
const baseUrl =
|
||||||
@@ -16,11 +23,29 @@ const baseUrl =
|
|||||||
const Header = (props: any) => {
|
const Header = (props: any) => {
|
||||||
const history = useHistory()
|
const history = useHistory()
|
||||||
const { pathname } = useLocation()
|
const { pathname } = useLocation()
|
||||||
|
const appContext = useContext(AppContext)
|
||||||
const [tabValue, setTabValue] = useState(pathname)
|
const [tabValue, setTabValue] = useState(pathname)
|
||||||
|
const [anchorEl, setAnchorEl] = useState<
|
||||||
|
(EventTarget & HTMLButtonElement) | null
|
||||||
|
>(null)
|
||||||
|
|
||||||
|
const handleMenu = (
|
||||||
|
event: React.MouseEvent<HTMLButtonElement, MouseEvent>
|
||||||
|
) => {
|
||||||
|
setAnchorEl(event.currentTarget)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleClose = () => {
|
||||||
|
setAnchorEl(null)
|
||||||
|
}
|
||||||
|
|
||||||
const handleTabChange = (event: React.SyntheticEvent, value: string) => {
|
const handleTabChange = (event: React.SyntheticEvent, value: string) => {
|
||||||
setTabValue(value)
|
setTabValue(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleLogout = () => {
|
||||||
|
if (appContext.logout) appContext.logout()
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<AppBar
|
<AppBar
|
||||||
position="fixed"
|
position="fixed"
|
||||||
@@ -81,6 +106,39 @@ const Header = (props: any) => {
|
|||||||
>
|
>
|
||||||
App Stream
|
App Stream
|
||||||
</Button>
|
</Button>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexGrow: 1,
|
||||||
|
justifyContent: 'flex-end'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<UserName
|
||||||
|
userName={appContext.userName}
|
||||||
|
onClickHandler={handleMenu}
|
||||||
|
/>
|
||||||
|
<Menu
|
||||||
|
id="menu-appbar"
|
||||||
|
anchorEl={anchorEl}
|
||||||
|
anchorOrigin={{
|
||||||
|
vertical: 'bottom',
|
||||||
|
horizontal: 'center'
|
||||||
|
}}
|
||||||
|
keepMounted
|
||||||
|
transformOrigin={{
|
||||||
|
vertical: 'top',
|
||||||
|
horizontal: 'center'
|
||||||
|
}}
|
||||||
|
open={!!anchorEl}
|
||||||
|
onClose={handleClose}
|
||||||
|
>
|
||||||
|
<MenuItem onClick={handleLogout} sx={{ justifyContent: 'center' }}>
|
||||||
|
<Button variant="contained" color="primary">
|
||||||
|
Logout
|
||||||
|
</Button>
|
||||||
|
</MenuItem>
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
</Toolbar>
|
</Toolbar>
|
||||||
</AppBar>
|
</AppBar>
|
||||||
)
|
)
|
||||||
|
|||||||
30
web/src/components/userName.tsx
Normal file
30
web/src/components/userName.tsx
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { Typography, IconButton } from '@mui/material'
|
||||||
|
import AccountCircle from '@mui/icons-material/AccountCircle'
|
||||||
|
|
||||||
|
const UserName = (props: any) => {
|
||||||
|
return (
|
||||||
|
<IconButton
|
||||||
|
aria-label="account of current user"
|
||||||
|
aria-controls="menu-appbar"
|
||||||
|
aria-haspopup="true"
|
||||||
|
onClick={props.onClickHandler}
|
||||||
|
color="inherit"
|
||||||
|
>
|
||||||
|
{props.avatarContent ? (
|
||||||
|
<img
|
||||||
|
src={props.avatarContent}
|
||||||
|
alt="user-avatar"
|
||||||
|
style={{ width: '25px' }}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<AccountCircle></AccountCircle>
|
||||||
|
)}
|
||||||
|
<Typography variant="h6" sx={{ color: 'white', padding: '0 8px' }}>
|
||||||
|
{props.userName}
|
||||||
|
</Typography>
|
||||||
|
</IconButton>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default UserName
|
||||||
Reference in New Issue
Block a user