import React from "react"; import { DrawerLogo, DrawerNavigationGroup, DrawerToggle, NavigationResult, useApp, useAuthController, useCollapsedGroups, useNavigationController } from "@firecms/core"; import { AddIcon, IconButton, Tooltip } from "@firecms/ui"; import { useCollectionEditorController } from "@firecms/collection_editor"; import { RESERVED_GROUPS } from "../utils"; import { AdminDrawerMenu } from "./AdminDrawerMenu"; /** * Default drawer used in FireCMS Cloud * @group Core */ export function FireCMSCloudDrawer() { const { logo } = useApp(); const { drawerHovered, drawerOpen } = useApp(); const navigation = useNavigationController(); const collectionEditorController = useCollectionEditorController(); const { user } = useAuthController(); const [adminMenuOpen, setAdminMenuOpen] = React.useState(false); const tooltipsOpen = drawerHovered && !drawerOpen && !adminMenuOpen; const drawerVisuallyOpen = drawerOpen || drawerHovered; const scrollRef = React.useRef(null); const [scrolled, setScrolled] = React.useState(false); const handleScroll = () => { if (scrollRef.current) { setScrolled(scrollRef.current.scrollTop > 0); } }; if (!navigation.topLevelNavigation) throw Error("Navigation not ready in Drawer"); const { navigationEntries, groups }: NavigationResult = navigation.topLevelNavigation; // Collapsible groups state - using "drawer" namespace for independent state from home page const { isGroupCollapsed, toggleGroupCollapsed } = useCollapsedGroups(groups, "drawer"); const buildHeaderActions = (group: string | null) => { const reservedGroup = group && RESERVED_GROUPS.includes(group); const canCreateCollections = collectionEditorController.configPermissions({ user }).createCollections && !reservedGroup; if (!canCreateCollections) return null; return ( { e.stopPropagation(); collectionEditorController?.createCollection({ initialValues: { group: group ?? undefined, }, parentCollectionIds: [], redirect: true, sourceClick: "drawer_new_collection" }); }}> ); }; return (
{groups.map((group) => { const entriesInGroup = Object.values(navigationEntries).filter(e => e.group === group); return ( toggleGroupCollapsed(group)} drawerOpen={drawerVisuallyOpen} tooltipsOpen={tooltipsOpen} adminMenuOpen={adminMenuOpen} headerActions={buildHeaderActions(group)} /> ); })}
); }