You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hmg_nurses/lib/ui/login/login_method_page.dart

296 lines
11 KiB
Dart

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/dialogs/otp_dialog.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<LoginMethodsPage> {
final LocalAuthentication localAuth = LocalAuthentication();
List<BiometricType> _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<void> _getAvailableBiometrics() async {
try {
_availableBioMetricType = await localAuth.getAvailableBiometrics();
} on PlatformException catch (e) {
// AppToast.showErrorToast(message: e.message);
if (kDebugMode) {
print(e);
}
}
if (mounted) setState(() {});
}
Future<bool> 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);
// TODO: CALL API AND THEN SHOW DIALOG
OtpDialog(
type: 1,
mobileNo: 0504278212,
onSuccess: (string, TextEditingController pinPutController) {},
onFailure: () {},
onResendCode: () {},
).displayDialog(context);
} else {
// performApiCall(_title, _icon, _flag, _flag);
// TODO: CALL API AND THEN SHOW DIALOG
OtpDialog(
type: 1,
mobileNo: 0504278212,
onSuccess: (string, TextEditingController pinPutController) {},
onFailure: () {},
onResendCode: () {},
).displayDialog(context);
}
}
}
},
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: <Widget>[
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: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 4.w),
child: DefaultButton(LocaleKeys.useAnotherAccount.tr(), () {}, colors: const [MyColors.redColor, MyColors.redColor]),
),
SizedBox(height: 3.h)
],
),
),
),
),
);
}
}