marco.pms.mobileapp/lib/controller/service_project/service_project_details_screen_controller.dart

126 lines
3.1 KiB
Dart

import 'package:get/get.dart';
import 'package:marco/helpers/services/api_service.dart';
import 'package:marco/model/service_project/service_projects_details_model.dart';
import 'package:marco/model/service_project/job_list_model.dart';
class ServiceProjectDetailsController extends GetxController {
// Selected project id
var projectId = ''.obs;
// Project details
var projectDetail = Rxn<ProjectDetail>();
// Job list
var jobList = <JobEntity>[].obs;
// Loading states
var isLoading = false.obs;
var isJobLoading = false.obs;
// Error messages
var errorMessage = ''.obs;
var jobErrorMessage = ''.obs;
// Pagination
var pageNumber = 1;
final int pageSize = 20;
var hasMoreJobs = true.obs;
@override
void onInit() {
super.onInit();
// Fetch job list initially even if projectId is empty
fetchProjectJobs(initialLoad: true);
}
/// Set project id and fetch its details + jobs
void setProjectId(String id) {
projectId.value = id;
fetchProjectDetail();
pageNumber = 1;
hasMoreJobs.value = true;
fetchProjectJobs(initialLoad: true);
}
/// Fetch project detail
Future<void> fetchProjectDetail() async {
if (projectId.value.isEmpty) {
errorMessage.value = "Invalid project ID";
return;
}
isLoading.value = true;
errorMessage.value = '';
try {
final result =
await ApiService.getServiceProjectDetailApi(projectId.value);
if (result != null && result.data != null) {
projectDetail.value = result.data!;
} else {
errorMessage.value =
result?.message ?? "Failed to fetch project details";
}
} catch (e) {
errorMessage.value = "Error: $e";
} finally {
isLoading.value = false;
}
}
/// Fetch project job list
Future<void> fetchProjectJobs({bool initialLoad = false}) async {
if (projectId.value.isEmpty && !initialLoad) {
jobErrorMessage.value = "Invalid project ID";
return;
}
if (!hasMoreJobs.value && !initialLoad) return;
isJobLoading.value = true;
jobErrorMessage.value = '';
try {
final result = await ApiService.getServiceProjectJobListApi(
projectId: "",
pageNumber: pageNumber,
pageSize: pageSize,
isActive: true,
);
if (result != null && result.data != null) {
if (initialLoad) {
jobList.value = result.data?.data ?? [];
} else {
jobList.addAll(result.data?.data ?? []);
}
hasMoreJobs.value = (result.data?.data?.length ?? 0) == pageSize;
if (hasMoreJobs.value) pageNumber++;
} else {
jobErrorMessage.value = result?.message ?? "Failed to fetch job list";
}
} catch (e) {
jobErrorMessage.value = "Error fetching jobs: $e";
} finally {
isJobLoading.value = false;
}
}
/// Fetch more jobs for pagination
Future<void> fetchMoreJobs() async {
await fetchProjectJobs();
}
/// Manual refresh
Future<void> refresh() async {
pageNumber = 1;
hasMoreJobs.value = true;
await Future.wait([
fetchProjectDetail(),
fetchProjectJobs(initialLoad: true),
]);
}
}