import { ActionIcon, Anchor, AppShell, Box, Burger, Center, createStyles, DEFAULT_THEME, Group, Header, Navbar, ScrollArea, Title, useMantineTheme, } from "@mantine/core" import { useViewportSize } from "@mantine/hooks" import { Constants } from "app/constants" import { redirectToAdd, redirectToRootCategory } from "app/slices/redirect" import { reloadTree, setMobileMenuOpen } from "app/slices/tree" import { reloadProfile, reloadSettings } from "app/slices/user" import { useAppDispatch, useAppSelector } from "app/store" import { Logo } from "components/Logo" import { OnDesktop } from "components/responsive/OnDesktop" import { OnMobile } from "components/responsive/OnMobile" import { useAppLoading } from "hooks/useAppLoading" import { LoadingPage } from "pages/LoadingPage" import { ReactNode, useEffect } from "react" import { TbPlus } from "react-icons/tb" import { Outlet } from "react-router-dom" interface LayoutProps { sidebar: ReactNode header: ReactNode } const sidebarPadding = DEFAULT_THEME.spacing.xs const sidebarRightBorderWidth = 1 const useStyles = createStyles(theme => ({ sidebarContent: { maxWidth: Constants.layout.sidebarWidth - sidebarPadding * 2 - sidebarRightBorderWidth, [theme.fn.smallerThan(Constants.layout.mobileBreakpoint)]: { maxWidth: `calc(100vw - ${sidebarPadding * 2 + sidebarRightBorderWidth}px)`, }, }, mainContentWrapper: { paddingTop: Constants.layout.headerHeight, paddingLeft: Constants.layout.sidebarWidth, paddingRight: 0, paddingBottom: 0, [theme.fn.smallerThan(Constants.layout.mobileBreakpoint)]: { paddingLeft: 0, }, }, mainContent: { maxWidth: `calc(100vw - ${Constants.layout.sidebarWidth}px)`, padding: theme.spacing.md, [theme.fn.smallerThan(Constants.layout.mobileBreakpoint)]: { maxWidth: "100vw", padding: "6px", }, }, })) function LogoAndTitle() { const dispatch = useAppDispatch() return ( dispatch(redirectToRootCategory())} variant="text">
CommaFeed
) } export default function Layout({ sidebar, header }: LayoutProps) { const { classes } = useStyles() const theme = useMantineTheme() const viewport = useViewportSize() const { loading } = useAppLoading() const mobileMenuOpen = useAppSelector(state => state.tree.mobileMenuOpen) const dispatch = useAppDispatch() useEffect(() => { dispatch(reloadSettings()) dispatch(reloadProfile()) dispatch(reloadTree()) // reload tree periodically const id = setInterval(() => dispatch(reloadTree()), 30000) return () => clearInterval(id) }, [dispatch]) const burger = ( dispatch(setMobileMenuOpen(!mobileMenuOpen))} size="sm" /> ) const addButton = ( dispatch(redirectToAdd())} aria-label="Subscribe"> ) if (loading) return return ( ) }