Update codebase
This commit is contained in:
@@ -54,6 +54,10 @@ post_install do |installer|
|
|||||||
if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
|
if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
|
||||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
|
||||||
end
|
end
|
||||||
|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
|
||||||
|
'$(inherited)',
|
||||||
|
'PERMISSION_LOCATION=1',
|
||||||
|
]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -51,6 +51,7 @@ import 'notifications/push_service.dart';
|
|||||||
import 'realtime/realtime_service.dart';
|
import 'realtime/realtime_service.dart';
|
||||||
|
|
||||||
import 'session/session_cubit.dart';
|
import 'session/session_cubit.dart';
|
||||||
|
import 'session/session_source.dart';
|
||||||
|
|
||||||
import 'storage/token_store.dart';
|
import 'storage/token_store.dart';
|
||||||
|
|
||||||
@@ -84,10 +85,12 @@ Future<void> setupInjector() async {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
sl.registerSingleton<AuthRepository>(AuthRepository(sl(), sl()));
|
final authRepo = AuthRepository(sl(), sl());
|
||||||
|
sl.registerSingleton<AuthRepository>(authRepo);
|
||||||
|
sl.registerSingleton<SessionSource>(authRepo);
|
||||||
sl.registerSingleton<ProfileRepository>(ProfileRepository(sl()));
|
sl.registerSingleton<ProfileRepository>(ProfileRepository(sl()));
|
||||||
sl.registerSingleton<SessionCubit>(
|
sl.registerSingleton<SessionCubit>(
|
||||||
SessionCubit(sl(), onAuthenticated: () => sl<PushService>().register()),
|
SessionCubit(authRepo, onAuthenticated: () => sl<PushService>().register()),
|
||||||
);
|
);
|
||||||
|
|
||||||
// تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية.
|
// تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية.
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ class TokenStore {
|
|||||||
}) async {
|
}) async {
|
||||||
_access = accessToken;
|
_access = accessToken;
|
||||||
_refresh = refreshToken;
|
_refresh = refreshToken;
|
||||||
await _storage.write(key: _kAccess, value: accessToken);
|
await _write(_kAccess, accessToken);
|
||||||
await _storage.write(key: _kRefresh, value: refreshToken);
|
await _write(_kRefresh, refreshToken);
|
||||||
if (signingKey != null) {
|
if (signingKey != null) {
|
||||||
await _storage.write(key: _kSigning, value: signingKey);
|
await _write(_kSigning, signingKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,8 +54,16 @@ class TokenStore {
|
|||||||
Future<String?> signingKey() => _storage.read(key: _kSigning);
|
Future<String?> signingKey() => _storage.read(key: _kSigning);
|
||||||
|
|
||||||
Future<String?> deviceId() => _storage.read(key: _kDeviceId);
|
Future<String?> deviceId() => _storage.read(key: _kDeviceId);
|
||||||
Future<void> setDeviceId(String id) =>
|
Future<void> setDeviceId(String id) => _write(_kDeviceId, id);
|
||||||
_storage.write(key: _kDeviceId, value: id);
|
|
||||||
|
Future<void> _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])؟
|
/// هل انتهت صلاحية التوكن (أو ستنتهي خلال [leeway])؟
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
|
import 'package:geolocator/geolocator.dart';
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
@@ -63,24 +64,56 @@ class LoginCubit extends Cubit<LoginState> {
|
|||||||
/// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى
|
/// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى
|
||||||
/// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2).
|
/// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2).
|
||||||
Future<void> checkLocationPermission() async {
|
Future<void> checkLocationPermission() async {
|
||||||
final status = await Permission.locationWhenInUse.status;
|
final geoStatus = await Geolocator.checkPermission();
|
||||||
if (status.isGranted || status.isLimited) {
|
if (geoStatus == LocationPermission.always ||
|
||||||
emit(state.copyWith(step: LoginStep.phone));
|
geoStatus == LocationPermission.whileInUse) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final status = await Permission.locationWhenInUse.status;
|
||||||
|
if (status.isGranted || status.isLimited) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
emit(state.copyWith(
|
emit(state.copyWith(
|
||||||
permissionPermanentlyDenied: status.isPermanentlyDenied,
|
permissionPermanentlyDenied:
|
||||||
|
geoStatus == LocationPermission.deniedForever ||
|
||||||
|
status.isPermanentlyDenied,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> requestLocationPermission() async {
|
Future<void> requestLocationPermission() async {
|
||||||
final status = await Permission.locationWhenInUse.request();
|
final geoStatus = await Geolocator.requestPermission();
|
||||||
if (status.isGranted || status.isLimited) {
|
if (geoStatus == LocationPermission.always ||
|
||||||
emit(state.copyWith(step: LoginStep.phone));
|
geoStatus == LocationPermission.whileInUse) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final status = await Permission.locationWhenInUse.request();
|
||||||
|
if (status.isGranted || status.isLimited) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
emit(state.copyWith(
|
emit(state.copyWith(
|
||||||
permissionPermanentlyDenied: status.isPermanentlyDenied,
|
permissionPermanentlyDenied:
|
||||||
|
geoStatus == LocationPermission.deniedForever ||
|
||||||
|
status.isPermanentlyDenied,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -117,10 +117,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: device_info_plus
|
name: device_info_plus
|
||||||
sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd
|
sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.4.0"
|
version: "12.3.0"
|
||||||
device_info_plus_platform_interface:
|
device_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ dependencies:
|
|||||||
|
|
||||||
# م3: الأذونات وبصمة الجهاز
|
# م3: الأذونات وبصمة الجهاز
|
||||||
permission_handler: ^12.0.1
|
permission_handler: ^12.0.1
|
||||||
device_info_plus: ^12.3.0
|
device_info_plus: 12.3.0
|
||||||
|
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,10 @@ post_install do |installer|
|
|||||||
if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
|
if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
|
||||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
|
||||||
end
|
end
|
||||||
|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
|
||||||
|
'$(inherited)',
|
||||||
|
'PERMISSION_LOCATION=1',
|
||||||
|
]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -154,6 +154,6 @@ SPEC CHECKSUMS:
|
|||||||
PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273
|
PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273
|
||||||
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
||||||
|
|
||||||
PODFILE CHECKSUM: cd8e27edd15d1a27818927147375b1d9d700364a
|
PODFILE CHECKSUM: 2fb3a1fbcfd139fd6c248e48cbde3560c22a448d
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import 'notifications/push_service.dart';
|
|||||||
import 'realtime/realtime_service.dart';
|
import 'realtime/realtime_service.dart';
|
||||||
|
|
||||||
import 'session/session_cubit.dart';
|
import 'session/session_cubit.dart';
|
||||||
|
import 'session/session_source.dart';
|
||||||
|
|
||||||
import 'storage/token_store.dart';
|
import 'storage/token_store.dart';
|
||||||
|
|
||||||
@@ -81,10 +82,12 @@ Future<void> setupInjector() async {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
sl.registerSingleton<AuthRepository>(AuthRepository(sl(), sl()));
|
final authRepo = AuthRepository(sl(), sl());
|
||||||
|
sl.registerSingleton<AuthRepository>(authRepo);
|
||||||
|
sl.registerSingleton<SessionSource>(authRepo);
|
||||||
sl.registerSingleton<ProfileRepository>(ProfileRepository(sl()));
|
sl.registerSingleton<ProfileRepository>(ProfileRepository(sl()));
|
||||||
sl.registerSingleton<SessionCubit>(
|
sl.registerSingleton<SessionCubit>(
|
||||||
SessionCubit(sl(), onAuthenticated: () => sl<PushService>().register()),
|
SessionCubit(authRepo, onAuthenticated: () => sl<PushService>().register()),
|
||||||
);
|
);
|
||||||
|
|
||||||
// تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية.
|
// تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية.
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ class TokenStore {
|
|||||||
}) async {
|
}) async {
|
||||||
_access = accessToken;
|
_access = accessToken;
|
||||||
_refresh = refreshToken;
|
_refresh = refreshToken;
|
||||||
await _storage.write(key: _kAccess, value: accessToken);
|
await _write(_kAccess, accessToken);
|
||||||
await _storage.write(key: _kRefresh, value: refreshToken);
|
await _write(_kRefresh, refreshToken);
|
||||||
if (signingKey != null) {
|
if (signingKey != null) {
|
||||||
await _storage.write(key: _kSigning, value: signingKey);
|
await _write(_kSigning, signingKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,8 +54,16 @@ class TokenStore {
|
|||||||
Future<String?> signingKey() => _storage.read(key: _kSigning);
|
Future<String?> signingKey() => _storage.read(key: _kSigning);
|
||||||
|
|
||||||
Future<String?> deviceId() => _storage.read(key: _kDeviceId);
|
Future<String?> deviceId() => _storage.read(key: _kDeviceId);
|
||||||
Future<void> setDeviceId(String id) =>
|
Future<void> setDeviceId(String id) => _write(_kDeviceId, id);
|
||||||
_storage.write(key: _kDeviceId, value: id);
|
|
||||||
|
Future<void> _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])؟
|
/// هل انتهت صلاحية التوكن (أو ستنتهي خلال [leeway])؟
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
|
import 'package:geolocator/geolocator.dart';
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
@@ -63,24 +64,56 @@ class LoginCubit extends Cubit<LoginState> {
|
|||||||
/// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى
|
/// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى
|
||||||
/// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2).
|
/// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2).
|
||||||
Future<void> checkLocationPermission() async {
|
Future<void> checkLocationPermission() async {
|
||||||
final status = await Permission.locationWhenInUse.status;
|
final geoStatus = await Geolocator.checkPermission();
|
||||||
if (status.isGranted || status.isLimited) {
|
if (geoStatus == LocationPermission.always ||
|
||||||
emit(state.copyWith(step: LoginStep.phone));
|
geoStatus == LocationPermission.whileInUse) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final status = await Permission.locationWhenInUse.status;
|
||||||
|
if (status.isGranted || status.isLimited) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
emit(state.copyWith(
|
emit(state.copyWith(
|
||||||
permissionPermanentlyDenied: status.isPermanentlyDenied,
|
permissionPermanentlyDenied:
|
||||||
|
geoStatus == LocationPermission.deniedForever ||
|
||||||
|
status.isPermanentlyDenied,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> requestLocationPermission() async {
|
Future<void> requestLocationPermission() async {
|
||||||
final status = await Permission.locationWhenInUse.request();
|
final geoStatus = await Geolocator.requestPermission();
|
||||||
if (status.isGranted || status.isLimited) {
|
if (geoStatus == LocationPermission.always ||
|
||||||
emit(state.copyWith(step: LoginStep.phone));
|
geoStatus == LocationPermission.whileInUse) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final status = await Permission.locationWhenInUse.request();
|
||||||
|
if (status.isGranted || status.isLimited) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
step: LoginStep.phone,
|
||||||
|
permissionPermanentlyDenied: false,
|
||||||
|
));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
emit(state.copyWith(
|
emit(state.copyWith(
|
||||||
permissionPermanentlyDenied: status.isPermanentlyDenied,
|
permissionPermanentlyDenied:
|
||||||
|
geoStatus == LocationPermission.deniedForever ||
|
||||||
|
status.isPermanentlyDenied,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -109,10 +109,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: device_info_plus
|
name: device_info_plus
|
||||||
sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd
|
sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.4.0"
|
version: "12.3.0"
|
||||||
device_info_plus_platform_interface:
|
device_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ dependencies:
|
|||||||
|
|
||||||
# م3: الأذونات وبصمة الجهاز
|
# م3: الأذونات وبصمة الجهاز
|
||||||
permission_handler: ^12.0.1
|
permission_handler: ^12.0.1
|
||||||
device_info_plus: ^12.3.0
|
device_info_plus: 12.3.0
|
||||||
|
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user