import 'dart:developer'; import 'package:absensi_qr/domain/enum/permission_status_enum.dart'; import 'package:absensi_qr/features/others/main_controller.dart'; import 'package:absensi_qr/models/permission_model.dart'; import 'package:absensi_qr/services/endpoint_service.dart'; import 'package:absensi_qr/utils/app_util.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; class PermissionController extends GetxController with GetSingleTickerProviderStateMixin { // service final EndpointService _httpService = Get.find(); final MainController mainController = Get.find(); // data state final RxList listPermission = [].obs; final RxList filteredListPermission = [].obs; // flag RxBool isLoading = false.obs; // controller tab category late final TabController tabController; final RxInt statusIndexSelected = 0.obs; // mapping for permission status by index of tab final Map permissionStatusByIndex = { 0: PermissionStatusEnum.proses, 1: PermissionStatusEnum.diterima, 2: PermissionStatusEnum.ditolak, }; final Rx statusSelected = PermissionStatusEnum.proses.obs; // filter date range // 2 bulan terakhir final Rx filterStartDate = DateTime.now().subtract(const Duration(days: 60)).obs; final Rx filterEndDate = DateTime.now().obs; // getter String get nameOfStudent => _httpService.studentData?.name ?? 'User'; @override void onInit() { super.onInit(); tabController = TabController(length: 3, vsync: this); tabController.addListener(() { if (!tabController.indexIsChanging) { statusIndexSelected.value = tabController.index; statusSelected.value = permissionStatusByIndex[statusIndexSelected.value] ?? PermissionStatusEnum.proses; log('status index selected: ${statusIndexSelected.value}'); // filter list permission by status filteredListPermission.value = listPermission .where((permission) => permission.status == statusSelected.value) .toList(); // sort by createdAt desc filteredListPermission.sort((a, b) => b.createdAt!.compareTo(a.createdAt!)); // sort by createdAt desc } }); ever(mainController.refreshPermission, (value) { getDataPermission(); }); getDataPermission(); } // helper state void goToTab(int i) { if (i != tabController.index) tabController.animateTo(i); statusIndexSelected.value = i; } // future function to api Future getDataPermission() async { isLoading.value = true; var result = await _httpService.getPermission( startDate: filterStartDate.value, endDate: filterEndDate.value); if (result.success) { final List>? raw = result.data; if (raw != null) { isLoading.value = false; print("Data Permission:"); final items = raw.map((e) => PermissionModel.fromJson(e)).toList(); listPermission.value = items; // filter list permission by status filteredListPermission.value = listPermission .where((permission) => permission.status == statusSelected.value) .toList(); } else { isLoading.value = false; listPermission.clear(); filteredListPermission.clear(); print("No permission data found."); } isLoading.value = false; } } @override void onClose() { // TODO: implement onClose super.onClose(); tabController.dispose(); } }