From 4e17ff9c82bdae62396c12897b0e686c32d452a5 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Tue, 16 Sep 2025 16:19:30 +0300 Subject: [PATCH] otp screen & register Uae & resend Activation Code. --- assets/langs/ar-SA.json | 4 +- assets/langs/en-US.json | 4 +- lib/core/api/api_client.dart | 7 +- lib/core/api_consts.dart | 2 +- lib/core/enums.dart | 14 +-- lib/core/utils/validation_utils.dart | 7 +- .../authentication/authentication_repo.dart | 4 +- .../authentication_view_model.dart | 59 ++++++++---- .../widgets/otp_verification_screen.dart | 90 ++++++++++++++----- lib/generated/locale_keys.g.dart | 2 + lib/main.dart | 1 + .../authentication/register_step2.dart | 20 +---- .../authentication/saved_login_screen.dart | 10 +-- lib/services/error_handler_service.dart | 10 ++- 14 files changed, 156 insertions(+), 78 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index bbfa68c..a822898 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -814,5 +814,7 @@ "notNow": "ليس الآن", "pendingActivation": "في انتظار التنشيط", "awaitingApproval": "انتظر القبول", - "ready": "جاهز" + "ready": "جاهز", + "enterValidNationalId": "الرجاء إدخال رقم الهوية الوطنية أو رقم الملف الصحيح", + "enterValidPhoneNumber": "الرجاء إدخال رقم هاتف صالح" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index e054238..411aa37 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -810,5 +810,7 @@ "notNow": "Not Now", "pendingActivation": "Pending Activation", "awaitingApproval": "Awaiting Approval", - "ready": "Ready" + "ready": "Ready", + "enterValidNationalId": "Please enter a valid national ID or file number", + "enterValidPhoneNumber": "Please enter a valid phone number" } \ No newline at end of file diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 5e9dbb7..b0a5c78 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -222,7 +222,12 @@ class ApiClientImp implements ApiClient { } if (parsed['ErrorType'] == 2) { // todo: handle Logout - logApiEndpointError(endPoint, "session logged out", statusCode); + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode, + failureType: MessageStatusFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']), + ); + // logApiEndpointError(endPoint, "session logged out", statusCode); } if (isAllowAny) { onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 42f10f4..bad2e4c 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -726,7 +726,7 @@ const DEACTIVATE_ACCOUNT = 'Services/Patients.svc/REST/PatientAppleActivation_In class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/core/enums.dart b/lib/core/enums.dart index 7ed275a..2f0b078 100644 --- a/lib/core/enums.dart +++ b/lib/core/enums.dart @@ -5,6 +5,9 @@ // unverified, // } +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; + enum AuthMethodTypesEnum { sms, whatsApp, @@ -90,15 +93,17 @@ extension LoginTypeExtension on LoginTypeEnum { } String get displayName { + AppState appState = getIt.get(); + bool isArabic = appState.getLanguageID() == "ar"; switch (this) { case LoginTypeEnum.sms: - return 'SMS'; + return isArabic ? 'رسالة نصية' : 'SMS'; case LoginTypeEnum.whatsapp: - return 'WhatsApp'; + return isArabic ? 'واتساب' : 'WhatsApp'; case LoginTypeEnum.face: - return 'Face Recognition'; + return isArabic ? 'القياسات الحيوية' : 'Biometric'; // Or 'بصمة الوجه' case LoginTypeEnum.fingerprint: - return 'Fingerprint'; + return isArabic ? 'بصمة الإصبع' : 'Fingerprint'; } } @@ -190,4 +195,3 @@ extension ServiceTypeEnumExt on ServiceTypeEnum { } } } - diff --git a/lib/core/utils/validation_utils.dart b/lib/core/utils/validation_utils.dart index 89a8e42..e180eaa 100644 --- a/lib/core/utils/validation_utils.dart +++ b/lib/core/utils/validation_utils.dart @@ -1,9 +1,11 @@ import 'dart:developer'; +import 'package:easy_localization/easy_localization.dart'; import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; class ValidationUtils { @@ -13,12 +15,12 @@ class ValidationUtils { log("phoneNumber: $phoneNumber"); log("nationalId: $nationalId"); if (nationalId == null || nationalId.isEmpty) { - _dialogService.showErrorBottomSheet(message: "Please enter a valid national ID or file number", onOkPressed: () {}); + _dialogService.showErrorBottomSheet(message: LocaleKeys.enterValidNationalId.tr(), onOkPressed: () {}); return false; } if (phoneNumber == null || phoneNumber.isEmpty) { - _dialogService.showErrorBottomSheet(message: "Please enter a valid phone number", onOkPressed: () {}); + _dialogService.showErrorBottomSheet(message: LocaleKeys.enterValidPhoneNumber.tr(), onOkPressed: () {}); return false; } return true; @@ -111,7 +113,6 @@ class ValidationUtils { return false; } - if (maritalStatus == null) { _dialogService.showExceptionBottomSheet(message: "Please select a marital status", onOkPressed: onOkPress); return false; diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart index f3f4119..2eaeb80 100644 --- a/lib/features/authentication/authentication_repo.dart +++ b/lib/features/authentication/authentication_repo.dart @@ -516,7 +516,7 @@ class AuthenticationRepoImp implements AuthenticationRepo { failure = DataParsingFailure(e.toString()); } }, - ).then( (_) { + ).then((_) { if (failure != null) return Left(failure!); if (apiResponse == null) return Left(ServerFailure("Unknown error")); return Right(apiResponse!); @@ -524,7 +524,5 @@ class AuthenticationRepoImp implements AuthenticationRepo { } catch (e) { return Future.value(Left(UnknownFailure(e.toString()))); } - - } } diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index f37dfc6..8694884 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -283,7 +283,9 @@ class AuthenticationViewModel extends ChangeNotifier { patientOutSA: false, otpTypeEnum: otpTypeEnum, patientId: 0, - zipCode: selectedCountrySignup.countryCode, + zipCode: _appState.getSelectDeviceByImeiRespModelElement != null && _appState.getSelectDeviceByImeiRespModelElement!.outSa == true + ? CountryEnum.unitedArabEmirates.countryCode + : selectedCountrySignup.countryCode, calenderType: calenderType); final result = await _authenticationRepo.checkPatientAuthentication(checkPatientAuthenticationReq: checkPatientAuthenticationReq); @@ -315,7 +317,14 @@ class AuthenticationViewModel extends ChangeNotifier { if (apiResponse.data['IsAuthenticated']) { await checkActivationCode( otpTypeEnum: otpTypeEnum, - onWrongActivationCode: (String? message) {}, + onWrongActivationCode: (String? message) async { + await _dialogService.showCommonBottomSheetWithoutH( + message: message ?? "", + label: LocaleKeys.notice.tr(), + onOkPressed: () { + _navigationService.pop(); + }); + }, activationCode: null, //todo silent login case halded on the repo itself.. ); } @@ -398,7 +407,7 @@ class AuthenticationViewModel extends ChangeNotifier { deviceToken: _appState.deviceToken, // patientOutSA: _appState.getUserRegistrationPayload.projectOutSa == 1 ? true : false, patientOutSA: isForRegister - ? _appState.getUserRegistrationPayload.projectOutSa == 1 + ? _appState.getUserRegistrationPayload.projectOutSa == true ? true : false : _appState.getSelectDeviceByImeiRespModelElement != null @@ -409,7 +418,9 @@ class AuthenticationViewModel extends ChangeNotifier { loginTokenID: _appState.appAuthToken, registeredData: isForRegister ? _appState.getUserRegistrationPayload : null, nationIdText: nationalIdController.text, - countryCode: selectedCountrySignup.countryCode, + countryCode: _appState.getSelectDeviceByImeiRespModelElement != null && _appState.getSelectDeviceByImeiRespModelElement!.outSa == true + ? CountryEnum.unitedArabEmirates.countryCode + : selectedCountrySignup.countryCode, loginType: loginTypeEnum.toInt) .toJson(); LoaderBottomSheet.showLoader(); @@ -454,19 +465,21 @@ class AuthenticationViewModel extends ChangeNotifier { resultEither.fold( (failure) async => await _errorHandlerService.handleError( - failure: failure, - onUnHandledFailure: (failure) async { - LoaderBottomSheet.hideLoader(); - await _dialogService.showCommonBottomSheetWithoutH(message: failure.message, label: LocaleKeys.notice.tr(), onOkPressed: () {}); - }, - ), (apiResponse) async { + failure: failure, + onUnHandledFailure: (failure) async { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH(message: failure.message, label: LocaleKeys.notice.tr(), onOkPressed: () {}); + }, + onMessageStatusFailure: (failure) async { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH(message: failure.message, label: LocaleKeys.notice.tr(), onOkPressed: () {}); + }), (apiResponse) async { final activation = CheckActivationCode.fromJson(apiResponse.data as Map); if (activation.errorCode == '699') { // Todo: Hide Loader LoaderBottomSheet.hideLoader(); onWrongActivationCode(activation.errorEndUserMessage); - return; } else if (activation.messageStatus == 2) { LoaderBottomSheet.hideLoader(); @@ -592,9 +605,7 @@ class AuthenticationViewModel extends ChangeNotifier { loginTypeEnum = (_appState.deviceTypeID == 1 ? LoginTypeEnum.face : LoginTypeEnum.fingerprint); if (!_appState.isAuthenticated) { //commenting this api to check either the same flow working or not because this api does not needed further if work fine we will remove this - // await getPatientDeviceData(loginTypeEnum.toInt); - await checkActivationCode(otpTypeEnum: OTPTypeEnum.faceIDFingerprint, activationCode: null, onWrongActivationCode: (String? message) {}); - await insertPatientIMEIData(loginTypeEnum.toInt); + await getPatientDeviceData(loginTypeEnum.toInt); } else { // authenticated = true; await insertPatientIMEIData(loginTypeEnum.toInt); @@ -839,7 +850,25 @@ class AuthenticationViewModel extends ChangeNotifier { resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { if (apiResponse.messageStatus == 1) { dynamic deviceInfo = apiResponse.data['List_MobileLoginInfo']; - getDeviceLastLogin = deviceInfo['LoginType']; + getDeviceLastLogin = deviceInfo.first['LoginType']; + await checkActivationCode(otpTypeEnum: OTPTypeEnum.faceIDFingerprint, activationCode: null, onWrongActivationCode: (String? message) {}); + await insertPatientIMEIData(loginTypeEnum.toInt); + } + if (apiResponse.messageStatus == 2) { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH( + message: apiResponse.errorMessage ?? "", + label: LocaleKeys.notice.tr(), + onOkPressed: () { + _dialogService.showPhoneNumberPickerSheet(onSMSPress: () { + checkUserAuthentication(otpTypeEnum: OTPTypeEnum.sms); + }, onWhatsappPress: () { + checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); + }); + }, + onCancelPressed: () { + _navigationService.pop(); + }); } }); } diff --git a/lib/features/authentication/widgets/otp_verification_screen.dart b/lib/features/authentication/widgets/otp_verification_screen.dart index 372598b..e54b08b 100644 --- a/lib/features/authentication/widgets/otp_verification_screen.dart +++ b/lib/features/authentication/widgets/otp_verification_screen.dart @@ -56,7 +56,7 @@ class OTPWidget extends StatefulWidget { this.maxLength = 4, this.controller, this.pinBoxWidth = 70.0, - this.pinBoxHeight = 70.0, + this.pinBoxHeight = 100.0, this.pinTextStyle, this.onDone, this.defaultBorderColor = Colors.black, @@ -102,7 +102,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi }); widget.controller?.text = text; widget.controller?.selection = TextSelection.collapsed(offset: text.length); - } else if (oldWidget.maxLength > widget.maxLength && widget.maxLength > 0 && text.length > 0 && text.length > widget.maxLength) { + } else if (oldWidget.maxLength > widget.maxLength && widget.maxLength > 0 && text.isNotEmpty && text.length > widget.maxLength) { setState(() { text = text.substring(0, widget.maxLength); currentIndex = text.length; @@ -236,7 +236,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi width: 0.0, ), ); - return Container( + return SizedBox( width: _width, height: widget.pinBoxHeight, child: TextField( @@ -246,10 +246,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi controller: widget.controller, keyboardType: widget.keyboardType, inputFormatters: widget.keyboardType == TextInputType.number ? [FilteringTextInputFormatter.digitsOnly] : null, - style: TextStyle( - height: 0.1, - color: Colors.transparent, - ), + style: TextStyle(height: 0.1, color: Colors.transparent), decoration: InputDecoration( contentPadding: EdgeInsets.all(0), focusedErrorBorder: transparentBorder, @@ -259,10 +256,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi focusedBorder: transparentBorder, counterText: null, counterStyle: null, - helperStyle: TextStyle( - height: 0.0, - color: Colors.transparent, - ), + helperStyle: TextStyle(height: 0.0, color: Colors.transparent), labelStyle: TextStyle(height: 0.1), fillColor: Colors.transparent, border: InputBorder.none, @@ -304,26 +298,25 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi return _buildPinCode(i, context); }); return Row( - children: pinCodes, mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: pinCodes, ); } + Widget _buildPinCode(int i, BuildContext context) { - Color pinBoxColor = widget.pinBoxColor; + Color pinBoxColor; if (widget.hasError) { pinBoxColor = widget.errorBorderColor; + } else if (text.length == widget.maxLength) { + // Check for completion first, before individual box logic + pinBoxColor = AppColors.successColor; } else if (i < text.length) { pinBoxColor = AppColors.blackBgColor; // Custom color for filled boxes } else { - pinBoxColor = widget.pinBoxColor; - } - - // Change color to success when all fields are complete - if (text.length == widget.maxLength) { - pinBoxColor = AppColors.successColor; + pinBoxColor = widget.pinBoxColor; // Default white color } EdgeInsets insets; @@ -352,16 +345,69 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi alignment: Alignment.center, padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 1.0), margin: insets, - child: _animatedTextBox(strList[i], i), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: pinBoxColor, borderRadius: widget.pinBoxRadius, ), width: widget.pinBoxWidth, height: widget.pinBoxHeight, + child: _animatedTextBox(strList[i], i), ); } + + // Widget _buildPinCode(int i, BuildContext context) { + // Color pinBoxColor = widget.pinBoxColor; + // + // if (widget.hasError) { + // pinBoxColor = widget.errorBorderColor; + // } else if (i < text.length) { + // pinBoxColor = AppColors.blackBgColor; // Custom color for filled boxes + // } else { + // pinBoxColor = widget.pinBoxColor; + // } + // + // // Change color to success when all fields are complete + // if (text.length == widget.maxLength) { + // pinBoxColor = AppColors.successColor; + // } + // + // EdgeInsets insets; + // if (i == 0) { + // insets = EdgeInsets.only( + // left: 0, + // top: widget.pinBoxOuterPadding.top, + // right: widget.pinBoxOuterPadding.right, + // bottom: widget.pinBoxOuterPadding.bottom, + // ); + // } else if (i == strList.length - 1) { + // insets = EdgeInsets.only( + // left: widget.pinBoxOuterPadding.left, + // top: widget.pinBoxOuterPadding.top, + // right: 0, + // bottom: widget.pinBoxOuterPadding.bottom, + // ); + // } else { + // insets = widget.pinBoxOuterPadding; + // } + // + // return AnimatedContainer( + // duration: const Duration(milliseconds: 200), + // curve: Curves.easeInOut, + // key: ValueKey("container$i"), + // alignment: Alignment.center, + // padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 1.0), + // margin: insets, + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + // color: pinBoxColor, + // borderRadius: widget.pinBoxRadius, + // ), + // width: widget.pinBoxWidth, + // height: widget.pinBoxHeight, + // child: _animatedTextBox(strList[i], i), + // ); + // } + Widget _animatedTextBox(String text, int i) { if (widget.pinTextAnimatedSwitcherTransition != null) { return AnimatedSwitcher( @@ -453,8 +499,10 @@ class _OTPVerificationScreenState extends State { if (_resendTime == 0) { setState(() { _resendTime = 120; - _isVerifying = false; // Reset verification flag + _isVerifying = false; + _isOtpComplete = false; }); + _otpController.clear(); _startResendTimer(); // autoFillOtp("1234"); widget.onResendOTPPressed(widget.phoneNumber); diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 8b7f021..a91447a 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -813,5 +813,7 @@ abstract class LocaleKeys { static const pendingActivation = 'pendingActivation'; static const awaitingApproval = 'awaitingApproval'; static const ready = 'ready'; + static const enterValidNationalId = 'enterValidNationalId'; + static const enterValidPhoneNumber = 'enterValidPhoneNumber'; } diff --git a/lib/main.dart b/lib/main.dart index 24f5c36..f791679 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -185,3 +185,4 @@ class MyApp extends StatelessWidget { ); } } +// flutter pub run easy_localization:generate -S assets/langs -f keys -o locale_keys.g.dart \ No newline at end of file diff --git a/lib/presentation/authentication/register_step2.dart b/lib/presentation/authentication/register_step2.dart index de61552..f31909f 100644 --- a/lib/presentation/authentication/register_step2.dart +++ b/lib/presentation/authentication/register_step2.dart @@ -67,7 +67,7 @@ class _RegisterNew extends State { children: [ TextInputWidget( labelText: authVM!.isUserFromUAE() ? LocaleKeys.fullName.tr() : LocaleKeys.name.tr(), - hintText: authVM!.isUserFromUAE() ? "Enter your full name" : ("${appState.getNHICUserData.firstNameEn!.toUpperCase()} ${appState.getNHICUserData.lastNameEn!.toUpperCase()}"), + hintText: authVM!.isUserFromUAE() ? LocaleKeys.enterNameHere.tr() : ("${appState.getNHICUserData.firstNameEn!.toUpperCase()} ${appState.getNHICUserData.lastNameEn!.toUpperCase()}"), controller: authVM!.isUserFromUAE() ? authVM!.nameController : null, isEnable: true, prefix: null, @@ -290,24 +290,6 @@ class _RegisterNew extends State { } else { showModel(context: context); } - // if (isFromDubai) { - // if (name == null) { - // AppToast.showErrorToast(message: LocaleKeys.enterFullName); - // return; - // } - // if (!name!.contains(" ")) if (selectedGenderType == null) { - // AppToast.showErrorToast(message: TranslationBase.of(context).enterFullName); - // return; - // } - // if (selectedMaritalStatusType == null) { - // AppToast.showErrorToast(message: TranslationBase.of(context).chooseMaritalStatus); - // return; - // } - // if (selectedCountry == null) { - // AppToast.showErrorToast(message: TranslationBase.of(context).chooseCountry); - // return; - // } - // } }, ), ) diff --git a/lib/presentation/authentication/saved_login_screen.dart b/lib/presentation/authentication/saved_login_screen.dart index 9f55c85..e0a8885 100644 --- a/lib/presentation/authentication/saved_login_screen.dart +++ b/lib/presentation/authentication/saved_login_screen.dart @@ -56,7 +56,9 @@ class _SavedLogin extends State { onBackPressed: () { Navigator.of(context).pop(); }, - onLanguageChanged: (lang) {}, + onLanguageChanged: (value) { + context.setLocale(value == 'en' ? Locale('en', 'US') : Locale('ar', 'SA')); + }, ), body: SafeArea( child: Padding( @@ -84,7 +86,7 @@ class _SavedLogin extends State { children: [ // Last login info - ("${LocaleKeys.lastLoginBy.tr()} ${loginType.displayName}").toText14(isBold: true, color: AppColors.greyTextColor), + ("${LocaleKeys.lastLoginBy.tr()} ${loginType.displayName}").toText14(isBold: true, color: AppColors.greyTextColor, letterSpacing: -1), (appState.getSelectDeviceByImeiRespModelElement!.createdOn != null ? DateUtil.getFormattedDate(DateUtil.convertStringToDate(appState.getSelectDeviceByImeiRespModelElement!.createdOn!), "d MMMM, y 'at' HH:mm") : '--') @@ -103,7 +105,6 @@ class _SavedLogin extends State { if (loginType == LoginTypeEnum.fingerprint || loginType == LoginTypeEnum.face) { authVm.loginWithFingerPrintFace(() {}); } else { - // int? val = loginType.toInt; authVm.checkUserAuthentication(otpTypeEnum: loginType == LoginTypeEnum.sms ? OTPTypeEnum.sms : OTPTypeEnum.whatsapp); } }, @@ -167,7 +168,6 @@ class _SavedLogin extends State { onPressed: () { Navigator.of(context).pop(); loginType = LoginTypeEnum.sms; - int? val = loginType.toInt; authVm.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.sms); }, backgroundColor: AppColors.primaryRedColor, @@ -190,7 +190,6 @@ class _SavedLogin extends State { onPressed: () { Navigator.of(context).pop(); loginType = LoginTypeEnum.whatsapp; - int? val = loginType.toInt; authVm.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); }, backgroundColor: AppColors.transparent, @@ -230,7 +229,6 @@ class _SavedLogin extends State { authVm.loginWithFingerPrintFace(() {}); } else { loginType = LoginTypeEnum.whatsapp; - int? val = loginType.toInt; authVm.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); } }, diff --git a/lib/services/error_handler_service.dart b/lib/services/error_handler_service.dart index d4c15f2..c29dc17 100644 --- a/lib/services/error_handler_service.dart +++ b/lib/services/error_handler_service.dart @@ -9,7 +9,7 @@ import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; abstract class ErrorHandlerService { - Future handleError({required Failure failure, Function() onOkPressed, Function(Failure)? onUnHandledFailure}); + Future handleError({required Failure failure, Function() onOkPressed, Function(Failure)? onUnHandledFailure, Function(Failure)? onMessageStatusFailure}); } class ErrorHandlerServiceImp implements ErrorHandlerService { @@ -24,7 +24,7 @@ class ErrorHandlerServiceImp implements ErrorHandlerService { }); @override - Future handleError({required Failure failure, Function()? onOkPressed, Function(Failure)? onUnHandledFailure}) async { + Future handleError({required Failure failure, Function()? onOkPressed, Function(Failure)? onUnHandledFailure, Function(Failure)? onMessageStatusFailure}) async { if (failure is APIException) { loggerService.errorLogs("API Exception: ${failure.message}"); } else if (failure is ServerFailure) { @@ -51,6 +51,12 @@ class ErrorHandlerServiceImp implements ErrorHandlerService { } else { await _showDialog(failure, title: "Error", onOkPressed: onOkPressed); } + } else if (failure is MessageStatusFailure) { + if (onMessageStatusFailure != null) { + onMessageStatusFailure(failure); + } else { + await _showDialog(failure, title: "Error", onOkPressed: onOkPressed); + } } else { loggerService.errorLogs("Unhandled failure type: $failure"); await _showDialog(failure, title: "Error", onOkPressed: onOkPressed);