import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import '../../domain/repositories/grocery_repository.dart';
import '../screens/history/history_cubit.dart';
import '../screens/history/history_screen.dart';
import '../screens/item_detail/item_detail_cubit.dart';
import '../screens/item_detail/item_detail_screen.dart';
import '../screens/scanner/scanner_cubit.dart';
import '../screens/scanner/scanner_screen.dart';
part 'router.g.dart';
final goRouter = GoRouter(
initialLocation: '/scanner',
routes: $appRoutes,
);
@TypedStatefulShellRoute<HomeShellRouteData>(
branches: [
TypedStatefulShellBranch<ScannerBranchData>(
routes: [
TypedGoRoute<ScannerRouteData>(path: '/scanner'),
],
),
TypedStatefulShellBranch<HistoryBranchData>(
routes: [
TypedGoRoute<HistoryRouteData>(path: '/history'),
],
),
],
)
class HomeShellRouteData extends StatefulShellRouteData {
const HomeShellRouteData();
@override
Widget builder(
BuildContext context,
GoRouterState state,
StatefulNavigationShell navigationShell,
) {
return HomeShellScreen(navigationShell: navigationShell);
}
}
class ScannerBranchData extends StatefulShellBranchData {
const ScannerBranchData();
}
class HistoryBranchData extends StatefulShellBranchData {
const HistoryBranchData();
}
class ScannerRouteData extends GoRouteData with $ScannerRouteData {
const ScannerRouteData();
@override
Widget build(BuildContext context, GoRouterState state) {
return BlocProvider(
create: (context) => ScannerCubit(
repository: context.read<GroceryRepository>(),
),
child: const ScannerScreen(),
);
}
}
class HistoryRouteData extends GoRouteData with $HistoryRouteData {
const HistoryRouteData();
@override
Widget build(BuildContext context, GoRouterState state) {
return BlocProvider(
create: (context) =>
HistoryCubit(repository: context.read<GroceryRepository>())..load(),
child: const HistoryScreen(),
);
}
}
@TypedGoRoute<ItemDetailRouteData>(path: '/item/:barcode')
class ItemDetailRouteData extends GoRouteData with $ItemDetailRouteData {
final String barcode;
const ItemDetailRouteData({required this.barcode});
@override
Widget build(BuildContext context, GoRouterState state) {
return BlocProvider(
create: (context) => ItemDetailCubit(
repository: context.read<GroceryRepository>(),
)..loadItem(barcode),
child: ItemDetailScreen(barcode: barcode),
);
}
}
class HomeShellScreen extends StatelessWidget {
final StatefulNavigationShell navigationShell;
const HomeShellScreen({super.key, required this.navigationShell});
@override
Widget build(BuildContext context) {
return Scaffold(
body: navigationShell,
bottomNavigationBar: NavigationBar(
selectedIndex: navigationShell.currentIndex,
onDestinationSelected: (index) {
navigationShell.goBranch(
index,
initialLocation: index == navigationShell.currentIndex,
);
},
destinations: const [
NavigationDestination(
icon: Icon(Icons.qr_code_scanner),
label: 'Scan',
),
NavigationDestination(
icon: Icon(Icons.history),
label: 'History',
),
],
),
);
}
}