import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:sigap/src/cores/services/supabase_service.dart'; import 'package:sigap/src/features/daily-ops/presentasion/pages/patrol-unit/patrol_unit_screen.dart'; import 'package:sigap/src/features/explore/presentasion/pages/home-screen/home_screen.dart'; import 'package:sigap/src/features/map/presentasion/pages/map_screen.dart'; import 'package:sigap/src/features/notification/presentation/pages/notification_screen.dart'; import 'package:sigap/src/features/panic/presentation/pages/panic_button_page.dart'; import 'package:sigap/src/features/personalization/presentasion/pages/settings/setting_screen.dart'; import 'package:sigap/src/shared/widgets/navigation/custom_bottom_navigation_bar.dart'; class NavigationMenu extends StatelessWidget { const NavigationMenu({super.key}); @override Widget build(BuildContext context) { // Ensure NavigationController is registered in a binding first, then use find final controller = Get.find(); final theme = Theme.of(context); return Scaffold( backgroundColor: theme.scaffoldBackgroundColor, body: Obx( () => IndexedStack( index: controller.selectedIndex.value, children: controller.getScreens(), ), ), bottomNavigationBar: const CustomBottomNavigationBar(), ); } } class NavigationController extends GetxController { static NavigationController get instance => Get.find(); // Observable variable to track the current selected index final Rx selectedIndex = 2.obs; // Start with PanicButtonPage (index 2) final SupabaseService supabaseService; // Observable to track if user is an officer final RxBool isOfficer = false.obs; NavigationController({required this.supabaseService}); @override void onInit() { super.onInit(); _checkUserRole(); // Listen to auth state changes to update role when login/logout happens supabaseService.client.auth.onAuthStateChange.listen((data) { _checkUserRole(); }); } // Check if the current user is an officer void _checkUserRole() { isOfficer.value = supabaseService.isOfficer; } // Get the appropriate screens based on user role List getScreens() { final List screens = [ const HomeScreen(), const NotificationScreen(), const PanicButtonPage(), const MapScreen(), ]; // Add PatrolUnitScreen only if user is an officer if (isOfficer.value) { screens.add(const PatrolUnitScreen()); } // Always add the Settings screen at the end screens.add(const SettingsScreen()); return screens; } // Method to change selected index void changeIndex(int index) { // Ensure the index is valid for the current user role if (index < getScreens().length) { selectedIndex.value = index; } } // Get the maximum index based on available screens int get maxIndex => getScreens().length - 1; // Check if a specific screen index should be visible bool isScreenVisible(int index) { // The PatrolUnit screen is at index 4 if (index == 4) { return isOfficer.value; } return true; } }