import React, { useContext } from "react"; import { Column, ColumnProps, Container, Grid, GridProps, Navbar, Page, PageProps, Sidebar, Toolbar, ToolbarItem, } from "../../components"; import { ConfigContext, NavigationContext } from "../../contexts"; export type BaseTemplateProps = React.PropsWithChildren & { /** Column props. */ columnProps?: Partial; /** Grid props. */ gridProps?: Partial; /** Page props. */ pageProps?: Partial; /** Sidebar props. */ sidebarProps?: ToolbarItem[]; /** Whether to limit the content width using a container. */ container?: boolean; /** Whether to only output the page inner contents. */ contentOnly?: boolean; /** Whether to wrap content in a grid. */ grid?: boolean; /** Primary navigation items. */ primaryNavigationItems?: ToolbarItem[]; /** Sidebar items. */ sidebarItems?: ToolbarItem[]; /** Primary navigation (JSX) slot. */ slotPrimaryNavigation?: React.ReactNode; /** Sidebar (JSX) slot. */ slotSidebar?: React.ReactNode; }; /** * Base template * @constructor */ export const BaseTemplate: React.FC = ({ children, columnProps, pageProps, container = false, contentOnly, grid, gridProps, primaryNavigationItems = [], sidebarItems = [], sidebarProps, slotPrimaryNavigation, slotSidebar, }) => { const { templatesContentOnly = false, templatesGrid = true } = useContext(ConfigContext); const _contentOnly = typeof contentOnly !== "undefined" ? contentOnly : templatesContentOnly; const _grid = typeof grid !== "undefined" ? grid : templatesGrid; const { primaryNavigation, primaryNavigationItems: _primaryNavigationItems, sidebar, sidebarItems: _sidebarItems, } = useContext(NavigationContext); const contextNavigation = primaryNavigation || (primaryNavigationItems.length || _primaryNavigationItems?.length ? ( ) : null); const contextSidebar = sidebar || (sidebarItems.length || _sidebarItems?.length ? ( ) : null); const content = _grid ? ( {children} ) : ( children ); const _content = container ? {content} : content; const page = ( {slotPrimaryNavigation || contextNavigation} {slotSidebar || contextSidebar} {_content} ); return _contentOnly ? _content : page; };