import 'dart:async'; import 'dart:convert'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:marco/helpers/services/permission_service.dart'; import 'package:marco/model/user_permission.dart'; import 'package:marco/model/employee_info.dart'; // Import the EmployeeInfo model class PermissionController extends GetxController { var permissions = [].obs; var employeeInfo = Rxn(); // Observable for employee info Timer? _refreshTimer; @override @override void onInit() { super.onInit(); _loadDataFromAPI(); // Always fetch from API at start _startAutoRefresh(); // Schedule auto-refresh } // Save permissions and employee info to SharedPreferences Future _storeData() async { final prefs = await SharedPreferences.getInstance(); // Store permissions final permissionsJson = permissions.map((e) => e.toJson()).toList(); print("Storing Permissions: $permissionsJson"); await prefs.setString('user_permissions', jsonEncode(permissionsJson)); // Store employee info if (employeeInfo.value != null) { final employeeInfoJson = employeeInfo.value!.toJson(); print("Storing Employee Info: $employeeInfoJson"); await prefs.setString('employee_info', jsonEncode(employeeInfoJson)); } } // Public method to load permissions and employee info (usually called from outside) Future loadData(String token) async { try { final result = await PermissionService.fetchPermissions(token); print("Fetched Permissions from API: $result"); permissions.assignAll(result); // Update observable list await _storeData(); // Cache locally // Also fetch employee info from the API (you can extend the service if needed) await _loadEmployeeInfoFromAPI(token); } catch (e) { print('Error loading data from API: $e'); } } // Internal helper to load token and fetch permissions and employee info from API Future _loadDataFromAPI() async { final token = await _getAuthToken(); if (token != null && token.isNotEmpty) { await loadData(token); } else { print("No token available for fetching data."); } } // Retrieve token from SharedPreferences Future _getAuthToken() async { final prefs = await SharedPreferences.getInstance(); return prefs.getString('jwt_token'); // Or 'auth_token' if that’s the key you're using } // Auto-refresh every 30 minutes void _startAutoRefresh() { _refreshTimer = Timer.periodic(Duration(minutes: 30), (timer) async { await _loadDataFromAPI(); }); } // Load employee info from the API Future _loadEmployeeInfoFromAPI(String token) async { final employeeInfoResponse = await PermissionService.fetchEmployeeInfo(token); print("Fetched Employee Info from API: $employeeInfoResponse"); employeeInfo.value = employeeInfoResponse; // Update observable employee info await _storeData(); // Cache employee info locally } // Check for specific permission bool hasPermission(String permissionId) { return permissions.any((p) => p.id == permissionId); } @override void onClose() { _refreshTimer?.cancel(); super.onClose(); } }