import { lazyLoad } from '@/routers/helpers'
import { Route } from '@/routers/router'
import { ServerContext } from '@/state/server'
import {
ArrowPathIcon,
ExclamationCircleIcon,
NoSymbolIcon,
} from '@heroicons/react/24/outline'
import { lazy, useContext, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Outlet, useMatches } from 'react-router-dom'
import { httpErrorToHuman } from '@/api/http'
import { EloquentStatus } from '@/api/server/types'
import ScreenBlock, { ErrorMessage } from '@/components/elements/ScreenBlock'
import Spinner from '@/components/elements/Spinner'
import { NavigationBarContext } from '@/components/elements/navigation/NavigationBar'
export const routes: Route[] = [
{
element: (
{lazyLoad(lazy(() => import('./ServerRouter')))}
),
path: '/servers/:id',
children: [
{
index: true,
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/overview/ServerOverviewContainer'
)
)
),
},
{
path: 'backups',
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/backups/BackupsContainer'
)
)
),
},
{
path: 'settings',
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/settings/ServerSettingsContainer'
)
)
),
children: [
{
path: 'general',
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/settings/GeneralContainer'
)
)
),
},
{
path: 'hardware',
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/settings/HardwareContainer'
)
)
),
},
{
path: 'network',
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/settings/NetworkContainer'
)
)
),
},
{
path: 'security',
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/settings/SecurityContainer'
)
)
),
},
],
},
{
path: 'terminal',
element: lazyLoad(
lazy(
() =>
import(
'@/components/servers/terminal/ServerTerminalContainer'
)
)
),
},
],
},
]
const ServerRouter = () => {
const { t: tStrings } = useTranslation('strings')
const matches = useMatches()
const id = matches[0].params.id
const [error, setError] = useState()
const server = ServerContext.useStoreState(state => state.server.data)
const getServer = ServerContext.useStoreActions(
actions => actions.server.getServer
)
const clearServerState = ServerContext.useStoreActions(
actions => actions.clearServerState
)
const visibleRoutes = useMemo(
() => [
{
name: tStrings('overview'),
path: `/servers/${id}`,
end: true,
},
{
name: tStrings('backup_other'),
path: `/servers/${id}/backups`,
},
{
name: tStrings('setting_other'),
path: `/servers/${id}/settings`,
},
],
[id]
)
useEffect(() => {
setError(undefined)
getServer(id as string).catch((error: any) => {
setError(httpErrorToHuman(error))
})
return () => {
clearServerState()
}
}, [id])
const getScreenBlock = (status: EloquentStatus) => {
switch (status) {
case 'suspended':
return (
)
case 'installing':
return (
)
case 'restoring_backup':
return (
)
case 'restoring_snapshot':
return (
)
case 'install_failed':
return (
)
case null:
return null
default:
return (
)
}
}
const { setRoutes, setBreadcrumb } = useContext(NavigationBarContext)
useEffect(() => {
setRoutes(visibleRoutes)
return () => setBreadcrumb(null)
}, [])
useEffect(() => {
setBreadcrumb(server?.name)
}, [server])
return (
<>
{!server ? (
error ? (
) : (
)
) : (
<>
{getScreenBlock(server.status)}
{typeof server.status !== 'string' ? : null}
>
)}
>
)
}
export default ServerRouter