From 4b5a3af4cd487bda341b57149db604cf18075f89 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 10 Aug 2025 17:15:02 +0300 Subject: [PATCH] updates & fixes --- lib/config/shared_pref_kay.dart | 1 + lib/pages/landing/landing_page.dart | 168 +++++++++++++------------ lib/pages/login/register_new.dart | 1 + lib/pages/login/saved_login.dart | 9 +- lib/widgets/quick_login.dart | 188 ++++++++++++++-------------- 5 files changed, 189 insertions(+), 178 deletions(-) diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index 07295d75..446c3013 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -45,3 +45,4 @@ const IS_COVID_CONSENT_SHOWN = 'IS_COVID_CONSENT_SHOWN'; const REGISTER_INFO_DUBAI ='register-info-dubai'; const IS_LAST_APPOINTMENT_RATE_SHOWN ='is-last-appointment-rate-shown'; const PATIENT_OCCUPATION_LIST ='patient-occupation-list'; +const HAS_ENABLED_QUICK_LOGIN ='has-enabled-quick-login'; diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 4178805a..33bfad18 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -23,8 +23,7 @@ import 'package:hmg_patient_app/pages/login/welcome.dart'; import 'package:hmg_patient_app/pages/medical/medical_profile_page_new.dart'; import 'package:hmg_patient_app/services/authentication/auth_provider.dart'; import 'package:hmg_patient_app/services/clinic_services/get_clinic_service.dart'; -import 'package:hmg_patient_app/services/family_files/family_files_provider.dart' - as family; +import 'package:hmg_patient_app/services/family_files/family_files_provider.dart' as family; import 'package:hmg_patient_app/services/livecare_services/livecare_provider.dart'; import 'package:hmg_patient_app/services/payfort_services/payfort_view_model.dart'; import 'package:hmg_patient_app/services/robo_search/event_provider.dart'; @@ -43,6 +42,7 @@ import 'package:hmg_patient_app/widgets/others/app_scaffold_widget.dart'; import 'package:hmg_patient_app/widgets/others/not_auh_page.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; + // import 'package:flutter_app_icon_badge/flutter_app_icon_badge.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -87,6 +87,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { var themeNotifier; DateTime? currentBackPressTime; bool authenticated = false; + // SignalRUtil signalRUtil; // bool isDoneQuickLogin =false; late ToDoCountProviderModel toDoProvider; @@ -109,6 +110,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { bool isTalking = false; var sharedPref = new AppSharedPreferences(); + // // var data = { // "AppointmentNo": "2016059247", @@ -209,29 +211,29 @@ class _LandingPageState extends State with WidgetsBindingObserver { // Future.delayed(Duration(seconds: 0), () { // setState(() { if (tab == 5) { - IS_VOICE_COMMAND_CLOSED = false; - triggerRobot(); + IS_VOICE_COMMAND_CLOSED = false; + triggerRobot(); - // pageController.jumpToPage(tab); - } else { - if (currentTab > 0 && tab == 2) { - pageController.jumpToPage(0); + // pageController.jumpToPage(tab); + } else { + if (currentTab > 0 && tab == 2) { + pageController.jumpToPage(0); currentTab = tab; - } else if (tab != 0) { - // if (tab == 4 && projectViewModel.isLogin && model.count == 0) { - // AppToast.showErrorToast(message: TranslationBase.of(context).noBookedAppo); - // } else { - pageController.jumpToPage(tab); - currentTab = tab; - // } - } else { - pageController.jumpToPage(tab); - currentTab = tab; - } + } else if (tab != 0) { + // if (tab == 4 && projectViewModel.isLogin && model.count == 0) { + // AppToast.showErrorToast(message: TranslationBase.of(context).noBookedAppo); + // } else { + pageController.jumpToPage(tab); + currentTab = tab; + // } + } else { + pageController.jumpToPage(tab); + currentTab = tab; + } setState(() {}); - // currentTab = tab; - } + // currentTab = tab; + } // }); // }); @@ -380,11 +382,9 @@ class _LandingPageState extends State with WidgetsBindingObserver { SelectDeviceIMEIRES savedData = SelectDeviceIMEIRES.fromJson(data); Navigator.of(context).push( MaterialPageRoute( - builder: (BuildContext context) => SavedLogin(savedData), + builder: (BuildContext context) => SavedLogin(savedData), ), ); - - } else { GifLoaderDialogUtils.showMyDialog(context); authService.selectDeviceImei(DEVICE_TOKEN).then((value) async { @@ -395,7 +395,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { setUserValues(value); Navigator.of(context).push( MaterialPageRoute( - builder: (BuildContext context) => SavedLogin(savedData), + builder: (BuildContext context) => SavedLogin(savedData), ), ); } else { @@ -481,7 +481,6 @@ class _LandingPageState extends State with WidgetsBindingObserver { authService.getDashboard().then((value) => { if (value != null) { - setState(() { notificationCount = value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); @@ -684,11 +683,9 @@ class _LandingPageState extends State with WidgetsBindingObserver { authService.getDashboard().then((value) async { setState(() { if (value != null) { - notificationCount = value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); model.setState(model.count, model.ancillaryCount, true, notificationCount); sharedPref.setString(NOTIFICATION_COUNT, notificationCount); - } }); // if (await AppSharedPreferences().getBool(IS_LAST_APPOINTMENT_RATE_SHOWN) == null || !await AppSharedPreferences().getBool(IS_LAST_APPOINTMENT_RATE_SHOWN)) { @@ -735,13 +732,16 @@ class _LandingPageState extends State with WidgetsBindingObserver { sharedPref.setString(IS_COVID_CONSENT_SHOWN, "true"); } - checkLastLoginStatus(AuthenticatedUser user, String deviceToken) async{ + checkLastLoginStatus(AuthenticatedUser user, String deviceToken) async { int lastLoginStatus = await sharedPref.getInt(LAST_LOGIN) != null ? await sharedPref.getInt(LAST_LOGIN) : 1; - if(lastLoginStatus == 1 || lastLoginStatus == 4){ - showQuickLoginBottomSheet(context, user, deviceToken,false); - } + if (lastLoginStatus == 1 || lastLoginStatus == 4) { + if (await sharedPref.getBool(HAS_ENABLED_QUICK_LOGIN) == null || !await sharedPref.getBool(HAS_ENABLED_QUICK_LOGIN)) { + showQuickLoginBottomSheet(context, user, deviceToken, false); + } + // showQuickLoginBottomSheet(context, user, deviceToken, false); + } } void showQuickLoginBottomSheet(BuildContext context, AuthenticatedUser user, String deviceToken, bool isDone) { @@ -750,63 +750,68 @@ class _LandingPageState extends State with WidgetsBindingObserver { backgroundColor: Colors.transparent, isScrollControlled: true, useSafeArea: true, - builder: (context) => SafeArea( + builder: (context) => SafeArea( child: Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), child: QuickLoginBottomSheet( - isDone:isDone, - onPressed: (){ - loginWithFingerPrintFace(3, 1, user, deviceToken); - },), + isDone: isDone, + onPressed: () { + sharedPref.setBool(HAS_ENABLED_QUICK_LOGIN, true); + loginWithFingerPrintFace(3, 1, user, deviceToken); + }, + ), ), ), - ); + ).then((value) { + sharedPref.setBool(HAS_ENABLED_QUICK_LOGIN, value); + }); } - loginWithFingerPrintFace(type, int isActive, AuthenticatedUser user, String deviceToken ) async { - try { - authenticated = await auth.authenticate( - localizedReason: 'Scan your fingerprint to authenticate', - options: AuthenticationOptions( - useErrorDialogs: true, - stickyAuth: true, - ), - authMessages: [ - // IOSAuthMessages( - // cancelButton: 'cancel', - // goToSettingsButton: 'settings', - // goToSettingsDescription: 'Please set up your Touch ID.', - // lockOut: 'Please reenable your Touch ID'), - ], - ); - } on PlatformException catch (e) { - GifLoaderDialogUtils.hideDialog(context); - context.showBottomSheet( - child: ExceptionBottomSheet( - message: "Please enable your Touch or Face ID", - onOkPressed: () { - Navigator.of(context).pop(); - // Don't resume timer here, let it continue naturally when user tries again - }, - ), - ); - // AppToast.showErrorToast(message: 'Please enable your Touch or Face ID'); - } - if (authenticated == true) { - Navigator.of(context).pop(); - int lastLogin = 1; - var availableBiometrics = await auth.getAvailableBiometrics(); - - if (availableBiometrics.contains(BiometricType.strong) || availableBiometrics.contains(BiometricType.face)) { - lastLogin = 3; // Assume Face or secure fingerprint - } else if (availableBiometrics.contains(BiometricType.weak) || availableBiometrics.contains(BiometricType.fingerprint)) { - lastLogin = 2; // Likely weak fingerprint - } - await sharedPref.setInt(LAST_LOGIN, lastLogin); - showQuickLoginBottomSheet(context, user, deviceToken, true); - insertIMEI(lastLogin, deviceToken); + loginWithFingerPrintFace(type, int isActive, AuthenticatedUser user, String deviceToken) async { + try { + authenticated = await auth.authenticate( + localizedReason: 'Scan your fingerprint to authenticate', + options: AuthenticationOptions( + useErrorDialogs: true, + stickyAuth: true, + ), + authMessages: [ + // IOSAuthMessages( + // cancelButton: 'cancel', + // goToSettingsButton: 'settings', + // goToSettingsDescription: 'Please set up your Touch ID.', + // lockOut: 'Please reenable your Touch ID'), + ], + ); + } on PlatformException catch (e) { + GifLoaderDialogUtils.hideDialog(context); + context.showBottomSheet( + child: ExceptionBottomSheet( + message: "Please enable your Touch or Face ID", + onOkPressed: () { + Navigator.of(context).pop(); + // Don't resume timer here, let it continue naturally when user tries again + }, + ), + ); + // AppToast.showErrorToast(message: 'Please enable your Touch or Face ID'); + } + if (authenticated == true) { + Navigator.of(context).pop(); + int lastLogin = 1; + var availableBiometrics = await auth.getAvailableBiometrics(); + + if (availableBiometrics.contains(BiometricType.strong) || availableBiometrics.contains(BiometricType.face)) { + lastLogin = 3; // Assume Face or secure fingerprint + } else if (availableBiometrics.contains(BiometricType.weak) || availableBiometrics.contains(BiometricType.fingerprint)) { + lastLogin = 2; // Likely weak fingerprint } + + await sharedPref.setInt(LAST_LOGIN, lastLogin); + showQuickLoginBottomSheet(context, user, deviceToken, true); + insertIMEI(lastLogin, deviceToken); } + } insertIMEI(lastLogin, String deviceToken) async { authService.insertDeviceImei(lastLogin).then((value) => {}).catchError((err) { @@ -816,5 +821,4 @@ class _LandingPageState extends State with WidgetsBindingObserver { await sharedPref.setInt(LAST_LOGIN, lastLogin); authService.registeredAuthenticatedUser(data, deviceToken, 0, 0).then((res) => {}); } - } - +} diff --git a/lib/pages/login/register_new.dart b/lib/pages/login/register_new.dart index 3940df0f..093a954b 100644 --- a/lib/pages/login/register_new.dart +++ b/lib/pages/login/register_new.dart @@ -762,6 +762,7 @@ class _RegisterNew extends State { final isHijriDate = isHijri == 1; final dobString = isHijriDate ? selectedDOB!.toString() : dateFormat.format(selectedDOB!); var req; + GifLoaderDialogUtils.showMyDialog(context); if (skipRegistration) { req = getCommonRequest(type: type); } else { diff --git a/lib/pages/login/saved_login.dart b/lib/pages/login/saved_login.dart index 72223bea..e85950fa 100644 --- a/lib/pages/login/saved_login.dart +++ b/lib/pages/login/saved_login.dart @@ -217,7 +217,7 @@ class _SavedLogin extends State { widget.savedLoginData.logInType != null && widget.savedLoginData.logInType != 1 ? Column( children: [ - CustomButton( + widget.savedLoginData.logInType !=1 ? CustomButton( text: TranslationBase.of(context).loginByOTP, onPressed: () { widget.savedLoginData.logInType = 1; @@ -230,11 +230,11 @@ class _SavedLogin extends State { borderWidth: 2, padding: EdgeInsets.fromLTRB(0, 14, 0, 14), icon: "assets/images/svg/password-validation.svg", - ), + ) : Container(), SizedBox( height: 20, ), - CustomButton( + widget.savedLoginData.logInType !=4 ? CustomButton( text: "${TranslationBase.of(context).loginBy} ${getType(4, context)}", onPressed: () { widget.savedLoginData.logInType = 4; @@ -247,7 +247,7 @@ class _SavedLogin extends State { borderWidth: 2, padding: EdgeInsets.fromLTRB(0, 14, 0, 14), icon: "assets/images/svg/whatsapp.svg", - ), + ) : Container(), ], ) : CustomButton( @@ -703,6 +703,7 @@ class _SavedLogin extends State { phoneController!.text, (code) { checkActivationCode(code, type, loginToken, onWrongActivationCode: (String? message) { + smsOtp.clearOTPInput(); context.showBottomSheet( child: ExceptionBottomSheet( message: message.toString(), diff --git a/lib/widgets/quick_login.dart b/lib/widgets/quick_login.dart index f7c2990a..cffdaecf 100644 --- a/lib/widgets/quick_login.dart +++ b/lib/widgets/quick_login.dart @@ -6,8 +6,6 @@ import 'package:hmg_patient_app/uitl/translations_delegate_base.dart'; import 'package:hmg_patient_app/uitl/utils.dart'; import 'package:hmg_patient_app/widgets/buttons/defaultButton.dart'; - - class QuickLoginBottomSheet extends StatefulWidget { final VoidCallback onPressed; final bool isDone; @@ -17,8 +15,8 @@ class QuickLoginBottomSheet extends StatefulWidget { @override _QuickLoginBottomSheet createState() => _QuickLoginBottomSheet(); } -class _QuickLoginBottomSheet extends State { +class _QuickLoginBottomSheet extends State { @override Widget build(BuildContext context) { return Container( @@ -30,97 +28,103 @@ class _QuickLoginBottomSheet extends State { ), ), padding: const EdgeInsets.all(24), - child: Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center,children: [ - - - widget.isDone ? Column(children: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ InkWell( - onTap: () { - Navigator.of(context).pop(); - }, - child: SvgPicture.asset("assets/images/svg/cross-circle.svg", width: 24, height: 24)),],), - Utils.showLottie(context: context, assetPath: 'assets/animations/lottie/checkmark.json', width: 120, height: 120, repeat: true), - Text( - TranslationBase.of(context).allSet, - textAlign: TextAlign.center, - style: context.dynamicTextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Colors.black, - - ), - ), - - ],) : Column( + child: Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - - Image.asset("assets/images/lock-icon.png", height: 101,), - const SizedBox(height: 10), - Text( - TranslationBase.of(context).enableQuickLogin, - style: context.dynamicTextStyle( - fontSize: 26, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ), - - const SizedBox(height: 5), - - // Description - Text( - TranslationBase.of(context).enableMsg, - style: context.dynamicTextStyle( - fontSize: 16, - color: Color(0xFF666666), - height: 1.5, - ), - ), - - - - const SizedBox(height: 24), - - // Buttons - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Expanded(child: - CustomButton( - text:TranslationBase.of(context).enableQuickLogin, - onPressed:widget.onPressed, - backgroundColor:Color(0xffED1C2B), - borderColor:Color(0xffED1C2B), - textColor: Colors.white, - icon: "assets/images/svg/apple-finder.svg", - )), - ], - ), - SizedBox(height: 16,), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Expanded(child: - - CustomButton( - text:TranslationBase.of(context).notNow, - onPressed: (){ Navigator.pop(context);}, - backgroundColor:Color(0xffFEE9EA), - borderColor:Color(0xffFEE9EA), - textColor: Colors.red, - // icon: "assets/images/svg/apple-finder.svg", - )), - ], - ), + widget.isDone + ? Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () { + Navigator.pop(context, true); + }, + child: SvgPicture.asset("assets/images/svg/cross-circle.svg", width: 24, height: 24)), + ], + ), + Utils.showLottie(context: context, assetPath: 'assets/animations/lottie/checkmark.json', width: 120, height: 120, repeat: true), + Text( + TranslationBase.of(context).allSet, + textAlign: TextAlign.center, + style: context.dynamicTextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + "assets/images/lock-icon.png", + height: 101, + ), + const SizedBox(height: 10), + Text( + TranslationBase.of(context).enableQuickLogin, + style: context.dynamicTextStyle( + fontSize: 26, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + const SizedBox(height: 5), + // Description + Text( + TranslationBase.of(context).enableMsg, + style: context.dynamicTextStyle( + fontSize: 16, + color: Color(0xFF666666), + height: 1.5, + ), + ), + const SizedBox(height: 24), + // Buttons + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: CustomButton( + text: TranslationBase.of(context).enableQuickLogin, + onPressed: () { + widget.onPressed(); + }, + backgroundColor: Color(0xffED1C2B), + borderColor: Color(0xffED1C2B), + textColor: Colors.white, + icon: "assets/images/svg/apple-finder.svg", + )), + ], + ), + SizedBox( + height: 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: CustomButton( + text: TranslationBase.of(context).notNow, + onPressed: () { + Navigator.pop(context, true); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Colors.red, + // icon: "assets/images/svg/apple-finder.svg", + )), + ], + ), + ], + ) ], - )],), + ), ); } - - -} \ No newline at end of file +}