import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; import 'package:hmg_nurses/classes/colors.dart'; import 'package:hmg_nurses/classes/utils.dart'; import 'package:hmg_nurses/extensions/int_extensions.dart'; import 'package:hmg_nurses/extensions/string_extensions.dart'; import 'package:hmg_nurses/generated/locale_keys.g.dart'; import 'package:hmg_nurses/widgets/button/default_button.dart'; import 'package:local_auth/local_auth.dart'; import 'package:sizer/sizer.dart'; // WhatsApp 2 // SMS 1 // Face ID 3 // Finger Print 4 class LoginMethodsPage extends StatefulWidget { const LoginMethodsPage({Key? key}) : super(key: key); @override LoginMethodsPageState createState() => LoginMethodsPageState(); } class LoginMethodsPageState extends State { final LocalAuthentication localAuth = LocalAuthentication(); List _availableBioMetricType = []; int selectedFlag = 0; bool isNeedVerifyWithFaceIDAndBiometrics = false; bool lastLoginCheck = false; @override void initState() { _getAvailableBiometrics(); super.initState(); } String getVerificationType(int type) { if (type == 1) { return LocaleKeys.sms.tr(); } else if (type == 2) { return LocaleKeys.whatsapp.tr(); } else if (type == 3) { return LocaleKeys.face.tr(); } else if (type == 4) { return LocaleKeys.fingerPrint.tr(); } return ""; } Future _getAvailableBiometrics() async { try { _availableBioMetricType = await localAuth.getAvailableBiometrics(); } on PlatformException catch (e) { // AppToast.showErrorToast(message: e.message); if (kDebugMode) { print(e); } } if (mounted) setState(() {}); } Future loginWithFaceIDAndBiometrics() async { bool authenticated = false; try { authenticated = await localAuth.authenticate( localizedReason: 'Scan your fingerprint to authenticate', ); } on PlatformException catch (e) { if (kDebugMode) { print(e); } Utils.hideLoading(context); Utils.showToast("Please enable your Touch or Face ID"); } return authenticated; } Widget _loginOptionButton(String title, String icon, int flag, int? loginIndex) { bool isDisable = ((flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint))); return InkWell( onTap: isDisable ? null : () async { if (flag == 0) { setState(() { // isMoreOption = true; }); } else { if (flag == 3 || flag == 4) { bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics(); if (!authenticateWithFaceAndTouchID) { return; } else { isNeedVerifyWithFaceIDAndBiometrics = true; selectedFlag = flag; setState(() { return; }); } } else { if (isNeedVerifyWithFaceIDAndBiometrics) { // performApiCall(_title, _icon, selectedFlag, _flag); } else { // performApiCall(_title, _icon, _flag, _flag); } } } }, child: Container( padding: const EdgeInsets.only(left: 20, right: 20, bottom: 15, top: 28), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDisable ? Colors.grey.withOpacity(0.3) : Colors.white, border: Border.all(color: MyColors.lightGreyEFColor, width: 1), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SvgPicture.asset( icon, height: 38, width: 38, color: isDisable ? MyColors.darkTextColor.withOpacity(0.7) : null, ), title.toText14() ], ), ), ); } Widget getButton(int flag) { switch (flag) { case 1: return _loginOptionButton(LocaleKeys.verifyThroughSMS.tr(), 'assets/images/login/verify_sms.svg', flag, null); case 2: return _loginOptionButton(LocaleKeys.verifyThroughWhatsapp.tr(), 'assets/images/login/verify_whatsapp.svg', flag, null); case 3: return _loginOptionButton(LocaleKeys.verifyThroughFace.tr(), 'assets/images/login/verify_face.svg', flag, BiometricType.face.index); case 4: return _loginOptionButton(LocaleKeys.verifyThroughFingerprint.tr(), 'assets/images/login/verify_thumb.svg', flag, BiometricType.fingerprint.index); default: return const SizedBox(); } } bool checkBiometricIsAvailable(BiometricType biometricType) { bool isAvailable = false; for (int i = 0; i < _availableBioMetricType.length; i++) { if (biometricType == _availableBioMetricType[i]) { isAvailable = true; break; } } return isAvailable; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.transparent, leading: IconButton( icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), onPressed: () => Navigator.pop(context), ), // actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width], ), body: ListView( padding: const EdgeInsets.all(21), physics: const BouncingScrollPhysics(), children: [ if (lastLoginCheck) Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.welcomeBack.tr().toText12(), "Faiz Hashmi".toText24(isBold: true), 10.height, LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText18(), Container( height: 72, margin: const EdgeInsets.only(top: 23, bottom: 23), alignment: Alignment.center, padding: const EdgeInsets.only(left: 17, right: 12), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, border: Border.all( color: const Color(0xffefefef), width: 1, ), ), child: Column( mainAxisSize: MainAxisSize.min, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ LocaleKeys.lastLoginDetails.tr().toText16(), //TODO: DATE // DateUtil.formatDateToDate(DateUtil.convertStringToDate(mobileLoginInfoListModel!.editedOn!), false).toText12(), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ LocaleKeys.verificationType.tr().toText10(color: MyColors.grey57Color), //TODO: VERIFICATION TYPE // getVerificationType(mobileLoginInfoListModel!.loginType!).toText12(), const Expanded(child: SizedBox()), //TODO: DATE // DateUtil.formatDateToTime(DateUtil.convertStringToDate(mobileLoginInfoListModel!.editedOn!)).toText12(), ], ) ], ), ), ], ), if (!lastLoginCheck) Text( LocaleKeys.pleaseVerifyForBio.tr(), style: TextStyle(fontSize: 14.sp, fontWeight: FontWeight.w600), ), if (isNeedVerifyWithFaceIDAndBiometrics) Text(LocaleKeys.pleaseVerifyForBio.tr()), GridView( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13, mainAxisSpacing: 9), physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.only(top: 9), shrinkWrap: true, children: [ if (!isNeedVerifyWithFaceIDAndBiometrics) getButton(3), if (!isNeedVerifyWithFaceIDAndBiometrics) getButton(4), getButton(2), getButton(1), ], ), SizedBox(height: 10.h), ], ), bottomSheet: !lastLoginCheck ? null : Container( height: 10.h, color: MyColors.backgroundColor, width: double.infinity, child: Center( child: FractionallySizedBox( widthFactor: 0.9, child: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 4.w), child: DefaultButton(LocaleKeys.useAnotherAccount.tr(), () {}, colors: const [MyColors.redColor, MyColors.redColor]), ), SizedBox(height: 3.h) ], ), ), ), ), ); } }