Files
platforms/apps/service_app/lib/app/router.dart

141 lines
4.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../ui/features/auth/login_page.dart';
import '../ui/features/evidence/evidence_page.dart';
import '../ui/features/preflight/preflight_page.dart';
import '../ui/features/profile/profile_page.dart';
import '../ui/features/work/work_detail_page.dart';
import '../ui/features/work/work_list_page.dart';
import 'dependencies.dart';
GoRouter createRouter(AppDependencies dependencies) => GoRouter(
initialLocation: '/preflight',
refreshListenable: dependencies.session,
redirect: (context, state) {
final login = state.matchedLocation == '/login';
if (!dependencies.session.isAuthenticated && !login) return '/login';
if (dependencies.session.isAuthenticated && login) return '/preflight';
return null;
},
routes: [
GoRoute(
path: '/login',
builder: (context, state) => LoginPage(session: dependencies.session),
),
GoRoute(
path: '/preflight',
builder: (context, state) => PreflightPage(
session: dependencies.session,
repository: dependencies.repository,
),
),
GoRoute(
path: '/tasks/:identity',
builder: (context, state) => WorkDetailPage(
session: dependencies.session,
repository: dependencies.repository,
drafts: dependencies.drafts,
identity: state.pathParameters['identity']!,
),
routes: [
GoRoute(
path: 'evidence',
builder: (context, state) => EvidencePage(
session: dependencies.session,
repository: dependencies.repository,
drafts: dependencies.drafts,
taskIdentity: state.pathParameters['identity']!,
),
),
],
),
StatefulShellRoute.indexedStack(
builder: (context, state, shell) => _ServiceShell(
navigationShell: shell,
roleCode: dependencies.session.roleCode,
),
branches: [
StatefulShellBranch(
routes: [
GoRoute(
path: '/work',
builder: (context, state) => WorkListPage(
session: dependencies.session,
repository: dependencies.repository,
completed: false,
),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
path: '/records',
builder: (context, state) => WorkListPage(
session: dependencies.session,
repository: dependencies.repository,
completed: true,
),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
path: '/me',
builder: (context, state) => ProfilePage(
session: dependencies.session,
repository: dependencies.repository,
drafts: dependencies.drafts,
),
),
],
),
],
),
],
);
class _ServiceShell extends StatelessWidget {
const _ServiceShell({required this.navigationShell, required this.roleCode});
final StatefulNavigationShell navigationShell;
final String roleCode;
@override
Widget build(BuildContext context) => Scaffold(
body: navigationShell,
bottomNavigationBar: NavigationBar(
selectedIndex: navigationShell.currentIndex,
onDestinationSelected: (index) => navigationShell.goBranch(
index,
initialLocation: index == navigationShell.currentIndex,
),
destinations: [
NavigationDestination(
icon: Icon(
roleCode == 'delivery' ? Icons.local_shipping_outlined : Icons.assignment_outlined,
),
selectedIcon: Icon(roleCode == 'delivery' ? Icons.local_shipping : Icons.assignment),
label: roleCode == 'delivery'
? '配送'
: roleCode == 'operations'
? '安检'
: '工单',
),
const NavigationDestination(
icon: Icon(Icons.history),
selectedIcon: Icon(Icons.history_toggle_off),
label: '记录',
),
const NavigationDestination(
icon: Icon(Icons.person_outline),
selectedIcon: Icon(Icons.person),
label: '我的',
),
],
),
);
}