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 projects = [].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 uploadingStates = {}.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 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 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(); } }