Files
musadaq-saas/musadaq-app/lib/features/auth/controllers/biometric_controller.dart
2026-05-06 04:02:34 +03:00

73 lines
2.5 KiB
Dart

import 'package:get/get.dart';
import 'package:local_auth/local_auth.dart';
import '../../../core/storage/secure_storage.dart';
import '../../../app/routes/app_pages.dart';
import '../../../core/utils/logger.dart';
import '../../../core/utils/app_snackbar.dart';
class BiometricController extends GetxController {
final LocalAuthentication auth = LocalAuthentication();
final SecureStorage _storage = SecureStorage();
var isBiometricAvailable = false.obs;
var isAuthenticating = false.obs;
@override
void onInit() {
super.onInit();
checkBiometrics();
}
Future<void> checkBiometrics() async {
try {
final canCheck = await auth.canCheckBiometrics;
final isSupported = await auth.isDeviceSupported();
isBiometricAvailable.value = canCheck || isSupported;
AppLogger.print('Biometrics available: ${isBiometricAvailable.value}');
} catch (e, stackTrace) {
isBiometricAvailable.value = false;
AppLogger.error('Failed to check biometrics support', e, stackTrace);
}
}
Future<void> authenticateAndGoToDashboard() async {
// Ensure we have checked biometric status first
await checkBiometrics();
if (!isBiometricAvailable.value) {
AppLogger.print('Biometrics not available, going directly to dashboard.');
Get.offAllNamed(AppRoutes.DASHBOARD);
return;
}
try {
isAuthenticating.value = true;
bool authenticated = await auth.authenticate(
localizedReason: 'الرجاء التحقق من هويتك للوصول إلى مُصادَق',
options: const AuthenticationOptions(
stickyAuth: true,
biometricOnly: false, // Allows PIN/Pattern fallback
),
);
if (authenticated) {
AppLogger.print('Biometric authentication successful!');
Get.offAllNamed(AppRoutes.DASHBOARD);
} else {
AppLogger.print('Biometric authentication cancelled or failed.');
AppSnackbar.showWarning('فشل التحقق', 'لم نتمكن من التحقق من هويتك أو قمت بإلغاء العملية');
}
} catch (e, stackTrace) {
AppLogger.error('Error during biometric auth', e, stackTrace);
AppSnackbar.showError('خطأ', 'حدث خطأ غير متوقع أثناء قراءة البصمة: $e');
} finally {
isAuthenticating.value = false;
}
}
void skipBiometricSetup() {
AppLogger.print('Skipped biometric setup.');
Get.offAllNamed(AppRoutes.DASHBOARD);
}
}