Tambahkan rute baru untuk modul Warga, termasuk WargaDashboard, WargaPenyaluran, dan WargaPengaduan. Perbarui referensi import di app_pages.dart dan app_routes.dart untuk mencerminkan perubahan ini, meningkatkan struktur dan navigasi aplikasi.

This commit is contained in:
Khafidh Fuadi
2025-03-16 17:20:18 +07:00
parent dfc6080e77
commit a3798f0005
15 changed files with 1587 additions and 48 deletions

View File

@ -0,0 +1,172 @@
import 'package:get/get.dart';
import 'package:penyaluran_app/app/data/models/penerima_penyaluran_model.dart';
import 'package:penyaluran_app/app/data/models/pengaduan_model.dart';
import 'package:penyaluran_app/app/data/models/pengajuan_kelayakan_bantuan_model.dart';
import 'package:penyaluran_app/app/data/models/user_model.dart';
import 'package:penyaluran_app/app/modules/auth/controllers/auth_controller.dart';
class WargaDashboardController extends GetxController {
final AuthController _authController = Get.find<AuthController>();
final Rx<UserModel?> currentUser = Rx<UserModel?>(null);
// Indeks tab yang aktif di bottom navigation bar
final RxInt activeTabIndex = 0.obs;
// Data untuk summary penerima penyaluran
final RxList<PenerimaPenyaluranModel> penerimaPenyaluran =
<PenerimaPenyaluranModel>[].obs;
final RxInt totalPenyaluranDiterima = 0.obs;
// Data untuk daftar pengajuan kelayakan bantuan
final RxList<PengajuanKelayakanBantuanModel> pengajuanKelayakan =
<PengajuanKelayakanBantuanModel>[].obs;
final RxInt totalPengajuanMenunggu = 0.obs;
final RxInt totalPengajuanTerverifikasi = 0.obs;
final RxInt totalPengajuanDitolak = 0.obs;
// Data untuk summary pengaduan
final RxList<PengaduanModel> pengaduan = <PengaduanModel>[].obs;
final RxInt totalPengaduan = 0.obs;
final RxInt totalPengaduanProses = 0.obs;
final RxInt totalPengaduanSelesai = 0.obs;
// Indikator loading
final RxBool isLoading = false.obs;
// Jumlah notifikasi belum dibaca
final RxInt jumlahNotifikasiBelumDibaca = 0.obs;
// Getter untuk data user
UserModel? get user => _authController.user;
String get role => user?.role ?? 'WARGA';
String get nama => user?.name ?? 'Warga';
String? get desa => user?.desa?.nama;
@override
void onInit() {
super.onInit();
fetchData();
loadUserData();
}
void loadUserData() {
currentUser.value = _authController.user;
}
void fetchData() async {
isLoading.value = true;
try {
// TODO: Implementasi fetch data dari API
// Contoh data dummy untuk pengembangan UI
await Future.delayed(const Duration(seconds: 1));
// Dummy data penerima penyaluran
penerimaPenyaluran.value = [
PenerimaPenyaluranModel(
id: '1',
statusPenerimaan: 'DITERIMA',
tanggalPenerimaan: DateTime.now().subtract(const Duration(days: 5)),
jumlahBantuan: 50000,
keterangan: 'Bantuan Tunai',
),
PenerimaPenyaluranModel(
id: '2',
statusPenerimaan: 'DITERIMA',
tanggalPenerimaan: DateTime.now().subtract(const Duration(days: 15)),
jumlahBantuan: 100000,
keterangan: 'Bantuan Sembako',
),
];
totalPenyaluranDiterima.value = penerimaPenyaluran.length;
// Dummy data pengajuan kelayakan
pengajuanKelayakan.value = [
PengajuanKelayakanBantuanModel(
id: '1',
status: StatusKelayakan.MENUNGGU,
createdAt: DateTime.now().subtract(const Duration(days: 2)),
),
PengajuanKelayakanBantuanModel(
id: '2',
status: StatusKelayakan.TERVERIFIKASI,
createdAt: DateTime.now().subtract(const Duration(days: 10)),
),
PengajuanKelayakanBantuanModel(
id: '3',
status: StatusKelayakan.DITOLAK,
createdAt: DateTime.now().subtract(const Duration(days: 20)),
alasanVerifikasi: 'Dokumen tidak lengkap',
),
];
totalPengajuanMenunggu.value = pengajuanKelayakan
.where((p) => p.status == StatusKelayakan.MENUNGGU)
.length;
totalPengajuanTerverifikasi.value = pengajuanKelayakan
.where((p) => p.status == StatusKelayakan.TERVERIFIKASI)
.length;
totalPengajuanDitolak.value = pengajuanKelayakan
.where((p) => p.status == StatusKelayakan.DITOLAK)
.length;
// Dummy data pengaduan
pengaduan.value = [
PengaduanModel(
id: '1',
judul: 'Bantuan tidak sesuai',
status: 'PROSES',
tanggalPengaduan: DateTime.now().subtract(const Duration(days: 3)),
),
PengaduanModel(
id: '2',
judul: 'Keterlambatan penyaluran',
status: 'SELESAI',
tanggalPengaduan: DateTime.now().subtract(const Duration(days: 25)),
),
];
totalPengaduan.value = pengaduan.length;
totalPengaduanProses.value =
pengaduan.where((p) => p.status == 'PROSES').length;
totalPengaduanSelesai.value =
pengaduan.where((p) => p.status == 'SELESAI').length;
// Dummy data notifikasi
jumlahNotifikasiBelumDibaca.value = 3;
} catch (e) {
print('Error fetching data: $e');
} finally {
isLoading.value = false;
}
}
// Navigasi ke halaman detail
void goToPenyaluranDetail() {
changeTab(1);
}
void goToPengajuanDetail() {
// TODO: Implementasi navigasi ke halaman detail pengajuan
// Untuk saat ini, belum ada halaman detail pengajuan
}
void goToPengaduanDetail() {
changeTab(2);
}
// Fungsi untuk mengubah tab
void changeTab(int index) {
activeTabIndex.value = index;
// Tidak perlu navigasi ke halaman lain, cukup ubah indeks tab
// yang akan mengubah konten body di WargaView
}
// Fungsi untuk logout
void logout() {
_authController.logout();
}
}