From 29f375b1229f4f92d8cb3bdb266db3f67f5be17d Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Wed, 5 Aug 2026 00:28:04 +0300 Subject: [PATCH] Update codebase --- apps/driver_new/ios/Podfile | 4 ++ apps/driver_new/lib/core/di.dart | 7 ++- .../lib/core/storage/token_store.dart | 18 +++++-- .../lib/features/auth/cubit/login_cubit.dart | 49 ++++++++++++++++--- apps/driver_new/pubspec.lock | 4 +- apps/driver_new/pubspec.yaml | 2 +- apps/rider_new/ios/Podfile | 4 ++ apps/rider_new/ios/Podfile.lock | 2 +- apps/rider_new/lib/core/di.dart | 7 ++- .../lib/core/storage/token_store.dart | 18 +++++-- .../lib/features/auth/cubit/login_cubit.dart | 49 ++++++++++++++++--- apps/rider_new/pubspec.lock | 4 +- apps/rider_new/pubspec.yaml | 2 +- 13 files changed, 133 insertions(+), 37 deletions(-) diff --git a/apps/driver_new/ios/Podfile b/apps/driver_new/ios/Podfile index 20f45c9..48fcb39 100755 --- a/apps/driver_new/ios/Podfile +++ b/apps/driver_new/ios/Podfile @@ -54,6 +54,10 @@ post_install do |installer| if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']) config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion end + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + 'PERMISSION_LOCATION=1', + ] end end end \ No newline at end of file diff --git a/apps/driver_new/lib/core/di.dart b/apps/driver_new/lib/core/di.dart index ec52c49..f39dd28 100644 --- a/apps/driver_new/lib/core/di.dart +++ b/apps/driver_new/lib/core/di.dart @@ -51,6 +51,7 @@ import 'notifications/push_service.dart'; import 'realtime/realtime_service.dart'; import 'session/session_cubit.dart'; +import 'session/session_source.dart'; import 'storage/token_store.dart'; @@ -84,10 +85,12 @@ Future setupInjector() async { ), ); - sl.registerSingleton(AuthRepository(sl(), sl())); + final authRepo = AuthRepository(sl(), sl()); + sl.registerSingleton(authRepo); + sl.registerSingleton(authRepo); sl.registerSingleton(ProfileRepository(sl())); sl.registerSingleton( - SessionCubit(sl(), onAuthenticated: () => sl().register()), + SessionCubit(authRepo, onAuthenticated: () => sl().register()), ); // تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية. diff --git a/apps/driver_new/lib/core/storage/token_store.dart b/apps/driver_new/lib/core/storage/token_store.dart index 9e37f68..481b770 100644 --- a/apps/driver_new/lib/core/storage/token_store.dart +++ b/apps/driver_new/lib/core/storage/token_store.dart @@ -34,10 +34,10 @@ class TokenStore { }) async { _access = accessToken; _refresh = refreshToken; - await _storage.write(key: _kAccess, value: accessToken); - await _storage.write(key: _kRefresh, value: refreshToken); + await _write(_kAccess, accessToken); + await _write(_kRefresh, refreshToken); if (signingKey != null) { - await _storage.write(key: _kSigning, value: signingKey); + await _write(_kSigning, signingKey); } } @@ -54,8 +54,16 @@ class TokenStore { Future signingKey() => _storage.read(key: _kSigning); Future deviceId() => _storage.read(key: _kDeviceId); - Future setDeviceId(String id) => - _storage.write(key: _kDeviceId, value: id); + Future setDeviceId(String id) => _write(_kDeviceId, id); + + Future _write(String key, String value) async { + try { + await _storage.write(key: key, value: value); + } catch (_) { + await _storage.delete(key: key); + await _storage.write(key: key, value: value); + } + } /// هل انتهت صلاحية التوكن (أو ستنتهي خلال [leeway])؟ /// diff --git a/apps/driver_new/lib/features/auth/cubit/login_cubit.dart b/apps/driver_new/lib/features/auth/cubit/login_cubit.dart index 90497ab..bc9fec6 100644 --- a/apps/driver_new/lib/features/auth/cubit/login_cubit.dart +++ b/apps/driver_new/lib/features/auth/cubit/login_cubit.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -63,24 +64,56 @@ class LoginCubit extends Cubit { /// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى /// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2). Future checkLocationPermission() async { - final status = await Permission.locationWhenInUse.status; - if (status.isGranted || status.isLimited) { - emit(state.copyWith(step: LoginStep.phone)); + final geoStatus = await Geolocator.checkPermission(); + if (geoStatus == LocationPermission.always || + geoStatus == LocationPermission.whileInUse) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); return; } + + final status = await Permission.locationWhenInUse.status; + if (status.isGranted || status.isLimited) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); + return; + } + emit(state.copyWith( - permissionPermanentlyDenied: status.isPermanentlyDenied, + permissionPermanentlyDenied: + geoStatus == LocationPermission.deniedForever || + status.isPermanentlyDenied, )); } Future requestLocationPermission() async { - final status = await Permission.locationWhenInUse.request(); - if (status.isGranted || status.isLimited) { - emit(state.copyWith(step: LoginStep.phone)); + final geoStatus = await Geolocator.requestPermission(); + if (geoStatus == LocationPermission.always || + geoStatus == LocationPermission.whileInUse) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); return; } + + final status = await Permission.locationWhenInUse.request(); + if (status.isGranted || status.isLimited) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); + return; + } + emit(state.copyWith( - permissionPermanentlyDenied: status.isPermanentlyDenied, + permissionPermanentlyDenied: + geoStatus == LocationPermission.deniedForever || + status.isPermanentlyDenied, )); } diff --git a/apps/driver_new/pubspec.lock b/apps/driver_new/pubspec.lock index d4e2a5f..3bd92d4 100644 --- a/apps/driver_new/pubspec.lock +++ b/apps/driver_new/pubspec.lock @@ -117,10 +117,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd + sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c" url: "https://pub.dev" source: hosted - version: "12.4.0" + version: "12.3.0" device_info_plus_platform_interface: dependency: transitive description: diff --git a/apps/driver_new/pubspec.yaml b/apps/driver_new/pubspec.yaml index 5d75541..d591cd3 100644 --- a/apps/driver_new/pubspec.yaml +++ b/apps/driver_new/pubspec.yaml @@ -45,7 +45,7 @@ dependencies: # م3: الأذونات وبصمة الجهاز permission_handler: ^12.0.1 - device_info_plus: ^12.3.0 + device_info_plus: 12.3.0 cupertino_icons: ^1.0.8 diff --git a/apps/rider_new/ios/Podfile b/apps/rider_new/ios/Podfile index e351348..99d9041 100644 --- a/apps/rider_new/ios/Podfile +++ b/apps/rider_new/ios/Podfile @@ -50,6 +50,10 @@ post_install do |installer| if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']) config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion end + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + 'PERMISSION_LOCATION=1', + ] end end end diff --git a/apps/rider_new/ios/Podfile.lock b/apps/rider_new/ios/Podfile.lock index 52814fa..2f5a854 100644 --- a/apps/rider_new/ios/Podfile.lock +++ b/apps/rider_new/ios/Podfile.lock @@ -154,6 +154,6 @@ SPEC CHECKSUMS: PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273 shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb -PODFILE CHECKSUM: cd8e27edd15d1a27818927147375b1d9d700364a +PODFILE CHECKSUM: 2fb3a1fbcfd139fd6c248e48cbde3560c22a448d COCOAPODS: 1.16.2 diff --git a/apps/rider_new/lib/core/di.dart b/apps/rider_new/lib/core/di.dart index 28ac171..1a753ba 100644 --- a/apps/rider_new/lib/core/di.dart +++ b/apps/rider_new/lib/core/di.dart @@ -48,6 +48,7 @@ import 'notifications/push_service.dart'; import 'realtime/realtime_service.dart'; import 'session/session_cubit.dart'; +import 'session/session_source.dart'; import 'storage/token_store.dart'; @@ -81,10 +82,12 @@ Future setupInjector() async { ), ); - sl.registerSingleton(AuthRepository(sl(), sl())); + final authRepo = AuthRepository(sl(), sl()); + sl.registerSingleton(authRepo); + sl.registerSingleton(authRepo); sl.registerSingleton(ProfileRepository(sl())); sl.registerSingleton( - SessionCubit(sl(), onAuthenticated: () => sl().register()), + SessionCubit(authRepo, onAuthenticated: () => sl().register()), ); // تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية. diff --git a/apps/rider_new/lib/core/storage/token_store.dart b/apps/rider_new/lib/core/storage/token_store.dart index 9e37f68..481b770 100644 --- a/apps/rider_new/lib/core/storage/token_store.dart +++ b/apps/rider_new/lib/core/storage/token_store.dart @@ -34,10 +34,10 @@ class TokenStore { }) async { _access = accessToken; _refresh = refreshToken; - await _storage.write(key: _kAccess, value: accessToken); - await _storage.write(key: _kRefresh, value: refreshToken); + await _write(_kAccess, accessToken); + await _write(_kRefresh, refreshToken); if (signingKey != null) { - await _storage.write(key: _kSigning, value: signingKey); + await _write(_kSigning, signingKey); } } @@ -54,8 +54,16 @@ class TokenStore { Future signingKey() => _storage.read(key: _kSigning); Future deviceId() => _storage.read(key: _kDeviceId); - Future setDeviceId(String id) => - _storage.write(key: _kDeviceId, value: id); + Future setDeviceId(String id) => _write(_kDeviceId, id); + + Future _write(String key, String value) async { + try { + await _storage.write(key: key, value: value); + } catch (_) { + await _storage.delete(key: key); + await _storage.write(key: key, value: value); + } + } /// هل انتهت صلاحية التوكن (أو ستنتهي خلال [leeway])؟ /// diff --git a/apps/rider_new/lib/features/auth/cubit/login_cubit.dart b/apps/rider_new/lib/features/auth/cubit/login_cubit.dart index 90497ab..bc9fec6 100644 --- a/apps/rider_new/lib/features/auth/cubit/login_cubit.dart +++ b/apps/rider_new/lib/features/auth/cubit/login_cubit.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -63,24 +64,56 @@ class LoginCubit extends Cubit { /// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى /// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2). Future checkLocationPermission() async { - final status = await Permission.locationWhenInUse.status; - if (status.isGranted || status.isLimited) { - emit(state.copyWith(step: LoginStep.phone)); + final geoStatus = await Geolocator.checkPermission(); + if (geoStatus == LocationPermission.always || + geoStatus == LocationPermission.whileInUse) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); return; } + + final status = await Permission.locationWhenInUse.status; + if (status.isGranted || status.isLimited) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); + return; + } + emit(state.copyWith( - permissionPermanentlyDenied: status.isPermanentlyDenied, + permissionPermanentlyDenied: + geoStatus == LocationPermission.deniedForever || + status.isPermanentlyDenied, )); } Future requestLocationPermission() async { - final status = await Permission.locationWhenInUse.request(); - if (status.isGranted || status.isLimited) { - emit(state.copyWith(step: LoginStep.phone)); + final geoStatus = await Geolocator.requestPermission(); + if (geoStatus == LocationPermission.always || + geoStatus == LocationPermission.whileInUse) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); return; } + + final status = await Permission.locationWhenInUse.request(); + if (status.isGranted || status.isLimited) { + emit(state.copyWith( + step: LoginStep.phone, + permissionPermanentlyDenied: false, + )); + return; + } + emit(state.copyWith( - permissionPermanentlyDenied: status.isPermanentlyDenied, + permissionPermanentlyDenied: + geoStatus == LocationPermission.deniedForever || + status.isPermanentlyDenied, )); } diff --git a/apps/rider_new/pubspec.lock b/apps/rider_new/pubspec.lock index 45028b2..6851c06 100644 --- a/apps/rider_new/pubspec.lock +++ b/apps/rider_new/pubspec.lock @@ -109,10 +109,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd + sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c" url: "https://pub.dev" source: hosted - version: "12.4.0" + version: "12.3.0" device_info_plus_platform_interface: dependency: transitive description: diff --git a/apps/rider_new/pubspec.yaml b/apps/rider_new/pubspec.yaml index 2ce373c..5c05c10 100644 --- a/apps/rider_new/pubspec.yaml +++ b/apps/rider_new/pubspec.yaml @@ -42,7 +42,7 @@ dependencies: # م3: الأذونات وبصمة الجهاز permission_handler: ^12.0.1 - device_info_plus: ^12.3.0 + device_info_plus: 12.3.0 cupertino_icons: ^1.0.8