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 'package:marco/model/projects_model.dart'; class PermissionController extends GetxController { var permissions = [].obs; var employeeInfo = Rxn(); var projectsInfo = [].obs; Timer? _refreshTimer; @override void onInit() { super.onInit(); _loadDataFromAPI(); _startAutoRefresh(); } // Store all data at once to reduce redundant operations Future _storeData() async { final prefs = await SharedPreferences.getInstance(); // Store permissions await prefs.setString( 'user_permissions', jsonEncode(permissions.map((e) => e.toJson()).toList())); // Store employee info if available if (employeeInfo.value != null) { await prefs.setString( 'employee_info', jsonEncode(employeeInfo.value!.toJson())); } // Store projects info if available if (projectsInfo.isNotEmpty) { await prefs.setString('projects_info', jsonEncode(projectsInfo.map((e) => e.toJson()).toList())); } } // Fetch and load all required data (permissions, employee info, and projects) Future _loadDataFromAPI() async { final token = await _getAuthToken(); if (token?.isNotEmpty ?? false) { await loadData(token!); } else { print("No token available for fetching data."); } } // Fetch data and update the state (permissions, employee info, and projects) Future loadData(String token) async { try { final userData = await PermissionService.fetchAllUserData(token); // Update state variables _updateState(userData); // Store all data after fetching await _storeData(); } catch (e) { print('Error loading data from API: $e'); } } // Update state variables (permissions, employeeInfo, and projects) void _updateState(Map userData) { permissions.assignAll(userData['permissions']); employeeInfo.value = userData['employeeInfo']; projectsInfo.assignAll(userData['projects']); } // Fetch the auth token from SharedPreferences Future _getAuthToken() async { final prefs = await SharedPreferences.getInstance(); return prefs.getString('jwt_token'); } // Set up automatic data refresh every 30 minutes void _startAutoRefresh() { _refreshTimer = Timer.periodic(Duration(minutes: 30), (timer) async { await _loadDataFromAPI(); }); } // Check if the user has the given permission bool hasPermission(String permissionId) { return permissions.any((p) => p.id == permissionId); } bool isUserAssignedToProject(String projectId) { return projectsInfo.any((project) => project.id == projectId); } @override void onClose() { _refreshTimer?.cancel(); super.onClose(); } }