import React from "react"; import { Box, createStyles, Divider, Drawer, List, ListItem, ListItemText, makeStyles, Theme, Typography } from "@material-ui/core"; import { Link as ReactLink } from "react-router-dom"; import "firebase/analytics"; import "firebase/auth"; import "firebase/storage"; import "firebase/firestore"; import { EntityCollection } from "./models"; import { addInitialSlash, buildCollectionPath } from "./routes/navigation"; import { AdditionalView } from "./CMSAppProps"; const drawerWidth = 240; const useStyles = makeStyles((theme: Theme) => createStyles({ logo: { padding: theme.spacing(3), maxWidth: drawerWidth }, drawerPaper: { width: drawerWidth, // letterSpacing: "1px" } }) ); interface CMSDrawerProps { logo: string | undefined, navigation: EntityCollection[], drawerOpen: boolean, closeDrawer: () => any, additionalViews: AdditionalView[] | undefined; } interface NavigationEntry { url: string; name: string; group?: string; } export function CMSDrawer({ logo, navigation, closeDrawer, drawerOpen, additionalViews }: CMSDrawerProps) { const classes = useStyles(); const navigationEntries: NavigationEntry[] = [ ...navigation.map(view => ({ url: buildCollectionPath(view), name: view.name, group: view.group })), ...(additionalViews ?? []).map(additionalView => ({ url: addInitialSlash(additionalView.path), name: additionalView.name, group: additionalView.group })) ]; const groups: string[] = Array.from(new Set( Object.values(navigationEntries).map(e => e.group).filter(Boolean) as string[] ).values()); const ungroupedNavigationViews: NavigationEntry[] = Object.values(navigationEntries).filter(e => !e.group); function createNavigationEntry(index: number, group: string, entry: NavigationEntry) { return ; } return {logo && {"Logo"}/} {ungroupedNavigationViews.map((view, index) => createNavigationEntry(index, "none", view))} {groups.map((group) => ( {group.toUpperCase()} {Object.values(navigationEntries) .filter(e => e.group === group) .map((view, index) => createNavigationEntry(index, group, view))} ))} ; }