import { httpErrorToHuman } from '@/api/http' import { NavigationBarContext } from '@/components/elements/navigation/NavigationBar' import ScreenBlock, { ErrorMessage } from '@/components/elements/ScreenBlock' import Spinner from '@/components/elements/Spinner' import { lazy, useContext, useEffect, useState } from 'react' import { Outlet, RouteObject, useMatch } from 'react-router-dom' import { ExclamationCircleIcon } from '@heroicons/react/24/outline' import { AdminServerContext } from '@/state/admin/server' import FixServerStatusButton from '@/components/admin/servers/FixServerStatusButton' import { useTranslation } from 'react-i18next' import { ServerContext } from '@/state/server' import { lazyLoad } from '@/routers/helpers' export const routes: RouteObject[] = [ { path: 'servers', children: [ { index: true, element: lazyLoad(lazy(() => import('@/components/admin/servers/ServersContainer'))), }, { path: ':id', element: ( {lazyLoad(lazy(() => import('@/routers/AdminServerRouter')))} ), children: [ { index: true, element: lazyLoad( lazy(() => import('@/components/admin/servers/overview/ServerOverviewContainer')) ), }, { path: 'settings', element: lazyLoad( lazy(() => import('@/components/admin/servers/settings/ServerSettingsContainer')) ), children: [ { path: 'general', element: lazyLoad( lazy(() => import('@/components/admin/servers/settings/GeneralContainer')) ), }, { path: 'hardware', element: lazyLoad( lazy(() => import('@/components/admin/servers/settings/ServerHardwareContainer')) ), }, ], }, ], }, ], }, ] const AdminServerRouter = () => { const match = useMatch('/admin/servers/:id/*') const [error, setError] = useState() const server = AdminServerContext.useStoreState(state => state.server.data) const getServer = AdminServerContext.useStoreActions(actions => actions.server.getServer) const clearServerState = AdminServerContext.useStoreActions(actions => actions.clearServerState) const { t: tStrings } = useTranslation('strings') const visibleRoutes = [ { name: tStrings('overview'), path: `/admin/servers/:id`, end: true, }, { name: tStrings('setting_other'), path: `/admin/servers/:id/settings`, }, ] useEffect(() => { setError(undefined) getServer(match!.params.id as string).catch((error: any) => { setError(httpErrorToHuman(error)) }) return () => { clearServerState() } }, [match?.params.id]) const { setRoutes, setBreadcrumb } = useContext(NavigationBarContext) useEffect(() => { setRoutes(visibleRoutes) return () => setBreadcrumb(null) }, []) useEffect(() => { setBreadcrumb(server?.name) }, [server]) return ( <> {!server ? ( error ? ( ) : ( ) ) : ( <> {server.status === 'deleting' || server.status === 'deletion_failed' ? ( ) : ( )} )} ) } export default AdminServerRouter