import { type ReactNode, useEffect, useState } from 'react' import { ScrollContext } from '../../functions/Context' import HeaderMessage from '../layout/HeaderMessage' import HeaderError from '../layout/HeaderError' import ViewAnimation from '../views/Animation' import ViewHomepage from '../views/Homepage' import ViewPersonal from '../views/Personal' import ViewSearch from '../views/Search' import ViewSettings from '../views/Settings' import ViewText from '../views/Text' import ViewUpload from '../views/Upload' export default function PaneContent() { const [mainElem, setMainElem] = useState(null) const [path, setPath] = useState(window.location.pathname) const [key, setKey] = useState(window.location.href) // Track Path useEffect(() => { const onPop = () => { setPath(window.location.pathname) setKey(window.location.href) } window.addEventListener('popstate', onPop) return () => window.removeEventListener('popstate', onPop) }, []) // Match Component const views = new Array<{ route: RegExp; scroll: boolean; component: (m: RegExpMatchArray) => ReactNode }>( { route: /^\/art\/([0-9]+)$/, scroll: false, component: (m) => }, { route: /^\/text\/([a-z-]+)$/, scroll: true, component: (m) => }, { route: /^\/personal$/, scroll: true, component: (_) => }, { route: /^\/upload$/, scroll: false, component: (_) => }, { route: /^\/settings$/, scroll: true, component: (_) => }, { route: /^\/search$/, scroll: true, component: (_) => }, { route: /^\/$/, scroll: true, component: (_) => }, ) const match = views.map((v) => ({ v, m: path.match(v.route) })).find(({ m }) => m !== null) const relevant = match ? { ...match.v, component: match.v.component(match.m!) } : null // Render Content return (
{relevant ? ( relevant.component ) : ( <> )}
) }