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

94 lines
3.1 KiB
Dart

import 'package:get/get.dart';
import 'package:on_field_work/helpers/services/app_logger.dart';
import 'package:on_field_work/helpers/services/api_service.dart';
import 'package:on_field_work/model/global_project_model.dart';
import 'package:on_field_work/helpers/services/storage/local_storage.dart';
class ProjectController extends GetxController {
RxList<GlobalProjectModel> projects = <GlobalProjectModel>[].obs;
RxString selectedProjectId = ''.obs;
RxBool isProjectSelectionExpanded = false.obs;
RxBool isProjectListExpanded = false.obs;
RxBool isProjectDropdownExpanded = false.obs;
RxBool isLoading = true.obs;
RxBool isLoadingProjects = true.obs;
RxMap<String, RxBool> uploadingStates = <String, RxBool>{}.obs;
// --------------------------
// Current selected project
// --------------------------
GlobalProjectModel? get selectedProject {
if (selectedProjectId.value.isEmpty) return null;
return projects.firstWhereOrNull((p) => p.id == selectedProjectId.value);
}
@override
void onInit() {
super.onInit();
fetchProjects();
}
// --------------------------
// Clear all projects & UI states
// --------------------------
void clearProjects() {
projects.clear();
selectedProjectId.value = '';
isProjectSelectionExpanded.value = false;
isProjectListExpanded.value = false;
isProjectDropdownExpanded.value = false;
isLoading.value = false;
isLoadingProjects.value = false;
uploadingStates.clear();
LocalStorage.saveString('selectedProjectId', '');
logSafe("Projects cleared and UI states reset.");
}
// --------------------------
// Fetch projects from API
// --------------------------
Future<void> fetchProjects() async {
isLoading.value = true;
isLoadingProjects.value = true;
try {
final response = await ApiService.getGlobalProjects();
if (response != null && response.isNotEmpty) {
projects.assignAll(response.map((json) => GlobalProjectModel.fromJson(json)).toList());
// Load previously saved project
String? savedId = LocalStorage.getString('selectedProjectId');
if (savedId != null && projects.any((p) => p.id == savedId)) {
selectedProjectId.value = savedId;
} else {
selectedProjectId.value = projects.first.id.toString();
LocalStorage.saveString('selectedProjectId', selectedProjectId.value);
}
logSafe("Projects fetched: ${projects.length}");
} else {
logSafe("No projects found or API call failed.", level: LogLevel.warning);
}
} catch (e, stack) {
logSafe("Error fetching projects: $e", level: LogLevel.error, stackTrace: stack);
} finally {
isLoading.value = false;
isLoadingProjects.value = false;
}
}
Future<void> updateSelectedProject(String projectId) async {
if (selectedProjectId.value == projectId) return;
selectedProjectId.value = projectId;
await LocalStorage.saveString('selectedProjectId', projectId);
logSafe("Selected project updated to $projectId");
isProjectSelectionExpanded.value = false;
update();
}
}