From ba2c8327fe464a0a37295dfe786995fe41566129 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 8 Sep 2025 16:06:44 +0300 Subject: [PATCH] login flow inprogress --- assets/images/png/female_img.png | Bin 0 -> 10454 bytes assets/images/png/lock-icon.png | Bin 0 -> 66514 bytes assets/langs/ar-SA.json | 7 +- assets/langs/en-US.json | 7 +- lib/core/app_assets.dart | 5 +- lib/core/app_state.dart | 3 +- lib/core/dependencies.dart | 6 + lib/core/enums.dart | 4 +- lib/extensions/context_extensions.dart | 5 + .../authentication_view_model.dart | 57 ++++++-- lib/generated/locale_keys.g.dart | 6 +- lib/main.dart | 1 + .../authentication/quick_login.dart | 136 ++++++++++++++++++ .../authentication/saved_login_screen.dart | 54 ++++--- lib/presentation/home/landing_page.dart | 110 ++++++++++---- .../home/widgets/welcome_widget.dart | 56 ++++++++ .../insurance/insurance_home_page.dart | 2 +- .../widgets/patient_insurance_card.dart | 2 +- lib/services/dialog_service.dart | 5 +- lib/services/localauth_service.dart | 40 ++++++ lib/theme/colors.dart | 2 + 21 files changed, 443 insertions(+), 65 deletions(-) create mode 100644 assets/images/png/female_img.png create mode 100644 assets/images/png/lock-icon.png create mode 100644 lib/presentation/authentication/quick_login.dart create mode 100644 lib/presentation/home/widgets/welcome_widget.dart create mode 100644 lib/services/localauth_service.dart diff --git a/assets/images/png/female_img.png b/assets/images/png/female_img.png new file mode 100644 index 0000000000000000000000000000000000000000..3307034b5e5bbddbe916e1bafa43cf4928dae70c GIT binary patch literal 10454 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 M07*qoM6N<$f;5|yCIA2c literal 0 HcmV?d00001 diff --git a/assets/images/png/lock-icon.png b/assets/images/png/lock-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..39645887af7379a9f33622b1f5aecffda03993e4 GIT binary patch literal 66514 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 literal 0 HcmV?d00001 diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index ede5e64..933afa4 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -806,5 +806,10 @@ "loginBy": "تسجيل الدخول بواسطة", "loginByOTP": "تسجيل الدخول بواسطة OTP", "guest": "زائر", - "switchAccount": "تبديل الحساب" + "switchAccount": "تبديل الحساب", + "lastLoginBy":"آخر تسجيل دخول بواسطة", + "allSet": "جاهز! الآن يمكنك تسجيل الدخول باستخدام Face ID / Biometric أو البصمة", + "enableQuickLogin":"تمكين تسجيل الدخول السريع", + "enableMsg":"تمكين تسجيل الدخول السريع سيسمح بالتحقق من خلال Face ID / Biometric الخاص بجهازك الحالي", + "notNow": "ليس الآن" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 8ccd2c4..0b29886 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -802,5 +802,10 @@ "loginBy": "Login By", "loginByOTP": "Login By OTP", "guest": "Guest", - "switchAccount": "Switch Account" + "switchAccount": "Switch Account", + "lastloginBy": "Last login by", + "allSet": "All Set! Now you can login with Face ID or Biometric", + "enableQuickLogin": "Enable Quick Login", + "enableMsg": "Enabling the quick login will verify through your existing device Face ID / Biometric", + "notNow": "Not Now" } \ No newline at end of file diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index ac3cfe6..e4ddcfe 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -75,6 +75,8 @@ class AppAssets { static const String insurance = '$svgBasePath/insurance.svg'; static const String requests = '$svgBasePath/requests.svg'; static const String more = '$svgBasePath/more.svg'; + static const String bell = '$svgBasePath/bell.svg'; + //bottom navigation// static const String homeBottom = '$svgBasePath/home_bottom.svg'; @@ -88,12 +90,13 @@ class AppAssets { static const String hmg_logo = '$pngBasePath/hmg_logo.png'; static const String livecare_service = '$pngBasePath/livecare_service.png'; static const String male_img = '$pngBasePath/male_img.png'; - + static const String femaleImg = '$pngBasePath/female_img.png'; static const String apple_pay = '$pngBasePath/Apple_Pay.png'; static const String mada = '$pngBasePath/Mada.png'; static const String Mastercard = '$pngBasePath/Mastercard.png'; static const String tamara_en = '$pngBasePath/tamara_en.png'; static const String visa = '$pngBasePath/visa.png'; + static const String lockIcon = '$pngBasePath/lock-icon.png'; } class AppAnimations { diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart index cf8f8e5..53304b0 100644 --- a/lib/core/app_state.dart +++ b/lib/core/app_state.dart @@ -33,6 +33,7 @@ class AppState { if (isFamily) { _authenticatedChildUser = authenticatedUser; } else { + setIsAuthenticated = true; _authenticatedRootUser = authenticatedUser; } } @@ -75,7 +76,7 @@ class AppState { set setSessionId(v) => sessionId = v; - bool isAuthenticated = true; + bool isAuthenticated = false; set setIsAuthenticated(v) => isAuthenticated = v; diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index a900742..afb2e83 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -21,8 +21,10 @@ import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/firebase_service.dart'; +import 'package:hmg_patient_app_new/services/localauth_service.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:local_auth/local_auth.dart'; import 'package:logger/web.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -49,6 +51,8 @@ class AppDependencies { )); getIt.registerLazySingleton(() => NavigationService()); + getIt.registerLazySingleton(() => LocalAuthentication()); + getIt.registerLazySingleton(() => GAnalytics()); getIt.registerLazySingleton(() => AppState(navigationService: getIt())); getIt.registerLazySingleton(() => LocationUtils( @@ -76,6 +80,7 @@ class AppDependencies { getIt.registerLazySingleton(() => RadiologyRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => PrescriptionsRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => InsuranceRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => LocalAuthService(loggerService: getIt(), localAuth: getIt())); // ViewModels // Global/shared VMs → LazySingleton @@ -116,6 +121,7 @@ class AppDependencies { dialogService: getIt(), appState: getIt(), errorHandlerService: getIt(), + localAuthService: getIt() ), ); diff --git a/lib/core/enums.dart b/lib/core/enums.dart index ab5cac1..63d63d7 100644 --- a/lib/core/enums.dart +++ b/lib/core/enums.dart @@ -32,7 +32,7 @@ enum MaritalStatusTypeEnum { single, married, divorced, widowed } enum ChipTypeEnum { success, error, alert, info, warning } -enum OTPTypeEnum { sms, whatsapp } +enum OTPTypeEnum { sms, whatsapp, faceIDFingerprint } enum LoginTypeEnum { sms, whatsapp, face, fingerprint } @@ -89,6 +89,8 @@ extension OTPTypeEnumExtension on OTPTypeEnum { return 1; case OTPTypeEnum.whatsapp: return 2; + case OTPTypeEnum.faceIDFingerprint: + return 0; } } diff --git a/lib/extensions/context_extensions.dart b/lib/extensions/context_extensions.dart index 4e9da0d..27d4cf4 100644 --- a/lib/extensions/context_extensions.dart +++ b/lib/extensions/context_extensions.dart @@ -5,6 +5,11 @@ extension ContextUtils on BuildContext { double get screenWidth => MediaQuery.of(this).size.width; + EdgeInsets get padding => MediaQuery.of(this).padding; + + bool get safeInsets => padding.top > 0 || padding.bottom > 0 || padding.left > 0 || padding.right > 0; + + ThemeData get theme => Theme.of(this); TextTheme get textTheme => theme.textTheme; diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index 4ce1400..52c83e7 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -14,21 +14,21 @@ import 'package:hmg_patient_app_new/features/authentication/models/request_model import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_activation_code_resp_model.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/saved_login_screen.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/localauth_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; -import 'models/resp_models/authenticated_user_resp_model.dart'; - class AuthenticationViewModel extends ChangeNotifier { final AuthenticationRepo _authenticationRepo; final AppState _appState; final ErrorHandlerService _errorHandlerService; final DialogService _dialogService; final NavigationService _navigationService; - + final LocalAuthService _localAuthService; AuthenticationViewModel({ required AppState appState, required AuthenticationRepo authenticationRepo, @@ -36,11 +36,13 @@ class AuthenticationViewModel extends ChangeNotifier { required DialogService dialogService, required NavigationService navigationService, required CacheService cacheService, + required LocalAuthService localAuthService, }) : _navigationService = navigationService, _dialogService = dialogService, _errorHandlerService = errorHandlerService, _appState = appState, - _authenticationRepo = authenticationRepo; + _authenticationRepo = authenticationRepo, + _localAuthService = localAuthService; final TextEditingController nationalIdController = TextEditingController(), phoneNumberController = TextEditingController(), dobController = TextEditingController(); CountryEnum selectedCountrySignup = CountryEnum.saudiArabia; @@ -75,7 +77,7 @@ class AuthenticationViewModel extends ChangeNotifier { try { LoadingUtils.showFullScreenLoader(); //TODO: We will remove this delay - await Future.delayed(Duration(seconds: 3)); + // await Future.delayed(Duration(seconds: 3)); var data = _appState.getSelectDeviceByImeiRespModelElement; log("Cached IMEI data: ${data?.toJson()}"); if (data != null) { @@ -168,8 +170,8 @@ class AuthenticationViewModel extends ChangeNotifier { if (savedData != null) { // TODO: Navigate to SavedLogin when available - _navigationService.pushPage(page: LoginScreen()); - // navigationService.pushPage(page: SavedLogin(savedData)); + //_navigationService.pushPage(page: LoginScreen()); + _navigationService.pushPage(page: SavedLogin()); } } catch (e) { log("Error handling existing IMEI data: $e"); @@ -189,8 +191,8 @@ class AuthenticationViewModel extends ChangeNotifier { // TODO: Navigate to SavedLogin when available // SelectDeviceByImeiRespModelElement savedData = // SelectDeviceByImeiRespModelElement.fromJson(respData); - // navigationService.pushPage(page: SavedLogin(savedData)); - _navigationService.pushPage(page: LoginScreen()); + _navigationService.pushPage(page: SavedLogin()); + // _navigationService.pushPage(page: LoginScreen()); } else { LoadingUtils.hideFullScreenLoader(); _navigationService.pushPage(page: LoginScreen()); @@ -365,6 +367,9 @@ class AuthenticationViewModel extends ChangeNotifier { // GifLoaderDialogUtils.hideDialog(context); onWrongActivationCode(activation.errorEndUserMessage); return; + } else if(activation.messageStatus ==2){ + onWrongActivationCode(activation.errorEndUserMessage); + return; } else if (registerd_data?.isRegister == true) { _navigationService.popUntilNamed(AppRoutes.registerNewScreen); // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew)); @@ -372,6 +377,7 @@ class AuthenticationViewModel extends ChangeNotifier { } else { if (activation.list != null && activation.list!.isNotEmpty) { _appState.setAuthenticatedUser(activation.list!.first); + } _appState.setUserBloodGroup = (activation.patientBlodType ?? ""); _appState.setAppLoginTokenID = activation.authenticationTokenId; @@ -381,7 +387,9 @@ class AuthenticationViewModel extends ChangeNotifier { if (isUserAgreedBefore) { navigateToHomeScreen(); } else { - getUserAgreementContent(request: request); + navigateToHomeScreen(); + //Agreement page not designed yet so we are navigating to home screen directly + // getUserAgreementContent(request: request); } // TODO: setPreferences and stuff // sharedPref.remove(FAMILY_FILE); @@ -457,7 +465,34 @@ class AuthenticationViewModel extends ChangeNotifier { } Future onWrongActivationCode({String? message}) async { - // TODO: HANDLE THIS VIA BOTTOM SHEET + await _dialogService.showErrorBottomSheet(message: message ?? "Something went wrong. ", onOkPressed: () {}); + } + + loginWithFingerPrintFace(int selectedOption) async { + _localAuthService.authenticate().then((value) { + if (value) { + // we have to handle this if verification true; + checkActivationCode(otpTypeEnum: OTPTypeEnum.faceIDFingerprint, activationCode: 0000, onWrongActivationCode: (String? message) { }); + // authenticated = true; + notifyListeners(); + // navigateToHomeScreen(); + } else { + //authenticated = false; + notifyListeners(); + } + }); + this.selectedOption = selectedOption; + notifyListeners(); + + } + + checkLastLoginStatus(Function() onSuccess) async { + if(_appState.getSelectDeviceByImeiRespModelElement !=null && (_appState.getSelectDeviceByImeiRespModelElement!.logInType ==1 || _appState.getSelectDeviceByImeiRespModelElement!.logInType ==4)){ + Future.delayed(Duration(seconds: 1),(){ + onSuccess(); + }); + + } } @override diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 7831616..dc71850 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -805,5 +805,9 @@ abstract class LocaleKeys { static const checkAvailability = 'checkAvailability'; static const readInstructions = 'readInstructions'; static const searchLabReport = 'searchLabReport'; - + static const lastloginBy = 'lastloginBy'; + static const allSet ='allSet'; + static const enableQuickLogin = 'enableQuickLogin'; + static const enableMsg = 'enableMsg'; + static const notNow = 'notNow'; } diff --git a/lib/main.dart b/lib/main.dart index 53825c8..6c5848d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -99,6 +99,7 @@ void main() async { errorHandlerService: getIt(), navigationService: getIt(), cacheService: getIt(), + localAuthService: getIt(), ), ), ], child: MyApp()), diff --git a/lib/presentation/authentication/quick_login.dart b/lib/presentation/authentication/quick_login.dart new file mode 100644 index 0000000..9cf0431 --- /dev/null +++ b/lib/presentation/authentication/quick_login.dart @@ -0,0 +1,136 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class QuickLogin extends StatefulWidget { + final VoidCallback onPressed; + final bool isDone; + + const QuickLogin({super.key, required this.onPressed, this.isDone = false}); + + @override + _QuickLogin createState() => _QuickLogin(); +} + +class _QuickLogin extends State { + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + ), + 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.pop(context, true); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.cross_circle)), + ], + ), + Utils.showLottie(context: context, assetPath: AppAnimations.checkmark, width: 120, height: 120, repeat: true), + LocaleKeys.allSet.tr().toText16(textAlign: + TextAlign.center, weight: FontWeight.w500) + // Text( + // ' TranslationBase.of(context).allSet', + // textAlign: TextAlign.center, + // style: context.dynamicTextStyle( + // fontSize: 16, + // fontWeight: FontWeight.w500, + // color: Colors.black, + // ), + // ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + AppAssets.lockIcon, + height: 101, + ), + const SizedBox(height: 10), + LocaleKeys.enableQuickLogin.tr().toText26(isBold: true), + // Text( + // ' TranslationBase.of(context).enableQuickLogin', + // style: context.dynamicTextStyle( + // fontSize: 26, + // fontWeight: FontWeight.bold, + // color: Colors.black, + // ), + // ), + const SizedBox(height: 5), + LocaleKeys.enableQuickLogin.tr().toText16(color: AppColors.quickLoginColor), + // 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:LocaleKeys.enableQuickLogin.tr(), + onPressed: () { + widget.onPressed(); + }, + backgroundColor: Color(0xffED1C2B), + borderColor: Color(0xffED1C2B), + textColor: Colors.white, + icon:AppAssets.apple_finder, + )), + ], + ), + SizedBox( + height: 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.notNow.tr(), + onPressed: () { + Navigator.pop(context, true); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Colors.red, + // icon: "assets/images/svg/apple-finder.svg", + )), + ], + ), + ], + ) + ], + ), + ); + } +} diff --git a/lib/presentation/authentication/saved_login_screen.dart b/lib/presentation/authentication/saved_login_screen.dart index da04c40..fe2c760 100644 --- a/lib/presentation/authentication/saved_login_screen.dart +++ b/lib/presentation/authentication/saved_login_screen.dart @@ -2,37 +2,51 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.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/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; import 'package:hmg_patient_app_new/widgets/bottomsheet/generic_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:provider/provider.dart'; + class SavedLogin extends StatefulWidget { - // final SelectDeviceIMEIRES savedLoginData; - // const SavedLogin(this.savedLoginData, {Key? key}) : super(key: key); - const SavedLogin(); + + const SavedLogin({Key? key}) : super(key: key); @override _SavedLogin createState() => _SavedLogin(); } class _SavedLogin extends State { - LoginTypeEnum loginType = LoginTypeEnum.sms; + LoginTypeEnum loginType = LoginTypeEnum.sms; + late AuthenticationViewModel authVm; + late AppState appState; @override void initState() { + authVm = context.read(); + appState = getIt.get(); + authVm.phoneNumberController.text = appState.getSelectDeviceByImeiRespModelElement!.mobile!; + authVm.nationalIdController.text = appState.getSelectDeviceByImeiRespModelElement!.identificationNo!; + super.initState(); } @override Widget build(BuildContext context) { + + return Scaffold( appBar: CustomAppBar( onBackPressed: () {}, @@ -48,7 +62,7 @@ class _SavedLogin extends State { // Welcome back text LocaleKeys.welcomeBack.tr().toText16(color: AppColors.inputLabelTextColor), SizedBox(height: 16.h), - ("widget.savedLoginData.name!.toLowerCase().capitalizeFirstofEach").toText26(isBold: true, height: 26 / 36, color: AppColors.textColor), + appState.getSelectDeviceByImeiRespModelElement!.name!.toCamelCase.toText26(isBold: true, height: 26 / 36, color: AppColors.textColor), SizedBox(height: 24.h), Container( padding: EdgeInsets.all(16.h), @@ -63,22 +77,25 @@ class _SavedLogin extends State { child: Column( children: [ // Last login info - ('LocaleKeys.lastloginBy.tr()' + ' {getType(widget.savedLoginData.logInType!, context)}').toText14(isBold: true, color: AppColors.greyTextColor), - ('widget.savedLoginData.createdOn != null ? DateUtil.getFormattedDate(DateUtil.convertStringToDate(widget.savedLoginData.createdOn!), "d MMMM, y at HH:mm") : --') + + ("${LocaleKeys.lastloginBy.tr() } ${LoginTypeExtension.fromValue(appState.getSelectDeviceByImeiRespModelElement!.logInType!)!.displayName}" + ).toText14(isBold: true, color: AppColors.greyTextColor), + (appState.getSelectDeviceByImeiRespModelElement!.createdOn != null ? DateUtil.getFormattedDate(DateUtil.convertStringToDate(appState.getSelectDeviceByImeiRespModelElement!.createdOn!), "d MMMM, y at HH:mm") : '--') .toText16(isBold: true, color: AppColors.textColor), - Container(margin: EdgeInsets.all(16.h), child: Utils.buildSvgWithAssets(icon: getTypeIcons(loginType.toInt), iconColor: loginType.toInt == 4 ? null : AppColors.primaryRedColor)), + Container(margin: EdgeInsets.all(16.h), child: Utils.buildSvgWithAssets(icon: getTypeIcons(loginType.toInt), height: 54, width: 54, iconColor: loginType.toInt == 4 ? null : AppColors.primaryRedColor)), // Face ID login button - Container( + SizedBox( height: 45, child: CustomButton( text: "${LocaleKeys.loginBy.tr()} ${loginType.displayName}", onPressed: () { if (loginType == LoginTypeEnum.fingerprint || loginType == LoginTypeEnum.face) { - // loginWithFingerPrintFace(loginType.toInt, widget.savedLoginData.iMEI!); - } else { - int? val = loginType.toInt; - //checkUserAuthentication(val); + authVm.loginWithFingerPrintFace(loginType.toInt); + } + else { + // int? val = loginType.toInt; + authVm.checkUserAuthentication(otpTypeEnum: loginType == LoginTypeEnum.sms ? OTPTypeEnum.sms : OTPTypeEnum.whatsapp); } }, backgroundColor: Color(0xffED1C2B), @@ -104,7 +121,7 @@ class _SavedLogin extends State { ), const SizedBox(height: 24), // OTP login button - loginType != null && loginType.toInt != 1 + loginType.toInt != 1 ? Column( children: [ loginType.toInt != 1 @@ -140,7 +157,7 @@ class _SavedLogin extends State { Navigator.of(context).pop(); loginType = LoginTypeEnum.sms; int? val = loginType.toInt; - // checkUserAuthentication(val); + authVm.checkUserAuthentication(otpTypeEnum:OTPTypeEnum.sms ); }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedBorderColor, @@ -163,7 +180,7 @@ class _SavedLogin extends State { Navigator.of(context).pop(); loginType = LoginTypeEnum.whatsapp; int? val = loginType.toInt; - // checkUserAuthentication(val); + authVm.checkUserAuthentication(otpTypeEnum:OTPTypeEnum.whatsapp ); }, backgroundColor: AppColors.transparent, borderColor: AppColors.textColor, @@ -195,11 +212,12 @@ class _SavedLogin extends State { text: "${LocaleKeys.loginBy.tr()} ${LoginTypeEnum.whatsapp.displayName}", onPressed: () { if (loginType == LoginTypeEnum.fingerprint || loginType == LoginTypeEnum.face) { - // loginWithFingerPrintFace(loginType.toInt, "iMEI"); + authVm.loginWithFingerPrintFace(loginType.toInt); } else { loginType = LoginTypeEnum.whatsapp; int? val = loginType.toInt; - // checkUserAuthentication(val); + authVm.checkUserAuthentication(otpTypeEnum:OTPTypeEnum.whatsapp ); + } }, backgroundColor: AppColors.whiteColor, diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index fdeb407..47a7846 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -11,14 +11,17 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/quick_login.dart'; import 'package:hmg_patient_app_new/presentation/home/data/landing_page_data.dart'; import 'package:hmg_patient_app_new/presentation/home/widgets/habib_wallet_card.dart'; import 'package:hmg_patient_app_new/presentation/home/widgets/large_service_card.dart'; import 'package:hmg_patient_app_new/presentation/home/widgets/small_service_card.dart'; +import 'package:hmg_patient_app_new/presentation/home/widgets/welcome_widget.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart' show CustomTabBar; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; @@ -31,11 +34,25 @@ class LandingPage extends StatefulWidget { } class _LandingPageState extends State { + late final AuthenticationViewModel authVM; + + @override + void initState() { + authVM = context.read(); + if(mounted) { + authVM.checkLastLoginStatus(() { + + showQuickLogin(context, false); + }); + } + super.initState(); + } + @override Widget build(BuildContext context) { AppState appState = getIt.get(); NavigationService navigationService = getIt.get(); - final AuthenticationViewModel authenticationViewModel = context.read(); + return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: SingleChildScrollView( @@ -46,32 +63,54 @@ class _LandingPageState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - CustomButton( - text: LocaleKeys.loginOrRegister.tr(context: context), - onPressed: () async { - await authenticationViewModel.onLoginPressed(); - }, - backgroundColor: Color(0xffFEE9EA), - borderColor: Color(0xffFEE9EA), - textColor: Color(0xffED1C2B), - fontSize: 16, - fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 50, - ), - Utils.buildSvgWithAssets( - icon: AppAssets.contact_icon, - width: 24, - height: 24, - ).onPress(() { - Navigator.of(context).push( - FadePage( - page: MedicalFilePage(), - // page: LoginScreen(), - ), - ); - }), + appState.isAuthenticated + ? WelcomeWidget( + onTap: () {}, + name: ('${appState.getAuthenticatedUser()!.firstName!} ${appState.getAuthenticatedUser()!.lastName!}'), + imageUrl: appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, + ) + : CustomButton( + text: LocaleKeys.loginOrRegister.tr(context: context), + onPressed: () async { + await authVM.onLoginPressed(); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50, + ), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 20, width: 20).onPress(() { + Navigator.of(context).push( + FadePage( + page: MedicalFilePage(), + // page: LoginScreen(), + ), + ); + }).paddingSymmetrical(8.h, 0), + Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 20, width: 20).onPress(() { + Navigator.of(context).push( + FadePage( + page: MedicalFilePage(), + // page: LoginScreen(), + ), + ); + }).paddingSymmetrical(8.h, 0), + Utils.buildSvgWithAssets(icon: AppAssets.contact_icon, height: 20, width: 20).onPress(() { + Navigator.of(context).push( + FadePage( + page: MedicalFilePage(), + // page: LoginScreen(), + ), + ); + }).paddingSymmetrical(8.h, 0), + ], + ) ], ).paddingSymmetrical(24.h, 0.h), ), @@ -275,4 +314,21 @@ class _LandingPageState extends State { ), ); } + + void showQuickLogin(BuildContext context, bool isDone) { + showCommonBottomSheet( + context, + title: "", + child: QuickLogin( + isDone: isDone, + onPressed: () { + // sharedPref.setBool(HAS_ENABLED_QUICK_LOGIN, true); + // loginWithFingerPrintFace(3, 1, user, deviceToken); + }, + ), + height: 400, + isFullScreen: false, + callBackFunc: (str) {}, + ); + } } diff --git a/lib/presentation/home/widgets/welcome_widget.dart b/lib/presentation/home/widgets/welcome_widget.dart new file mode 100644 index 0000000..d761a7f --- /dev/null +++ b/lib/presentation/home/widgets/welcome_widget.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class WelcomeWidget extends StatelessWidget { + final String name; + final String imageUrl; + final VoidCallback? onTap; + + const WelcomeWidget({ + super.key, + required this.name, + required this.imageUrl, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(30), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + // Profile image + + Image.asset(imageUrl, width: 40, height: 40), + + const SizedBox(width: 10), + + // Text column + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + "Welcome".toText14(color: AppColors.greyTextColor), + + + Row( + children: [ + + name.toText16(isBold: true), + + const SizedBox(width: 4), + const Icon(Icons.keyboard_arrow_down, size: 20, color: Colors.black), + ], + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/presentation/insurance/insurance_home_page.dart b/lib/presentation/insurance/insurance_home_page.dart index 131c454..451eeee 100644 --- a/lib/presentation/insurance/insurance_home_page.dart +++ b/lib/presentation/insurance/insurance_home_page.dart @@ -64,7 +64,7 @@ class _InsuranceHomePageState extends State { insuranceVM.setIsInsuranceHistoryLoading(true); insuranceVM.getPatientInsuranceCardHistory(); showCommonBottomSheet(context, - child: InsuranceHistory(), callBackFunc: () {}, title: "", height: ResponsiveExtension.screenHeight * 0.65, isCloseButtonVisible: false, isFullScreen: false); + child: InsuranceHistory(), callBackFunc: (str){}, title: "", height: ResponsiveExtension.screenHeight * 0.65, isCloseButtonVisible: false, isFullScreen: false); }, backgroundColor: AppColors.primaryRedColor.withOpacity(0.1), borderColor: AppColors.primaryRedColor.withOpacity(0.0), diff --git a/lib/presentation/insurance/widgets/patient_insurance_card.dart b/lib/presentation/insurance/widgets/patient_insurance_card.dart index 1edef84..4906493 100644 --- a/lib/presentation/insurance/widgets/patient_insurance_card.dart +++ b/lib/presentation/insurance/widgets/patient_insurance_card.dart @@ -120,7 +120,7 @@ class PatientInsuranceCard extends StatelessWidget { insuranceViewModel.setIsInsuranceUpdateDetailsLoading(true); insuranceViewModel.getPatientInsuranceDetailsForUpdate(); showCommonBottomSheet(context, - child: PatientInsuranceCardUpdateCard(), callBackFunc: () {}, title: "", height: ResponsiveExtension.screenHeight * 0.42, isCloseButtonVisible: false, isFullScreen: false); + child: PatientInsuranceCardUpdateCard(), callBackFunc: (str) {}, title: "", height: ResponsiveExtension.screenHeight * 0.42, isCloseButtonVisible: false, isFullScreen: false); }, backgroundColor: AppColors.bgGreenColor.withOpacity(0.20), borderColor: AppColors.bgGreenColor.withOpacity(0.0), diff --git a/lib/services/dialog_service.dart b/lib/services/dialog_service.dart index 28b77e1..9ba939b 100644 --- a/lib/services/dialog_service.dart +++ b/lib/services/dialog_service.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/extensions/route_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; abstract class DialogService { @@ -70,7 +71,9 @@ class _ErrorBottomSheet extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), ), - child: const Text("OK"), + child: const Text("OK", style: TextStyle(color: Colors.white)).onPress((){ + Navigator.of(context).pop(); + }), ), ], ), diff --git a/lib/services/localauth_service.dart b/lib/services/localauth_service.dart new file mode 100644 index 0000000..a01d1c1 --- /dev/null +++ b/lib/services/localauth_service.dart @@ -0,0 +1,40 @@ +import 'package:local_auth/local_auth.dart'; + +import 'logger_service.dart'; + +class LocalAuthService { + final LocalAuthentication localAuth; + final LoggerService loggerService; + LocalAuthService({required this.localAuth, required this.loggerService}); + + Future authenticate() async { + try { + bool isAuthenticated = await localAuth.authenticate( + localizedReason: 'Please authenticate to proceed', + options: const AuthenticationOptions( + biometricOnly: true, + stickyAuth: true, + ), + ); + return isAuthenticated; + } catch (e) { + return false; + } + } + + Future canCheckBiometrics() async { + try { + return await localAuth.canCheckBiometrics; + } catch (e) { + return false; + } + } + + Future> getAvailableBiometrics() async { + try { + return await localAuth.getAvailableBiometrics(); + } catch (e) { + return []; + } + } +} \ No newline at end of file diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 5cb9ced..c8eaa87 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -58,4 +58,6 @@ static const Color warningLightColor = Color(0xFFFFCC00); static const Color greyLightColor = Color(0xFFEFEFF0); static const Color bottomNAVBorder = Color(0xFFEEEEEE); + +static const Color quickLoginColor = Color(0xFF666666); }