import { CaretDownOutlined, UserOutlined } from '@ant-design/icons' import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons/lib' import { Dropdown, Layout, Menu, PageHeader, Select, Spin, Tag } from 'antd' import Link from 'next/link' import { useRouter } from 'next/router' import React, { CSSProperties, FunctionComponent } from 'react' import { useTranslation } from 'react-i18next' import { languages } from '../i18n' import { sideMenu, SideMenuElement } from './sidemenu' import { useWindowSize } from './use.window.size' import { clearAuth } from './with.auth' const { SubMenu, ItemGroup } = Menu const { Header, Content, Sider } = Layout interface BreadcrumbEntry { name: string href?: string as?: string } interface Props { loading?: boolean padded?: boolean style?: CSSProperties selected?: string breadcrumbs?: BreadcrumbEntry[] title?: string subTitle?: string extra?: JSX.Element[] } const Structure: FunctionComponent = (props) => { const { t, i18n } = useTranslation() const size = useWindowSize() const [userMenu, setUserMenu] = React.useState(false) const [open, setOpen] = React.useState() const [selected, setSelected] = React.useState() const [sidebar, setSidebar] = React.useState(size.width < 700) const router = useRouter() React.useEffect(() => { if (sidebar !== size.width < 700) { setSidebar(size.width < 700) } }, [size.width]) React.useEffect(() => { if (props.selected) { const parts = props.selected.split('.') const last = parts.pop() if (parts.length > 0) { setOpen(parts) } setSelected([last]) } }, [props.selected]) const buildMenu = (data: SideMenuElement[]): JSX.Element[] => { return data.map( (element): JSX.Element => { if (element.items && element.items.length > 0) { if (element.group) { return ( {element.icon} {element.name} } > {buildMenu(element.items)} ) } return ( {element.icon} {element.name} } > {buildMenu(element.items)} ) } return ( { if (element.href) { router.push(element.href) } }} key={element.key} > {element.icon} {element.name} ) } ) } const signOut = async (): Promise => { await clearAuth() router.reload() } return (
{React.createElement(sidebar ? MenuUnfoldOutlined : MenuFoldOutlined, { className: 'sidebar-toggle', onClick: () => setSidebar(!sidebar), })} {'OhMyForm'}
router.push('/admin/profile')}>Profile Logout } onVisibleChange={setUserMenu} visible={userMenu} >
setSelected(s.keyPath)} openKeys={open} onOpenChange={(open): void => setOpen(open)} > {buildMenu(sideMenu)} Version: {process.env.version} {props.title && ( ({ breadcrumbName: b.name, path: '', })), { breadcrumbName: props.title, path: '', }, ], params: props.breadcrumbs, itemRender(route, params: BreadcrumbEntry[], routes) { if (routes.indexOf(route) === routes.length - 1) { return {route.breadcrumbName} } const entry = params[routes.indexOf(route)] return ( {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */} {entry.name} ) }, }} /> )} {props.children}
) } Structure.defaultProps = { padded: true, style: {}, } export default Structure