first commit

This commit is contained in:
Andreas Malvino
2025-06-02 22:39:03 +07:00
commit e7090af3da
245 changed files with 49210 additions and 0 deletions

View File

@ -0,0 +1,136 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../routes/app_routes.dart';
/// Service untuk menangani navigasi dalam aplikasi
/// Memisahkan logika navigasi dari controller
class NavigationService extends GetxService {
static NavigationService get to => Get.find<NavigationService>();
// Track the current navbar index for warga pages
final currentNavIndex = 0.obs;
/// Inisialisasi service
Future<NavigationService> init() async {
debugPrint('🧭 NavigationService initialized');
return this;
}
/// Set current navbar index
void setNavIndex(int index) {
currentNavIndex.value = index;
}
/// Navigasi ke halaman Sewa Aset
void toSewaAset() {
debugPrint('🧭 Navigating to SewaAset');
setNavIndex(0); // Set appropriate index
Get.toNamed(Routes.SEWA_ASET, preventDuplicates: false);
}
/// Navigasi ke halaman Detail Sewa Aset dengan ID
Future<void> toOrderSewaAset(String asetId) async {
debugPrint('🧭 Navigating to OrderSewaAset with ID: $asetId');
if (asetId.isEmpty) {
Get.snackbar(
'Error',
'ID aset tidak valid',
snackPosition: SnackPosition.BOTTOM,
backgroundColor: Colors.red,
colorText: Colors.white,
);
return;
}
// Navigasi dengan arguments
Get.toNamed(
Routes.ORDER_SEWA_ASET,
arguments: {'asetId': asetId},
preventDuplicates: false,
);
}
/// Navigasi ke halaman Order Sewa Paket dengan ID
Future<void> toOrderSewaPaket(String paketId) async {
debugPrint('🧭 Navigating to OrderSewaPaket with ID: $paketId');
if (paketId.isEmpty) {
Get.snackbar(
'Error',
'ID paket tidak valid',
snackPosition: SnackPosition.BOTTOM,
backgroundColor: Colors.red,
colorText: Colors.white,
);
return;
}
// Navigasi dengan arguments
Get.toNamed(
Routes.ORDER_SEWA_PAKET,
arguments: {'paketId': paketId},
preventDuplicates: false,
);
}
/// Navigasi kembali dari OrderSewaAset ke SewaAset
void backFromOrderSewaAset() {
debugPrint('🧭 Navigating back from OrderSewaAset to SewaAset');
Get.back();
}
/// Navigasi kembali dari SewaAset ke dashboard warga
void backFromSewaAset() {
debugPrint('🧭 Navigating back from SewaAset to WargaDashboard');
setNavIndex(0); // Home tab
Get.offNamed(Routes.WARGA_DASHBOARD);
}
/// Navigasi ke Warga Sewa (tab sewa)
void toWargaSewa() {
debugPrint('🧭 Navigating to WargaSewa');
setNavIndex(1); // Sewa tab
Get.offNamed(Routes.WARGA_SEWA);
}
/// Navigasi ke Warga Langganan (tab langganan)
void toWargaLangganan() {
debugPrint('🧭 Navigating to WargaLangganan');
setNavIndex(2); // Langganan tab
Get.offNamed(Routes.LANGGANAN);
}
/// Navigasi ke Profile (tab profil)
void toProfile() {
debugPrint('🧭 Navigating to Profile');
setNavIndex(2); // Profile tab
Get.offNamed(Routes.PROFILE);
}
/// Navigasi ke dashboard sesuai role
void toDashboard(String role) {
debugPrint('🧭 Navigating to dashboard for role: $role');
switch (role.toLowerCase()) {
case 'warga':
setNavIndex(0); // Reset to home tab
Get.offAllNamed(Routes.WARGA_DASHBOARD);
break;
case 'petugas_bumdes':
Get.offAllNamed(Routes.PETUGAS_BUMDES_DASHBOARD);
break;
default:
Get.offAllNamed(Routes.LOGIN);
}
}
/// Navigasi ke login
void toLogin() {
debugPrint('🧭 Navigating to login');
Get.offAllNamed(Routes.LOGIN);
}
/// Navigasi mundur satu langkah
void back() {
debugPrint('🧭 Going back');
Get.back();
}
}

View File

@ -0,0 +1,68 @@
import 'package:get/get.dart';
import 'navigation_service.dart';
import '../data/providers/auth_provider.dart';
import '../modules/warga/controllers/warga_dashboard_controller.dart';
/// Abstract class untuk mengelola lifecycle service dan dependency
abstract class ServiceManager {
/// Getter untuk akses NavigationService
static NavigationService get navigationService {
if (!Get.isRegistered<NavigationService>()) {
Get.put(NavigationService());
}
return Get.find<NavigationService>();
}
/// Mendaftarkan semua service yang dibutuhkan aplikasi
/// Sebaiknya dipanggil di awal aplikasi (main.dart)
static void registerServices() {
// Register service yang bersifat global dan permanent
if (!Get.isRegistered<NavigationService>()) {
Get.put(NavigationService());
}
// Register AuthProvider if not already registered
if (!Get.isRegistered<AuthProvider>()) {
Get.put(AuthProvider(), permanent: true);
}
// Register WargaDashboardController as a permanent controller
// This ensures it's always available for the drawer
registerWargaDashboardController();
}
/// Register WargaDashboardController as a singleton
static void registerWargaDashboardController() {
// Make sure Auth Provider is registered first
if (!Get.isRegistered<AuthProvider>()) {
Get.put(AuthProvider(), permanent: true);
}
// Register WargaDashboardController if not already registered
if (!Get.isRegistered<WargaDashboardController>()) {
Get.put(WargaDashboardController(), permanent: true);
}
}
/// Mendaftarkan controller untuk suatu page
/// Sebaiknya dipanggil di method dependencies() dalam Binding class
static void registerController<T>(T controller, {bool permanent = false}) {
if (Get.isRegistered<T>()) {
Get.delete<T>(force: true);
}
Get.put<T>(controller, permanent: permanent);
}
/// Membersihkan controller ketika tidak digunakan
/// Sebaiknya dipanggil dalam method onClose() di controller
static void cleanupController<T>() {
if (Get.isRegistered<T>()) {
Get.delete<T>(force: true);
}
}
/// Memeriksa apakah sebuah controller sudah terdaftar
static bool isControllerRegistered<T>() {
return Get.isRegistered<T>();
}
}