diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index a5c10710..a5810d9b 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
xmlns:tools="http://schemas.android.com/tools">
+
+
diff --git a/lib/core/di/di.dart b/lib/core/di/di.dart
new file mode 100644
index 00000000..d1bb7516
--- /dev/null
+++ b/lib/core/di/di.dart
@@ -0,0 +1,101 @@
+import 'package:flutter_dotenv/flutter_dotenv.dart';
+import 'package:get_it/get_it.dart';
+import 'package:supabase_flutter/supabase_flutter.dart';
+import 'package:flutter_stripe/flutter_stripe.dart';
+import 'package:flutter_local_notifications/flutter_local_notifications.dart';
+import 'package:go_router/go_router.dart';
+
+// services
+import 'package:clean_stream_laundry_app/logic/services/auth_service.dart';
+import 'package:clean_stream_laundry_app/logic/services/edge_function_service.dart';
+import 'package:clean_stream_laundry_app/logic/services/location_service.dart';
+import 'package:clean_stream_laundry_app/logic/services/machine_communication_service.dart';
+import 'package:clean_stream_laundry_app/logic/services/machine_service.dart';
+import 'package:clean_stream_laundry_app/logic/services/payment_service.dart';
+import 'package:clean_stream_laundry_app/logic/services/profile_service.dart';
+import 'package:clean_stream_laundry_app/logic/services/transaction_service.dart';
+
+// implementations
+import 'package:clean_stream_laundry_app/services/supabase/supabase_auth_service.dart';
+import 'package:clean_stream_laundry_app/services/supabase/supabase_edge_function_service.dart';
+import 'package:clean_stream_laundry_app/services/supabase/supabase_location_service.dart';
+import 'package:clean_stream_laundry_app/services/supabase/supabase_machine_service.dart';
+import 'package:clean_stream_laundry_app/services/supabase/supabase_profile_service.dart';
+import 'package:clean_stream_laundry_app/services/supabase/supabase_transaction_service.dart';
+import 'package:clean_stream_laundry_app/services/stripe/stripe_service.dart';
+import 'package:clean_stream_laundry_app/services/nayax/machine_communicator.dart';
+
+// misc
+import 'package:clean_stream_laundry_app/core/router/app_router.dart';
+import 'package:clean_stream_laundry_app/services/notification_service.dart';
+import 'package:clean_stream_laundry_app/logic/payment/process_payment.dart';
+
+final getIt = GetIt.instance;
+
+Future setupDependencies() async {
+ await dotenv.load(fileName: '.env');
+
+ await Supabase.initialize(
+ url: dotenv.env['SUPABASE_URL']!,
+ anonKey: dotenv.env['ANON_KEY']!,
+ );
+
+ final supabase = Supabase.instance.client;
+
+ Stripe.publishableKey = dotenv.env['STRIPE_PUBLISHABLE_KEY']!;
+
+ getIt.registerLazySingleton(
+ () => SupabaseTransactionService(client: supabase),
+ );
+
+ getIt.registerLazySingleton(
+ () => SupabaseProfileService(client: supabase),
+ );
+
+ getIt.registerLazySingleton(
+ () => SupabaseMachineService(client: supabase),
+ );
+
+ getIt.registerLazySingleton(
+ () => SupabaseLocationHandler(client: supabase),
+ );
+
+ getIt.registerLazySingleton(
+ () => SupabaseEdgeFunctionService(client: supabase),
+ );
+
+ getIt.registerLazySingleton(
+ () => SupabaseAuthService(client: supabase),
+ );
+
+ getIt.registerLazySingleton(() => StripeService());
+
+ getIt.registerLazySingleton(() => Stripe.instance);
+
+ getIt.registerLazySingleton(
+ () => MachineCommunicator(
+ edgeFunctionService: getIt(),
+ ),
+ );
+
+ getIt.registerLazySingleton(() => RouterService());
+
+ getIt.registerLazySingleton(
+ () => NotificationService(),
+ );
+
+ getIt.registerSingleton(
+ FlutterLocalNotificationsPlugin(),
+ );
+
+ getIt.registerLazySingleton(
+ () => PaymentProcessor(),
+ );
+
+ getIt.registerLazySingleton(() {
+ final authService = getIt();
+ final routerService = getIt();
+
+ return routerService.createRouter(authService);
+ });
+}
\ No newline at end of file
diff --git a/lib/middleware/app_router.dart b/lib/core/router/app_router.dart
similarity index 75%
rename from lib/middleware/app_router.dart
rename to lib/core/router/app_router.dart
index 29da1173..e3aa4cd2 100644
--- a/lib/middleware/app_router.dart
+++ b/lib/core/router/app_router.dart
@@ -1,24 +1,25 @@
import 'package:app_links/app_links.dart';
-import 'package:clean_stream_laundry_app/pages/change_email_verification.dart';
-import 'package:clean_stream_laundry_app/pages/edit_profile_page.dart';
-import 'package:clean_stream_laundry_app/pages/verify_code_page.dart';
-import 'package:go_router/go_router.dart';
+import 'package:clean_stream_laundry_app/features/change_email_verification/change_email_verification.dart';
+import 'package:clean_stream_laundry_app/features/edit_profile/edit_profile.dart';
+import 'package:clean_stream_laundry_app/features/verify_code/verify_code.dart';
+import 'package:clean_stream_laundry_app/features/email_verification/email_verification.dart';
+import 'package:clean_stream_laundry_app/features/home/home.dart';
+import 'package:clean_stream_laundry_app/features/loading/loading.dart';
+import 'package:clean_stream_laundry_app/features/loyalty/loyalty.dart';
+import 'package:clean_stream_laundry_app/features/scanner/scanner.dart';
+import 'package:clean_stream_laundry_app/features/sign_up/sign_up.dart';
+import 'package:clean_stream_laundry_app/features/login/login.dart';
+import 'package:clean_stream_laundry_app/features/not_found/not_found.dart';
+import 'package:clean_stream_laundry_app/features/settings/settings.dart';
+import 'package:clean_stream_laundry_app/features/start_machine/start_machine.dart';
+import 'package:clean_stream_laundry_app/features/machine_payment/machine_payment.dart';
+import 'package:clean_stream_laundry_app/features/monthly_report/monthly_report.dart';
+import 'package:clean_stream_laundry_app/features/refund_request/refund_request.dart';
+import 'package:clean_stream_laundry_app/features/maintenance_request/maintenance_request.dart';
+import 'package:clean_stream_laundry_app/features/password_reset/password_reset.dart';
+import 'package:clean_stream_laundry_app/features/reset_protected/reset_protected.dart';
import 'package:clean_stream_laundry_app/logic/services/auth_service.dart';
-import 'package:clean_stream_laundry_app/pages/email_verification_page.dart';
-import 'package:clean_stream_laundry_app/pages/home_page.dart';
-import 'package:clean_stream_laundry_app/pages/loading_page.dart';
-import 'package:clean_stream_laundry_app/pages/loyalty_card_page.dart';
-import 'package:clean_stream_laundry_app/pages/scanner_widget.dart';
-import 'package:clean_stream_laundry_app/pages/sign_up_screen.dart';
-import 'package:clean_stream_laundry_app/pages/login_page.dart';
-import 'package:clean_stream_laundry_app/pages/not_found_page.dart';
-import 'package:clean_stream_laundry_app/pages/settings.dart';
-import 'package:clean_stream_laundry_app/pages/start_machine_page.dart';
-import 'package:clean_stream_laundry_app/pages/payment_page.dart';
-import 'package:clean_stream_laundry_app/pages/monthly_transaction_history.dart';
-import 'package:clean_stream_laundry_app/pages/refund_page.dart';
-import 'package:clean_stream_laundry_app/pages/password_reset.dart';
-import 'package:clean_stream_laundry_app/pages/reset_protected_page.dart';
+import 'package:go_router/go_router.dart';
class RouterService {
GoRouter createRouter(AuthService authenticator) => GoRouter(
@@ -28,7 +29,7 @@ class RouterService {
path: '/login',
pageBuilder: (context, state) => CustomTransitionPage(
key: state.pageKey,
- child: LoginScreen(appLinks: AppLinks()),
+ child: Login(appLinks: AppLinks()),
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
transitionsBuilder: (_, _, _, child) => child,
@@ -38,7 +39,7 @@ class RouterService {
path: '/signup',
pageBuilder: (context, state) => CustomTransitionPage(
key: state.pageKey,
- child: SignUpScreen(),
+ child: SignUpPage(),
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
transitionsBuilder: (_, _, _, child) => child,
@@ -48,7 +49,7 @@ class RouterService {
path: '/scanner',
pageBuilder: (context, state) => CustomTransitionPage(
key: state.pageKey,
- child: ScannerWidget(),
+ child: ScannerPage(),
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
transitionsBuilder: (_, _, _, child) => child,
@@ -81,7 +82,7 @@ class RouterService {
final machineId = state.uri.queryParameters['machineId'] ?? '';
return CustomTransitionPage(
key: state.pageKey,
- child: PaymentPage(machineId: machineId),
+ child: MachinePayment(machineId: machineId),
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
transitionsBuilder: (_, _, _, child) => child,
@@ -90,13 +91,16 @@ class RouterService {
),
GoRoute(
path: '/email-verification',
- pageBuilder: (context, state) => CustomTransitionPage(
- key: state.pageKey,
- child: EmailVerificationPage(appLinks: AppLinks()),
- transitionDuration: Duration.zero,
- reverseTransitionDuration: Duration.zero,
- transitionsBuilder: (_, _, _, child) => child,
- ),
+ pageBuilder: (context, state) {
+ final email = state.extra is String ? state.extra as String : null;
+ return CustomTransitionPage(
+ key: state.pageKey,
+ child: EmailVerificationPage(email: email),
+ transitionDuration: Duration.zero,
+ reverseTransitionDuration: Duration.zero,
+ transitionsBuilder: (_, _, _, child) => child,
+ );
+ },
),
GoRoute(
path: '/homePage',
@@ -134,7 +138,7 @@ class RouterService {
final transactions = state.extra as List