marco.pms.mobileapp/lib/controller/permission_controller.dart

104 lines
3.0 KiB
Dart

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 = <UserPermission>[].obs;
var employeeInfo = Rxn<EmployeeInfo>();
var projectsInfo = <ProjectInfo>[].obs;
Timer? _refreshTimer;
@override
void onInit() {
super.onInit();
_loadDataFromAPI();
_startAutoRefresh();
}
// Store all data at once to reduce redundant operations
Future<void> _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<void> _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<void> 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<String, dynamic> userData) {
permissions.assignAll(userData['permissions']);
employeeInfo.value = userData['employeeInfo'];
projectsInfo.assignAll(userData['projects']);
}
// Fetch the auth token from SharedPreferences
Future<String?> _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();
}
}