import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import '../shared/layouts/app_scaffold.dart'; import '../features/front_hall/presentation/pages/front_hall_page.dart'; part 'app_router.g.dart'; /// Route paths as constants. abstract class AppRoutes { static const frontHall = '/'; static const controlRoom = '/control-room'; static const containers = '/control-room/containers'; static const containerDetail = '/control-room/containers/:id'; static const parlor = '/parlor'; static const settings = '/settings'; } /// Provides the GoRouter instance. @riverpod GoRouter appRouter(AppRouterRef ref) { return GoRouter( initialLocation: AppRoutes.frontHall, debugLogDiagnostics: true, routes: [ ShellRoute( builder: (context, state, child) => AppScaffold(child: child), routes: [ GoRoute( path: AppRoutes.frontHall, name: 'frontHall', builder: (context, state) => const FrontHallPage(), ), GoRoute( path: AppRoutes.controlRoom, name: 'controlRoom', builder: (context, state) => const _PlaceholderPage(title: 'Control Room'), routes: [ GoRoute( path: 'containers', name: 'containers', builder: (context, state) => const _PlaceholderPage(title: 'Containers'), routes: [ GoRoute( path: ':id', name: 'containerDetail', builder: (context, state) { final id = state.pathParameters['id']!; return _PlaceholderPage(title: 'Container: $id'); }, ), ], ), ], ), GoRoute( path: AppRoutes.parlor, name: 'parlor', builder: (context, state) => const _PlaceholderPage(title: 'Parlor'), ), GoRoute( path: AppRoutes.settings, name: 'settings', builder: (context, state) => const _PlaceholderPage(title: 'Settings'), ), ], ), ], ); } /// Placeholder page for routes not yet implemented. class _PlaceholderPage extends StatelessWidget { const _PlaceholderPage({required this.title}); final String title; @override Widget build(BuildContext context) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.construction, size: 64, color: Theme.of(context).colorScheme.outline, ), const SizedBox(height: 16), Text( title, style: Theme.of(context).textTheme.headlineMedium, ), const SizedBox(height: 8), Text( 'Coming soon', style: Theme.of(context).textTheme.bodyLarge?.copyWith( color: Theme.of(context).colorScheme.outline, ), ), ], ), ); } }