import "package:flutter/material.dart"; import "../i18n.dart"; import "../main.dart"; import "dashboard_screen.dart"; import "charging_screen.dart"; import "settings_screen.dart"; import "admin_users_screen.dart"; /// The app's root shell — a persistent bottom navigation bar (DriverVault mockup /// layout) hosting the Garage, Charging, Settings and (for admins) Users sections /// in an IndexedStack so each keeps its state as you switch tabs. class RootShell extends StatefulWidget { const RootShell({super.key}); @override State createState() => _RootShellState(); } class _RootShellState extends State { int _index = 0; @override Widget build(BuildContext context) { final isAdmin = authService.user?.isAdmin == true; final pages = [ const DashboardScreen(), const ChargingScreen(), const SettingsScreen(), if (isAdmin) const AdminUsersScreen(), ]; final destinations = [ NavigationDestination( icon: const Icon(Icons.grid_view_outlined), selectedIcon: const Icon(Icons.grid_view_rounded), label: t("nav.garage"), ), NavigationDestination( icon: const Icon(Icons.ev_station_outlined), selectedIcon: const Icon(Icons.ev_station), label: t("nav.charging"), ), NavigationDestination( icon: const Icon(Icons.settings_outlined), selectedIcon: const Icon(Icons.settings), label: t("nav.settings"), ), if (isAdmin) NavigationDestination( icon: const Icon(Icons.group_outlined), selectedIcon: const Icon(Icons.group), label: t("nav.users"), ), ]; // Guard against the index falling out of range if admin status changes. final index = _index.clamp(0, pages.length - 1); return Scaffold( body: IndexedStack(index: index, children: pages), bottomNavigationBar: NavigationBar( selectedIndex: index, onDestinationSelected: (i) => setState(() => _index = i), destinations: destinations, ), ); } }