import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:sigap/src/cores/services/supabase_service.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 = 0.obs; // Start with PanicButtonPage (index 0) 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() { return [ const PanicButtonPage(), const SettingsScreen(), ]; } // 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; } }