-
Carl Schönfelder authoredCarl Schönfelder authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
AdminPage.tsx 4.79 KiB
import {
AppBar,
Button,
CssBaseline,
Divider,
List,
ListItem,
ListItemIcon,
ListItemText,
Toolbar,
Typography,
} from '@material-ui/core'
import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'
import DashboardIcon from '@material-ui/icons/Dashboard'
import ExitToAppIcon from '@material-ui/icons/ExitToApp'
import LocationCityIcon from '@material-ui/icons/LocationCity'
import PeopleIcon from '@material-ui/icons/People'
import SettingsOverscanIcon from '@material-ui/icons/SettingsOverscan'
import React, { useEffect } from 'react'
import { Link, Route, Switch, useRouteMatch } from 'react-router-dom'
import { getCities } from '../../actions/cities'
import { getRoles } from '../../actions/roles'
import { getStatistics } from '../../actions/statistics'
import { getTypes } from '../../actions/typesAction'
import { logoutUser } from '../../actions/user'
import { useAppDispatch, useAppSelector } from '../../hooks'
import CompetitionManager from './competitions/CompetitionManager'
import Dashboard from './dashboard/Dashboard'
import RegionManager from './regions/Regions'
import { LeftDrawer } from './styled'
import UserManager from './users/UserManager'
const drawerWidth = 250
const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: {
display: 'flex',
},
appBar: {
width: '100%',
marginLeft: drawerWidth,
},
drawerPaper: {
width: drawerWidth,
},
// necessary for content to be below app bar
toolbar: theme.mixins.toolbar,
content: {
flexGrow: 1,
backgroundColor: theme.palette.background.default,
paddingTop: theme.spacing(2),
paddingLeft: theme.spacing(35),
paddingRight: theme.spacing(5),
},
})
)
const AdminView: React.FC = () => {
const classes = useStyles()
const [openIndex, setOpenIndex] = React.useState(0)
const { path, url } = useRouteMatch()
const currentUser = useAppSelector((state) => state.user.userInfo)
const isAdmin = useAppSelector(
(state) => state.roles.roles.find((x) => x.id === currentUser?.role_id)?.name === 'Admin'
)
const dispatch = useAppDispatch()
const handleLogout = () => {
dispatch(logoutUser())
}
useEffect(() => {
dispatch(getCities())
dispatch(getRoles())
dispatch(getTypes())
dispatch(getStatistics())
}, [])
const menuAdminItems = [
{ text: 'Startsida', icon: DashboardIcon },
{ text: 'Regioner', icon: LocationCityIcon },
{ text: 'Användare', icon: PeopleIcon },
{ text: 'Tävlingshanterare', icon: SettingsOverscanIcon },
]
const menuEditorItems = [
{ text: 'Startsida', icon: DashboardIcon },
{ text: 'Tävlingshanterare', icon: SettingsOverscanIcon },
]
const renderItems = () => {
const menuItems = isAdmin ? menuAdminItems : menuEditorItems
return menuItems.map((value, index) => (
<ListItem
button
component={Link}
key={value.text}
to={`${url}/${value.text.toLowerCase()}`}
selected={index === openIndex}
onClick={() => setOpenIndex(index)}
>
<ListItemIcon>{React.createElement(value.icon)}</ListItemIcon>
<ListItemText primary={value.text} />
</ListItem>
))
}
return (
<div className={classes.root}>
<CssBaseline />
<AppBar position="fixed" className={classes.appBar}>
<Toolbar>
<Typography variant="h5" noWrap>
{isAdmin ? menuAdminItems[openIndex].text : menuEditorItems[openIndex].text}
</Typography>
</Toolbar>
</AppBar>
<LeftDrawer
width={drawerWidth}
classes={{
paper: classes.drawerPaper,
}}
variant="permanent"
anchor="left"
>
<div>
<div className={classes.toolbar} />
<Divider />
<List>{renderItems()}</List>
<Divider />
<List>
<ListItem>
<Button
onClick={handleLogout}
type="submit"
fullWidth
variant="contained"
color="primary"
endIcon={<ExitToAppIcon></ExitToAppIcon>}
>
Logga ut
</Button>
</ListItem>
</List>
</div>
</LeftDrawer>
<main className={classes.content}>
<div className={classes.toolbar} />
<Switch>
<Route exact path={[path, `${path}/startsida`]}>
<Dashboard />
</Route>
<Route path={`${path}/regioner`}>
<RegionManager />
</Route>
<Route path={`${path}/användare`}>
<UserManager />
</Route>
<Route path={`${path}/tävlingshanterare`}>
<CompetitionManager />
</Route>
</Switch>
</main>
</div>
)
}
export default AdminView