diff --git a/sigap-mobile/android/app/src/main/AndroidManifest.xml b/sigap-mobile/android/app/src/main/AndroidManifest.xml
index 2e8d653..04a1e76 100644
--- a/sigap-mobile/android/app/src/main/AndroidManifest.xml
+++ b/sigap-mobile/android/app/src/main/AndroidManifest.xml
@@ -5,6 +5,8 @@
+
+
-
diff --git a/sigap-mobile/lib/app.dart b/sigap-mobile/lib/app.dart
index 146b8fb..da2be11 100644
--- a/sigap-mobile/lib/app.dart
+++ b/sigap-mobile/lib/app.dart
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get_navigation/src/root/get_material_app.dart';
-import 'package:sigap/src/cores/bindings/general_bindings.dart';
+import 'package:sigap/src/cores/bindings/app_bindings.dart';
import 'package:sigap/src/cores/routes/app_pages.dart';
import 'package:sigap/src/utils/constants/colors.dart';
import 'package:sigap/src/utils/constants/text_strings.dart';
@@ -18,7 +18,7 @@ class App extends StatelessWidget {
theme: TAppTheme.lightTheme,
darkTheme: TAppTheme.darkTheme,
debugShowCheckedModeBanner: false,
- initialBinding: GeneralBindings(),
+ initialBinding: AppBindings(),
localizationsDelegates: GlobalMaterialLocalizations.delegates,
supportedLocales: const [Locale('id', '')],
getPages: AppPages.routes,
diff --git a/sigap-mobile/lib/main.dart b/sigap-mobile/lib/main.dart
index 862d855..394b76c 100644
--- a/sigap-mobile/lib/main.dart
+++ b/sigap-mobile/lib/main.dart
@@ -1,10 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
-import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:sigap/app.dart';
-import 'package:sigap/src/cores/repositories/panic-button/panic_button_repository.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
Future main() async {
@@ -32,9 +30,5 @@ Future main() async {
storageOptions: const StorageClientOptions(retryAttempts: 10),
);
- // Initialize repositories
- Get.put(PanicButtonRepository());
- await Get.find().init();
-
runApp(const App());
}
diff --git a/sigap-mobile/lib/src/cores/bindings/app_bindings.dart b/sigap-mobile/lib/src/cores/bindings/app_bindings.dart
new file mode 100644
index 0000000..d4b922d
--- /dev/null
+++ b/sigap-mobile/lib/src/cores/bindings/app_bindings.dart
@@ -0,0 +1,22 @@
+import 'package:get/get.dart';
+import 'package:sigap/src/cores/bindings/controller_bindings.dart';
+import 'package:sigap/src/cores/bindings/general_bindings.dart';
+import 'package:sigap/src/cores/bindings/repository_bindings.dart';
+import 'package:sigap/src/cores/bindings/service_bindings.dart';
+
+class AppBindings implements Bindings {
+ @override
+ Future dependencies() async {
+ // Register general helpers and utilities
+ UtilityBindings().dependencies();
+
+ // Register all services
+ await ServiceBindings().dependencies();
+
+ // Register all repositories
+ RepositoryBindings().dependencies();
+
+ // Register all feature controllers
+ ControllerBindings().dependencies();
+ }
+}
diff --git a/sigap-mobile/lib/src/cores/bindings/controller_bindings.dart b/sigap-mobile/lib/src/cores/bindings/controller_bindings.dart
index 817bf46..886e5f7 100644
--- a/sigap-mobile/lib/src/cores/bindings/controller_bindings.dart
+++ b/sigap-mobile/lib/src/cores/bindings/controller_bindings.dart
@@ -1,45 +1,17 @@
import 'package:get/get.dart';
-import 'package:sigap/src/features/auth/controllers/forgot_password_controller.dart';
-import 'package:sigap/src/features/auth/controllers/signin_controller.dart';
-import 'package:sigap/src/features/auth/controllers/signup_controller.dart';
-import 'package:sigap/src/features/onboarding/controllers/onboarding_controller.dart';
-import 'package:sigap/src/features/onboarding/controllers/role_selection_controller.dart';
+import 'package:sigap/src/features/auth/bindings/auth_bindings.dart';
+import 'package:sigap/src/features/onboarding/bindings/onboarding_binding.dart';
-// Onboarding controller bindings
-class OnboardingControllerBinding extends Bindings {
+class ControllerBindings extends Bindings {
@override
void dependencies() {
- Get.lazyPut(() => OnboardingController());
+ // Register all controllers here
+
+ // Onboarding Bindings
+ OnboardingBindings().dependencies();
+
+ // Auth Bindings
+ AuthBindings().dependencies();
+
}
}
-
-class RoleSelectionControllerBinding extends Bindings {
- @override
- void dependencies() {
- Get.lazyPut(() => RoleSelectionController());
- }
-}
-
-// Auth controller bindings
-class SignInControllerBinding extends Bindings {
- @override
- void dependencies() {
- Get.lazyPut(() => SignInController());
- }
-}
-
-class SignUpControllerBinding extends Bindings {
- @override
- void dependencies() {
- Get.lazyPut(() => SignUpController());
- }
-}
-
-class ForgotPasswordControllerBinding extends Bindings {
- @override
- void dependencies() {
- Get.lazyPut(() => ForgotPasswordController());
- }
-}
-
-// Main controller bindings
diff --git a/sigap-mobile/lib/src/cores/bindings/general_bindings.dart b/sigap-mobile/lib/src/cores/bindings/general_bindings.dart
index 7b3b711..a0d1fe0 100644
--- a/sigap-mobile/lib/src/cores/bindings/general_bindings.dart
+++ b/sigap-mobile/lib/src/cores/bindings/general_bindings.dart
@@ -2,7 +2,7 @@ import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/utils/helpers/network_manager.dart';
-class GeneralBindings extends Bindings {
+class UtilityBindings extends Bindings {
Logger? get logger => Logger();
@override
diff --git a/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart b/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart
index f28c3ff..f2efcc5 100644
--- a/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart
+++ b/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart
@@ -9,25 +9,14 @@ import 'package:sigap/src/cores/repositories/personalization/users_repository.da
class RepositoryBindings extends Bindings {
@override
void dependencies() {
- // Auth Repository
Get.lazyPut(
() => AuthenticationRepository(),
fenix: true,
);
-
- // User Repository
Get.lazyPut(() => UserRepository(), fenix: true);
-
- // Officer Repository
Get.lazyPut(() => OfficerRepository(), fenix: true);
-
- // Unit Repository
Get.lazyPut(() => UnitRepository(), fenix: true);
-
- // Profile Repository
Get.lazyPut(() => ProfileRepository(), fenix: true);
-
- // Role Repository
Get.lazyPut(() => RolesRepository(), fenix: true);
}
}
diff --git a/sigap-mobile/lib/src/cores/repositories/auth/auth_repositories.dart b/sigap-mobile/lib/src/cores/repositories/auth/auth_repositories.dart
deleted file mode 100644
index d7a7155..0000000
--- a/sigap-mobile/lib/src/cores/repositories/auth/auth_repositories.dart
+++ /dev/null
@@ -1,504 +0,0 @@
-import 'package:flutter/services.dart';
-import 'package:flutter_native_splash/flutter_native_splash.dart';
-import 'package:get/get.dart';
-import 'package:get_storage/get_storage.dart';
-import 'package:sigap/src/cores/services/biometric_service.dart';
-import 'package:sigap/src/cores/services/location_service.dart';
-import 'package:sigap/src/cores/services/supabase_service.dart';
-import 'package:sigap/src/features/auth/screens/signin/signin_screen.dart';
-import 'package:sigap/src/utils/constants/app_routes.dart';
-import 'package:sigap/src/utils/exceptions/exceptions.dart';
-import 'package:sigap/src/utils/exceptions/format_exceptions.dart';
-import 'package:sigap/src/utils/exceptions/platform_exceptions.dart';
-import 'package:supabase_flutter/supabase_flutter.dart';
-
-class AuthenticationRepository extends GetxController {
- static AuthenticationRepository get instance => Get.find();
-
- // Variable
- final storage = GetStorage();
- final _supabase = SupabaseService.instance.client;
- final _locationService = LocationService.instance;
- final _biometricService = Get.put(BiometricService());
-
- // Getters that use the Supabase service
- User? get authUser => SupabaseService.instance.currentUser;
- String? get currentUserId => SupabaseService.instance.currentUserId;
-
- @override
- void onReady() {
- FlutterNativeSplash.remove();
- screenRedirect();
- }
-
- // Check for biometric login on app start
- Future attemptBiometricLogin() async {
- if (!await _biometricService.isBiometricLoginEnabled()) {
- return false;
- }
-
- String? refreshToken = await _biometricService.attemptBiometricLogin();
- if (refreshToken == null || refreshToken.isEmpty) {
- return false;
- }
-
- try {
- // Use the refresh token to recover the session
- final response = await _supabase.auth.refreshSession(refreshToken);
- if (response.session != null) {
- Get.offAllNamed(AppRoutes.explore);
- return true;
- }
- return false;
- } catch (e) {
- // If refresh token is invalid or expired, disable biometric login
- await _biometricService.disableBiometricLogin();
- return false;
- }
- }
-
- // Check if the onboarding process is complete
- Future isOnboardingComplete() async {
- return storage.read('ONBOARDING_COMPLETED') ?? false;
- }
-
- // Screen redirect based on auth status
- void screenRedirect() async {
- final user = _supabase.auth.currentUser;
-
- if (user != null) {
- // User is authenticated
- Get.offAllNamed(AppRoutes.panicButton);
- } else {
- // Check if onboarding is completed
- final onboardingCompleted = await isOnboardingComplete();
-
- if (onboardingCompleted) {
- // Check location validity
- final isLocationValid =
- await _locationService.isLocationValidForFeature();
-
- if (isLocationValid) {
- // Go to role selection
- Get.offAllNamed(AppRoutes.roleSelection);
- } else {
- // Show location warning
- Get.offAllNamed(AppRoutes.locationWarning);
- }
- } else {
- // Show onboarding
- Get.offAllNamed(AppRoutes.onboarding);
- }
- }
- }
-
- // ----------------- Email and Password Sign In -----------------
- Future signInWithEmailPassword({
- required String email,
- required String password,
- }) async {
- try {
- // Check if the user is banned
- final bannedUser = await _supabase.rpc(
- 'check_if_banned',
- params: {'user_email': email},
- );
- if (bannedUser != null && bannedUser == true) {
- throw TExceptions(
- 'This account has been banned due to violation of terms.',
- );
- }
-
- final response = await _supabase.auth.signInWithPassword(
- email: email,
- password: password,
- );
-
- // Setup biometric login if available
- if (_biometricService.isBiometricAvailable.value) {
- // Ask user if they want to enable biometric login
- // This would typically be done in the UI, but setting up the flow here
- await _biometricService.enableBiometricLogin();
- }
-
- return response;
- } on AuthException catch (e) {
- throw TExceptions(e.message);
- } on FormatException catch (_) {
- throw const TFormatException();
- } on PlatformException catch (e) {
- throw TPlatformException(e.code).message;
- } on PostgrestException catch (error) {
- throw TExceptions.fromCode(error.code ?? 'unknown_error');
- } catch (e) {
- throw TExceptions('Something went wrong. Please try again later.');
- }
- }
-
- // [SESSION] - CHECK SESSION
- Future