|
|
|
|
@ -2,15 +2,18 @@ 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:hexcolor/hexcolor.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/classes/enums.dart';
|
|
|
|
|
import 'package:hmg_nurses/classes/size_config.dart';
|
|
|
|
|
import 'package:hmg_nurses/extensions/string_extensions.dart';
|
|
|
|
|
import 'package:hmg_nurses/extensions/util_extensions.dart';
|
|
|
|
|
import 'package:hmg_nurses/extensions/widget_extensions.dart';
|
|
|
|
|
import 'package:hmg_nurses/generated/locale_keys.g.dart';
|
|
|
|
|
import 'package:hmg_nurses/ui/login/login_vm.dart';
|
|
|
|
|
import 'package:hmg_nurses/ui/login/widgets/verification_method_card.dart';
|
|
|
|
|
import 'package:hmg_nurses/widgets/button/default_button.dart';
|
|
|
|
|
import 'package:local_auth/local_auth.dart';
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
import 'package:sizer/sizer.dart';
|
|
|
|
|
|
|
|
|
|
// WhatsApp 2
|
|
|
|
|
@ -26,162 +29,15 @@ class LoginMethodsPage extends StatefulWidget {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
bool isMoreOption = false;
|
|
|
|
|
bool onlySMSBox = false;
|
|
|
|
|
late AuthMethodTypes fingerPrintBefore;
|
|
|
|
|
late AuthMethodTypes selectedOption;
|
|
|
|
|
late LoginViewModel loginViewModel;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
loginViewModel = context.read<LoginViewModel>();
|
|
|
|
|
return Scaffold(
|
|
|
|
|
appBar: AppBar(
|
|
|
|
|
backgroundColor: Colors.transparent,
|
|
|
|
|
@ -191,84 +47,243 @@ class LoginMethodsPageState extends State<LoginMethodsPage> {
|
|
|
|
|
),
|
|
|
|
|
// 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
|
|
|
|
|
body: SingleChildScrollView(
|
|
|
|
|
child: Center(
|
|
|
|
|
child: FractionallySizedBox(
|
|
|
|
|
widthFactor: 0.9,
|
|
|
|
|
child: SingleChildScrollView(
|
|
|
|
|
child: Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
SizedBox(height: 1.h),
|
|
|
|
|
if (loginViewModel.isFromLogin)
|
|
|
|
|
InkWell(
|
|
|
|
|
onTap: () {
|
|
|
|
|
loginViewModel.setUnverified(false, isFromLogin: false);
|
|
|
|
|
loginViewModel.setAppStatus(APPSTATUS.unAuthenticated);
|
|
|
|
|
},
|
|
|
|
|
child: const Icon(Icons.arrow_back_ios, color: MyColors.darkTextColor)),
|
|
|
|
|
Column(
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
SizedBox(height: 1.h),
|
|
|
|
|
|
|
|
|
|
isMoreOption != null && isMoreOption == false
|
|
|
|
|
? Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
LocaleKeys.welcomeBack.tr().toText12(),
|
|
|
|
|
SizedBox(height: 1.h),
|
|
|
|
|
"Faiz Hashmi".toText24(isBold: true),
|
|
|
|
|
SizedBox(height: 3.h),
|
|
|
|
|
LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText18(),
|
|
|
|
|
SizedBox(height: 3.h),
|
|
|
|
|
Container(
|
|
|
|
|
padding: const EdgeInsets.all(12),
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
color: Colors.white,
|
|
|
|
|
borderRadius: const BorderRadius.all(Radius.circular(10)),
|
|
|
|
|
border: Border.all(color: HexColor('#707070'), width: 0.1),
|
|
|
|
|
),
|
|
|
|
|
child: Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
LocaleKeys.lastLoginDetails.tr(),
|
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
|
style: TextStyle(
|
|
|
|
|
fontFamily: 'Poppins',
|
|
|
|
|
fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 4.8,
|
|
|
|
|
color: Color(0xFF2E303A),
|
|
|
|
|
fontWeight: FontWeight.w600,
|
|
|
|
|
letterSpacing: -0.4),
|
|
|
|
|
),
|
|
|
|
|
Container(
|
|
|
|
|
width: MediaQuery.of(context).size.width * 0.55,
|
|
|
|
|
child: RichText(
|
|
|
|
|
text: TextSpan(
|
|
|
|
|
text: "${LocaleKeys.verificationType.tr()} ",
|
|
|
|
|
style: TextStyle(
|
|
|
|
|
color: const Color(0xFF575757),
|
|
|
|
|
fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
|
|
|
|
|
fontFamily: 'Poppins',
|
|
|
|
|
fontWeight: FontWeight.w600,
|
|
|
|
|
letterSpacing: -0.4),
|
|
|
|
|
children: <TextSpan>[
|
|
|
|
|
TextSpan(
|
|
|
|
|
text: loginViewModel.getType(1),
|
|
|
|
|
style: TextStyle(
|
|
|
|
|
color: MyColors.darkTextColor,
|
|
|
|
|
fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
|
|
|
|
|
fontFamily: 'Poppins',
|
|
|
|
|
fontWeight: FontWeight.w600,
|
|
|
|
|
letterSpacing: -0.48),
|
|
|
|
|
)
|
|
|
|
|
]),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.end,
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
"12 NOV, 2022",
|
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
|
style: TextStyle(
|
|
|
|
|
fontFamily: 'Poppins',
|
|
|
|
|
fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 4.2,
|
|
|
|
|
color: Color(0xFF2E303A),
|
|
|
|
|
fontWeight: FontWeight.bold,
|
|
|
|
|
letterSpacing: -0.4),
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
Text(
|
|
|
|
|
"09:56 AM",
|
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
|
style: TextStyle(
|
|
|
|
|
fontFamily: 'Poppins',
|
|
|
|
|
fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
|
|
|
|
|
color: Color(0xFF2E303A),
|
|
|
|
|
fontWeight: FontWeight.w600,
|
|
|
|
|
letterSpacing: -0.4),
|
|
|
|
|
),
|
|
|
|
|
// AppText(
|
|
|
|
|
// loginViewModel.user.editedOn != null
|
|
|
|
|
// ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(loginViewModel.user.editedOn), isMonthShort: true)
|
|
|
|
|
// : loginViewModel.user.createdOn != null
|
|
|
|
|
// ? AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(loginViewModel.user.createdOn), isMonthShort: true)
|
|
|
|
|
// : '--',
|
|
|
|
|
// textAlign: TextAlign.right,
|
|
|
|
|
// fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 4.5,
|
|
|
|
|
// color: Color(0xFF2E303A),
|
|
|
|
|
// fontWeight: FontWeight.w700,
|
|
|
|
|
// letterSpacing: -0.48,
|
|
|
|
|
// ),
|
|
|
|
|
// AppText(
|
|
|
|
|
// loginViewModel.user.editedOn != null
|
|
|
|
|
// ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(loginViewModel.user.editedOn))
|
|
|
|
|
// : loginViewModel.user.createdOn != null
|
|
|
|
|
// ? AppDateUtils.getHour(AppDateUtils.convertStringToDate(loginViewModel.user.createdOn))
|
|
|
|
|
// : '--',
|
|
|
|
|
// textAlign: TextAlign.right,
|
|
|
|
|
// fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
|
|
|
|
|
// fontWeight: FontWeight.w600,
|
|
|
|
|
// letterSpacing: -0.48,
|
|
|
|
|
// color: Color(0xFF575757),
|
|
|
|
|
// )
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: SizeConfig.heightMultiplier! * 3),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
//todo add translation
|
|
|
|
|
LocaleKeys.pleaseVerify.tr().toText18().paddingOnly(left: 8),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
SizedBox(
|
|
|
|
|
height: SizeConfig.heightMultiplier! * 2,
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
|
|
|
|
|
onlySMSBox == true
|
|
|
|
|
? Container(
|
|
|
|
|
margin: const EdgeInsets.only(bottom: 20, top: 30),
|
|
|
|
|
child: LocaleKeys.pleaseVerify.tr().toText16(),
|
|
|
|
|
)
|
|
|
|
|
: LocaleKeys.pleaseVerify.tr().toText16(),
|
|
|
|
|
]),
|
|
|
|
|
isMoreOption != null && isMoreOption == false
|
|
|
|
|
? Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
|
|
|
|
|
Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
|
|
|
|
|
Expanded(
|
|
|
|
|
child: VerificationMethodsList(
|
|
|
|
|
loginViewModel: loginViewModel,
|
|
|
|
|
authMethodType: SelectedAuthMethodTypesService.getMethodsTypeService(1),
|
|
|
|
|
authenticateUser: (AuthMethodTypes authMethodType, isActive) {
|
|
|
|
|
loginViewModel.startSMSService(authMethodType, context: context);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
Expanded(
|
|
|
|
|
child: VerificationMethodsList(
|
|
|
|
|
loginViewModel: loginViewModel,
|
|
|
|
|
authMethodType: AuthMethodTypes.moreOptions,
|
|
|
|
|
onShowMore: () {
|
|
|
|
|
setState(() {
|
|
|
|
|
isMoreOption = true;
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
))
|
|
|
|
|
]),
|
|
|
|
|
])
|
|
|
|
|
: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
|
|
|
|
|
onlySMSBox == false
|
|
|
|
|
? Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
Expanded(
|
|
|
|
|
child: VerificationMethodsList(
|
|
|
|
|
loginViewModel: loginViewModel,
|
|
|
|
|
authMethodType: AuthMethodTypes.fingerPrint,
|
|
|
|
|
authenticateUser: (AuthMethodTypes authMethodType, isActive) {
|
|
|
|
|
loginViewModel.startSMSService(authMethodType, context: context);
|
|
|
|
|
},
|
|
|
|
|
)),
|
|
|
|
|
Expanded(
|
|
|
|
|
child: VerificationMethodsList(
|
|
|
|
|
loginViewModel: loginViewModel,
|
|
|
|
|
authMethodType: AuthMethodTypes.faceID,
|
|
|
|
|
authenticateUser: (AuthMethodTypes authMethodType, isActive) {
|
|
|
|
|
loginViewModel.startSMSService(authMethodType, context: context);
|
|
|
|
|
},
|
|
|
|
|
))
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
: const SizedBox(),
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: <Widget>[
|
|
|
|
|
Expanded(
|
|
|
|
|
child: VerificationMethodsList(
|
|
|
|
|
loginViewModel: loginViewModel,
|
|
|
|
|
authMethodType: AuthMethodTypes.sms,
|
|
|
|
|
authenticateUser: (AuthMethodTypes authMethodType, isActive) {
|
|
|
|
|
loginViewModel.startSMSService(authMethodType, context: context);
|
|
|
|
|
},
|
|
|
|
|
)),
|
|
|
|
|
Expanded(
|
|
|
|
|
child: VerificationMethodsList(
|
|
|
|
|
loginViewModel: loginViewModel,
|
|
|
|
|
authMethodType: AuthMethodTypes.whatsApp,
|
|
|
|
|
authenticateUser: (AuthMethodTypes authMethodType, isActive) {
|
|
|
|
|
loginViewModel.startSMSService(authMethodType, context: context);
|
|
|
|
|
},
|
|
|
|
|
))
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
]),
|
|
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
bottomSheet: !isMoreOption
|
|
|
|
|
? null
|
|
|
|
|
: Container(
|
|
|
|
|
height: 10.h,
|
|
|
|
|
|