Use Hilla router config

This commit is contained in:
grimsi
2025-06-03 17:50:34 +02:00
parent 7fa2c029af
commit 0fc6c128f4
2 changed files with 82 additions and 84 deletions
+2 -4
View File
@@ -2,7 +2,6 @@ import {Outlet, useHref, useNavigate} from 'react-router';
import "./main.css"; import "./main.css";
import "Frontend/util/custom-validators"; import "Frontend/util/custom-validators";
import {HeroUIProvider} from "@heroui/react"; import {HeroUIProvider} from "@heroui/react";
import {ToastProvider} from "@heroui/toast";
import {ThemeProvider as NextThemesProvider} from "next-themes"; import {ThemeProvider as NextThemesProvider} from "next-themes";
import {themeNames} from "Frontend/theming/themes"; import {themeNames} from "Frontend/theming/themes";
import {AuthProvider} from "Frontend/util/auth"; import {AuthProvider} from "Frontend/util/auth";
@@ -12,10 +11,9 @@ import {ErrorHandlingMiddleware} from "Frontend/util/middleware";
import {initializeLibraryState} from "Frontend/state/LibraryState"; import {initializeLibraryState} from "Frontend/state/LibraryState";
import {initializeGameState} from "Frontend/state/GameState"; import {initializeGameState} from "Frontend/state/GameState";
import {initializeScanState} from "Frontend/state/ScanState"; import {initializeScanState} from "Frontend/state/ScanState";
import {ToastProvider} from "@heroui/toast";
export default function App() { export default function App() {
const navigate = useNavigate();
client.middlewares = [ErrorHandlingMiddleware]; client.middlewares = [ErrorHandlingMiddleware];
initializeLibraryState(); initializeLibraryState();
@@ -23,7 +21,7 @@ export default function App() {
initializeScanState(); initializeScanState();
return ( return (
<HeroUIProvider className="size-full" navigate={navigate} useHref={useHref}> <HeroUIProvider className="size-full" navigate={useNavigate} useHref={useHref}>
<NextThemesProvider attribute="class" themes={themeNames()} defaultTheme="gameyfin-violet-dark"> <NextThemesProvider attribute="class" themes={themeNames()} defaultTheme="gameyfin-violet-dark">
<AuthProvider> <AuthProvider>
<IconContext.Provider value={{size: 20}}> <IconContext.Provider value={{size: 20}}>
+80 -80
View File
@@ -1,5 +1,3 @@
import {protectRoutes} from '@vaadin/hilla-react-auth';
import {createBrowserRouter, RouteObject} from 'react-router';
import LoginView from "Frontend/views/LoginView"; import LoginView from "Frontend/views/LoginView";
import MainLayout from "Frontend/views/MainLayout"; import MainLayout from "Frontend/views/MainLayout";
import HomeView from "Frontend/views/HomeView"; import HomeView from "Frontend/views/HomeView";
@@ -24,82 +22,84 @@ import LibraryManagementView from "Frontend/views/LibraryManagementView";
import SearchView from "Frontend/views/SearchView"; import SearchView from "Frontend/views/SearchView";
import RecentlyAddedView from "Frontend/views/RecentlyAddedView"; import RecentlyAddedView from "Frontend/views/RecentlyAddedView";
import LibraryView from "Frontend/views/LibraryView"; import LibraryView from "Frontend/views/LibraryView";
import {RouterConfigurationBuilder} from "@vaadin/hilla-file-router/runtime.js";
export const routes = protectRoutes([ export const {router, routes} = new RouterConfigurationBuilder()
{ .withReactRoutes([
element: <App/>, {
handle: {requiresLogin: false}, element: <App/>,
children: [ handle: {requiresLogin: false},
{ children: [
element: <MainLayout/>, {
handle: {requiresLogin: true}, element: <MainLayout/>,
children: [ handle: {requiresLogin: true},
{ children: [
index: true, element: <HomeView/> {
}, index: true, element: <HomeView/>
{ },
path: '/search', {
element: <SearchView/> path: 'search',
}, element: <SearchView/>
{ },
path: 'recently-added', {
element: <RecentlyAddedView/> path: 'recently-added',
}, element: <RecentlyAddedView/>
{ },
path: 'library/:libraryId', {
element: <LibraryView/> path: 'library/:libraryId',
}, element: <LibraryView/>
{ },
path: 'game/:gameId', {
element: <GameView/> path: 'game/:gameId',
}, element: <GameView/>
{ },
path: 'settings', {
element: <ProfileView/>, path: 'settings',
children: [ element: <ProfileView/>,
{path: 'profile', element: <ProfileManagement/>}, children: [
{path: 'appearance', element: <ThemeSelector/>} {path: 'profile', element: <ProfileManagement/>},
] {path: 'appearance', element: <ThemeSelector/>}
}, ]
{ },
path: 'administration', {
element: <AdministrationView/>, path: 'administration',
children: [ element: <AdministrationView/>,
{ children: [
path: 'libraries', {
element: <LibraryManagement/> path: 'libraries',
}, element: <LibraryManagement/>
{ },
path: 'libraries/library/:libraryId', {
element: <LibraryManagementView/> path: 'libraries/library/:libraryId',
}, element: <LibraryManagementView/>
{path: 'users', element: <UserManagement/>}, },
{path: 'sso', element: <SsoManagement/>}, {path: 'users', element: <UserManagement/>},
{path: 'messages', element: <MessageManagement/>}, {path: 'sso', element: <SsoManagement/>},
{path: 'plugins', element: <PluginManagement/>}, {path: 'messages', element: <MessageManagement/>},
{path: 'logs', element: <LogManagement/>}, {path: 'plugins', element: <PluginManagement/>},
{path: 'system', element: <SystemManagement/>} {path: 'logs', element: <LogManagement/>},
] {path: 'system', element: <SystemManagement/>}
} ]
] }
}, ]
{ },
path: '/login', element: <LoginView/>, handle: {requiresLogin: false} {
}, path: 'login', element: <LoginView/>, handle: {requiresLogin: false}
{ },
path: '/setup', element: <SetupView/>, handle: {requiresLogin: false} {
}, path: 'setup', element: <SetupView/>, handle: {requiresLogin: false}
{ },
path: '/accept-invitation', element: <InvitationRegistrationView/>, handle: {requiresLogin: false} {
}, path: 'accept-invitation', element: <InvitationRegistrationView/>, handle: {requiresLogin: false}
{ },
path: '/reset-password', element: <PasswordResetView/>, handle: {requiresLogin: false} {
}, path: 'reset-password', element: <PasswordResetView/>, handle: {requiresLogin: false}
{ },
path: '/confirm-email', element: <EmailConfirmationView/>, handle: {requiresLogin: true} {
}, path: 'confirm-email', element: <EmailConfirmationView/>, handle: {requiresLogin: true}
], },
} ]
]) as RouteObject[]; }
])
export default createBrowserRouter(routes); .protect("/login")
.build();