login flow added.
parent
b5c9b83fdd
commit
6b9ea200ad
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "679409052782",
|
||||||
|
"firebase_url": "https://mohemm-dce93.firebaseio.com",
|
||||||
|
"project_id": "mohemm-dce93",
|
||||||
|
"storage_bucket": "mohemm-dce93.appspot.com"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:679409052782:android:dba155ac0859d7fea78a7f",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "hmg.cloudSolutions.mohem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "679409052782-mtd6d8rjltucnm9uatn6g7et08sm6lbv.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyDgWjuSBIKGghWxYg_KGBRIZTi-O_UA8mU"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "679409052782-mtd6d8rjltucnm9uatn6g7et08sm6lbv.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
@ -1,6 +1,17 @@
|
|||||||
package com.mohem_flutter_app
|
package com.mohem_flutter_app
|
||||||
|
|
||||||
import io.flutter.embedding.android.FlutterActivity
|
//import io.flutter.embedding.android.FlutterActivity
|
||||||
|
//
|
||||||
|
//class MainActivity: FlutterActivity() {
|
||||||
|
//}
|
||||||
|
|
||||||
class MainActivity: FlutterActivity() {
|
|
||||||
|
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||||
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
|
import io.flutter.plugins.GeneratedPluginRegistrant
|
||||||
|
|
||||||
|
class MainActivity: FlutterFragmentActivity() {
|
||||||
|
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||||
|
GeneratedPluginRegistrant.registerWith(flutterEngine)
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
class GetMobileLoginInfoListModel {
|
||||||
|
int? iD;
|
||||||
|
int? employeeID;
|
||||||
|
int? channelID;
|
||||||
|
int? companyID;
|
||||||
|
String? deviceType;
|
||||||
|
String? deviceToken;
|
||||||
|
int? language;
|
||||||
|
int? gender;
|
||||||
|
int? loginType;
|
||||||
|
String? createdOn;
|
||||||
|
String? editedOn;
|
||||||
|
String? employeeName;
|
||||||
|
bool? businessCardPrivilege;
|
||||||
|
|
||||||
|
GetMobileLoginInfoListModel(
|
||||||
|
{this.iD,
|
||||||
|
this.employeeID,
|
||||||
|
this.channelID,
|
||||||
|
this.companyID,
|
||||||
|
this.deviceType,
|
||||||
|
this.deviceToken,
|
||||||
|
this.language,
|
||||||
|
this.gender,
|
||||||
|
this.loginType,
|
||||||
|
this.createdOn,
|
||||||
|
this.editedOn,
|
||||||
|
this.employeeName,
|
||||||
|
this.businessCardPrivilege});
|
||||||
|
|
||||||
|
GetMobileLoginInfoListModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
iD = json['ID'];
|
||||||
|
employeeID = json['EmployeeID'];
|
||||||
|
channelID = json['ChannelID'];
|
||||||
|
companyID = json['CompanyID'];
|
||||||
|
deviceType = json['DeviceType'];
|
||||||
|
deviceToken = json['DeviceToken'];
|
||||||
|
language = json['Language'];
|
||||||
|
gender = json['Gender'];
|
||||||
|
loginType = json['LoginType'];
|
||||||
|
createdOn = json['CreatedOn'];
|
||||||
|
editedOn = json['EditedOn'];
|
||||||
|
employeeName = json['EmployeeName'];
|
||||||
|
businessCardPrivilege = json['BusinessCardPrivilege'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = Map<String, dynamic>();
|
||||||
|
data['ID'] = iD;
|
||||||
|
data['EmployeeID'] = employeeID;
|
||||||
|
data['ChannelID'] = channelID;
|
||||||
|
data['CompanyID'] = companyID;
|
||||||
|
data['DeviceType'] = deviceType;
|
||||||
|
data['DeviceToken'] = deviceToken;
|
||||||
|
data['Language'] = language;
|
||||||
|
data['Gender'] = gender;
|
||||||
|
data['LoginType'] = loginType;
|
||||||
|
data['CreatedOn'] = createdOn;
|
||||||
|
data['EditedOn'] = editedOn;
|
||||||
|
data['EmployeeName'] = employeeName;
|
||||||
|
data['BusinessCardPrivilege'] = businessCardPrivilege;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,750 @@
|
|||||||
|
import 'package:easy_localization/src/public_ext.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:local_auth/auth_strings.dart';
|
||||||
|
import 'package:local_auth/local_auth.dart';
|
||||||
|
import 'package:mohem_flutter_app/api/login_api_client.dart';
|
||||||
|
import 'package:mohem_flutter_app/app_state/app_state.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/dialogs/otp_dialog.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/basic_member_information_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/generic_response_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
|
||||||
|
|
||||||
|
class VerifyLastLoginScreen extends StatefulWidget {
|
||||||
|
VerifyLastLoginScreen({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_VerifyLastLoginScreenState createState() {
|
||||||
|
return _VerifyLastLoginScreenState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
|
||||||
|
final LocalAuthentication auth = LocalAuthentication();
|
||||||
|
List<BiometricType> _availableBioMetricType = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_getAvailableBiometrics();
|
||||||
|
// setDefault();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!;
|
||||||
|
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: Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: ListView(
|
||||||
|
padding: const EdgeInsets.all(21),
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
//12.height,
|
||||||
|
if (true)
|
||||||
|
Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.welcomeBack.tr().toText12(),
|
||||||
|
empName.toText24(isBold: true),
|
||||||
|
10.height,
|
||||||
|
LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText16(),
|
||||||
|
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(),
|
||||||
|
// Text(
|
||||||
|
// user.editedOn != null
|
||||||
|
// ? DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(user.editedOn))
|
||||||
|
// : user.createdOn != null
|
||||||
|
// ? DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(user.createdOn))
|
||||||
|
// : '--',
|
||||||
|
// style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48),
|
||||||
|
// ),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.verificationType.tr().toText10(color: MyColors.grey57Color),
|
||||||
|
Text(
|
||||||
|
"SMS",
|
||||||
|
// " " + getType(user.logInType, context),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Color(0xff2B353E),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(child: SizedBox()),
|
||||||
|
// Text(
|
||||||
|
// user.editedOn != null
|
||||||
|
// ? DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(user.editedOn), false)
|
||||||
|
// : user.createdOn != null
|
||||||
|
// ? DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(user.createdOn), false)
|
||||||
|
// : '--',
|
||||||
|
// style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.48),
|
||||||
|
// ),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
LocaleKeys.pleaseVerify.tr().toText16(),
|
||||||
|
GridView(
|
||||||
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13, mainAxisSpacing: 9),
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
padding: const EdgeInsets.only(top: 9),
|
||||||
|
shrinkWrap: true,
|
||||||
|
children: [
|
||||||
|
getButton(3),
|
||||||
|
getButton(2),
|
||||||
|
getButton(1),
|
||||||
|
getButton(4),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
// else
|
||||||
|
// Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
|
||||||
|
// Image.asset(
|
||||||
|
// 'assets/images/habib-logo.png',
|
||||||
|
// height: 90,
|
||||||
|
// width: 90,
|
||||||
|
// ),
|
||||||
|
// SizedBox(height: 23),
|
||||||
|
// this.onlySMSBox == false
|
||||||
|
// ? Text(
|
||||||
|
// TranslationBase.of(context).verifyLoginWith,
|
||||||
|
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.64, height: 25 / 16),
|
||||||
|
// )
|
||||||
|
// : Text(
|
||||||
|
// TranslationBase.of(context).verifyFingerprint2,
|
||||||
|
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.64, height: 25 / 16),
|
||||||
|
// ),
|
||||||
|
// SizedBox(height: 23),
|
||||||
|
// Text(
|
||||||
|
// TranslationBase.of(context).pleaseVerify,
|
||||||
|
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64),
|
||||||
|
// ),
|
||||||
|
// GridView(
|
||||||
|
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13, mainAxisSpacing: 9),
|
||||||
|
// physics: NeverScrollableScrollPhysics(),
|
||||||
|
// padding: EdgeInsets.only(top: 9),
|
||||||
|
// shrinkWrap: true,
|
||||||
|
// children: [
|
||||||
|
// if (onlySMSBox == false) getButton(3),
|
||||||
|
// if (onlySMSBox == false) getButton(2),
|
||||||
|
// getButton(1),
|
||||||
|
// getButton(4),
|
||||||
|
// ],
|
||||||
|
// ),
|
||||||
|
// ]),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
12.height,
|
||||||
|
DefaultButton(
|
||||||
|
LocaleKeys.useAnotherAccount.tr(),
|
||||||
|
() => {
|
||||||
|
//Navigator.of(context).pushNamed(LOGIN_TYPE)
|
||||||
|
},
|
||||||
|
).insideContainer,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _getAvailableBiometrics() async {
|
||||||
|
try {
|
||||||
|
_availableBioMetricType = await auth.getAvailableBiometrics();
|
||||||
|
} on PlatformException catch (e) {
|
||||||
|
// AppToast.showErrorToast(message: e.message);
|
||||||
|
print(e);
|
||||||
|
}
|
||||||
|
if (mounted) setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
|
// authenticateUser(int type, {int isActive}) {
|
||||||
|
// GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// if (type == 2 || type == 3) {
|
||||||
|
// fingrePrintBefore = type;
|
||||||
|
// }
|
||||||
|
// this.selectedOption = fingrePrintBefore != null ? fingrePrintBefore : type;
|
||||||
|
//
|
||||||
|
// switch (type) {
|
||||||
|
// case 1:
|
||||||
|
// this.loginWithSMS(type);
|
||||||
|
// break;
|
||||||
|
// case 2:
|
||||||
|
// this.loginWithFingurePrintFace(type, isActive);
|
||||||
|
// break;
|
||||||
|
// case 3:
|
||||||
|
// this.loginWithFingurePrintFace(type, isActive);
|
||||||
|
// break;
|
||||||
|
// case 4:
|
||||||
|
// this.loginWithSMS(type);
|
||||||
|
// break;
|
||||||
|
// default:
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// sharedPref.setInt(LAST_LOGIN, this.selectedOption); //this.cs.sharedService.setStorage(this.selectedOption, AuthenticationService.LAST_LOGIN);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// loginWithSMS(type) {
|
||||||
|
// //if (!el.disabled) {
|
||||||
|
// if (this.user != null && this.registerd_data == null) {
|
||||||
|
// this.checkUserAuthentication(type);
|
||||||
|
// } else {
|
||||||
|
// if (this.loginTokenID != null) {
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// this.sendActivationCode(type);
|
||||||
|
// // });
|
||||||
|
// } else {
|
||||||
|
// this.checkUserAuthentication(type);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// checkUserAuthentication(type) {
|
||||||
|
// showLoader(true);
|
||||||
|
// var req = getCommonRequest(type: type);
|
||||||
|
// req.logInTokenID = "";
|
||||||
|
//
|
||||||
|
// var request = CheckPatientAuthenticationReq.fromJson(req.toJson());
|
||||||
|
//
|
||||||
|
// sharedPref.setObject(REGISTER_DATA_FOR_REGISTER, request);
|
||||||
|
// authService
|
||||||
|
// .checkPatientAuthentication(request)
|
||||||
|
// .then((value) => {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context),
|
||||||
|
// if (value['isSMSSent'])
|
||||||
|
// {
|
||||||
|
// sharedPref.setString(LOGIN_TOKEN_ID, value['LogInTokenID']),
|
||||||
|
// this.loginTokenID = value['LogInTokenID'],
|
||||||
|
// sharedPref.setObject(REGISTER_DATA_FOR_LOGIIN, request),
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// this.sendActivationCode(type)
|
||||||
|
// // })
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// if (value['IsAuthenticated']) {this.checkActivationCode()}
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .catchError((err) {
|
||||||
|
// print(err);
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// sendActivationCode(type) async {
|
||||||
|
// var request = this.getCommonRequest(type: type);
|
||||||
|
// request.sMSSignature = await SMSOTP.getSignature();
|
||||||
|
// GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// if (healthId != null) {
|
||||||
|
// // final DateFormat dateFormat = DateFormat('MM/dd/yyyy');
|
||||||
|
// // final DateFormat dateFormat2 = DateFormat('dd/MM/yyyy');
|
||||||
|
// request.dob = dob; //isHijri == 1 ? dob : dateFormat2.format(dateFormat.parse(dob));
|
||||||
|
// request.healthId = healthId;
|
||||||
|
// request.isHijri = isHijri;
|
||||||
|
// await this.authService.sendActivationCodeRegister(request).then((result) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// if (result != null && result['isSMSSent'] == true) {
|
||||||
|
// this.startSMSService(type);
|
||||||
|
// }
|
||||||
|
// }).catchError((r) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// });
|
||||||
|
// } else {
|
||||||
|
// request.dob = "";
|
||||||
|
// request.healthId = "";
|
||||||
|
// request.isHijri = 0;
|
||||||
|
// await this.authService.sendActivationCode(request).then((result) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// if (result != null && result['isSMSSent'] == true) {
|
||||||
|
// this.startSMSService(type);
|
||||||
|
// }
|
||||||
|
// }).catchError((r) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// var tempType;
|
||||||
|
//
|
||||||
|
// startSMSService(type) {
|
||||||
|
// tempType = type;
|
||||||
|
// new SMSOTP(
|
||||||
|
// context,
|
||||||
|
// type,
|
||||||
|
// this.mobileNumber,
|
||||||
|
// (value) {
|
||||||
|
// this.checkActivationCode(value: value);
|
||||||
|
// },
|
||||||
|
// () => {
|
||||||
|
// Navigator.pop(context),
|
||||||
|
// },
|
||||||
|
// ).displayDialog(context);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// loginWithFingurePrintFace(type, int isActive) async {
|
||||||
|
// if (isActive == 1 || isActive == 0) {
|
||||||
|
// const iosStrings =
|
||||||
|
// const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID');
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// authenticated = await auth.authenticateWithBiometrics(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, iOSAuthStrings: iosStrings);
|
||||||
|
// } on PlatformException catch (e) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// AppToast.showErrorToast(message: 'Please enable your Touch or Face ID');
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (authenticated == true) {
|
||||||
|
// // if (user != null && (user.logInType == 2 || user.logInType == 3)) {
|
||||||
|
// // this.checkActivationCode();
|
||||||
|
// // } else {
|
||||||
|
//
|
||||||
|
// var request = this.getCommonRequest(type: type);
|
||||||
|
// this.getMobileInfo(request);
|
||||||
|
// //}
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// getMobileInfo(request) {
|
||||||
|
// // GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// this.authService.getLoginInfo(request).then((result) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// if (result['SMSLoginRequired'] == false) {
|
||||||
|
// this.loginTokenID = result['LogInTokenID'];
|
||||||
|
// this.patientOutSA = result['PatientOutSA'];
|
||||||
|
// // sms for register the biometric
|
||||||
|
// if (result['isSMSSent']) {
|
||||||
|
// setState(() {
|
||||||
|
// isMoreOption = true;
|
||||||
|
// this.onlySMSBox = true;
|
||||||
|
// // this.fingrePrintBefore = true;
|
||||||
|
// });
|
||||||
|
// //this.button();
|
||||||
|
// } else {
|
||||||
|
// setDefault();
|
||||||
|
// checkActivationCode();
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if (result['IsAuthenticated'] == true) {
|
||||||
|
// setState(() {
|
||||||
|
// isMoreOption = true;
|
||||||
|
// this.onlySMSBox = true;
|
||||||
|
// // this.fingrePrintBefore = true;
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }).catchError((err) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// print(err);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// setDefault() async {
|
||||||
|
// if (await sharedPref.getObject(IMEI_USER_DATA) != null) user = SelectDeviceIMEIRES.fromJson(await sharedPref.getObject(IMEI_USER_DATA));
|
||||||
|
//
|
||||||
|
// if (await sharedPref.getObject(REGISTER_DATA_FOR_LOGIIN) != null) {
|
||||||
|
// isMoreOption = true;
|
||||||
|
// this.registerd_data = CheckPatientAuthenticationReq.fromJson(await sharedPref.getObject(REGISTER_DATA_FOR_LOGIIN));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// this.mobileNumber = this.registerd_data != null ? this.registerd_data.patientMobileNumber : int.parse(this.user.mobile);
|
||||||
|
// this.zipCode = this.registerd_data != null
|
||||||
|
// ? this.registerd_data.zipCode
|
||||||
|
// : this.user.outSA == true
|
||||||
|
// ? "971"
|
||||||
|
// : "966";
|
||||||
|
// this.patientOutSA = this.registerd_data != null
|
||||||
|
// ? this.registerd_data.zipCode == "966"
|
||||||
|
// ? 0
|
||||||
|
// : 1
|
||||||
|
// : this.user.outSA;
|
||||||
|
// if (this.registerd_data != null) {
|
||||||
|
// this.loginTokenID = await sharedPref.getString(LOGIN_TOKEN_ID);
|
||||||
|
// this.loginType = this.registerd_data.searchType;
|
||||||
|
// }
|
||||||
|
// var nhic = await sharedPref.getObject(NHIC_DATA);
|
||||||
|
// if (nhic != null) {
|
||||||
|
// final DateFormat dateFormat = DateFormat('MM/dd/yyyy');
|
||||||
|
// final DateFormat dateFormat2 = DateFormat('dd/MM/yyyy');
|
||||||
|
// dob = nhic['IsHijri'] ? nhic['DateOfBirth'] : dateFormat2.format(dateFormat.parse(nhic['DateOfBirth']));
|
||||||
|
//
|
||||||
|
// isHijri = nhic['IsHijri'] ? 1 : 0;
|
||||||
|
// healthId = nhic['HealthId'];
|
||||||
|
// }
|
||||||
|
// this.deviceToken = await sharedPref.getString(PUSH_TOKEN);
|
||||||
|
// this.lastLogin = await sharedPref.getInt(LAST_LOGIN) != null
|
||||||
|
// ? await sharedPref.getInt(LAST_LOGIN)
|
||||||
|
// : user != null
|
||||||
|
// ? user.logInType
|
||||||
|
// : null;
|
||||||
|
//
|
||||||
|
// //this.cs.sharedService.getStorage(AuthenticationService.LAST_LOGIN);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// getCommonRequest({type}) {
|
||||||
|
// var request = SendActivationRequest();
|
||||||
|
// request.patientMobileNumber = this.mobileNumber;
|
||||||
|
// request.mobileNo = '0' + this.mobileNumber.toString();
|
||||||
|
// request.deviceToken = this.deviceToken;
|
||||||
|
// request.projectOutSA = this.patientOutSA == true ? true : false;
|
||||||
|
// request.loginType = this.selectedOption;
|
||||||
|
// request.oTPSendType = type == 1 ? type : 2; //this.selectedOption == 1 ? 1 : 2;
|
||||||
|
// request.zipCode = this.zipCode;
|
||||||
|
//
|
||||||
|
// request.logInTokenID = this.loginTokenID ?? "";
|
||||||
|
//
|
||||||
|
// if (this.registerd_data != null) {
|
||||||
|
// request.searchType = this.registerd_data.searchType != null ? this.registerd_data.searchType : 1;
|
||||||
|
// request.patientID = this.registerd_data.patientID != null ? this.registerd_data.patientID : 0;
|
||||||
|
// request.patientIdentificationID = request.nationalID = this.registerd_data.patientIdentificationID != null ? this.registerd_data.patientIdentificationID : '0';
|
||||||
|
//
|
||||||
|
// request.isRegister = this.registerd_data.isRegister;
|
||||||
|
// } else {
|
||||||
|
// request.searchType = request.searchType != null ? request.searchType : 2;
|
||||||
|
// request.patientID = this.user.patientID != null ? this.user.patientID : 0;
|
||||||
|
// request.nationalID = request.nationalID != null ? request.nationalID : '0';
|
||||||
|
// request.patientIdentificationID = request.patientIdentificationID != null ? request.patientIdentificationID : '0';
|
||||||
|
// request.isRegister = false;
|
||||||
|
// }
|
||||||
|
// request.deviceTypeID = request.searchType;
|
||||||
|
// return request;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // checkActivationCode({value}) async {
|
||||||
|
// // // Navigator.pop(context);
|
||||||
|
// // GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// // var request = this.getCommonRequest().toJson();
|
||||||
|
// // dynamic res;
|
||||||
|
// // if (healthId != null) {
|
||||||
|
// // request['DOB'] = dob;
|
||||||
|
// // request['HealthId'] = healthId;
|
||||||
|
// // request['IsHijri'] = isHijri;
|
||||||
|
// //
|
||||||
|
// // authService
|
||||||
|
// // .checkActivationCodeRegister(request, value)
|
||||||
|
// // .then((result) => {
|
||||||
|
// // res = result,
|
||||||
|
// // if (result is Map)
|
||||||
|
// // {
|
||||||
|
// // result = CheckActivationCode.fromJson(result),
|
||||||
|
// // if (this.registerd_data != null && this.registerd_data.isRegister == true)
|
||||||
|
// // {
|
||||||
|
// // widget.changePageViewIndex(1),
|
||||||
|
// // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew)),
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // // Navigator.of(context).pop(),
|
||||||
|
// // GifLoaderDialogUtils.hideDialog(context),
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // AppToast.showErrorToast(message: result);
|
||||||
|
// // }),
|
||||||
|
// // }
|
||||||
|
// // })
|
||||||
|
// // .catchError((err) {
|
||||||
|
// // print(err);
|
||||||
|
// // GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // AppToast.showErrorToast(message: err);
|
||||||
|
// // startSMSService(tempType);
|
||||||
|
// // });
|
||||||
|
// // });
|
||||||
|
// // } else {
|
||||||
|
// // authService
|
||||||
|
// // .checkActivationCode(request, value)
|
||||||
|
// // .then((result) => {
|
||||||
|
// // res = result,
|
||||||
|
// // if (result is Map)
|
||||||
|
// // {
|
||||||
|
// // result = CheckActivationCode.fromJson(result),
|
||||||
|
// // if (this.registerd_data != null && this.registerd_data.isRegister == true)
|
||||||
|
// // {
|
||||||
|
// // widget.changePageViewIndex(1),
|
||||||
|
// // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew)),
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // sharedPref.remove(FAMILY_FILE),
|
||||||
|
// // result.list.isFamily = false,
|
||||||
|
// // userData = result.list,
|
||||||
|
// // sharedPref.setString(BLOOD_TYPE, result.patientBloodType),
|
||||||
|
// // authenticatedUserObject.user = result.list,
|
||||||
|
// // projectViewModel.setPrivilege(privilegeList: res),
|
||||||
|
// // sharedPref.setObject(MAIN_USER, result.list),
|
||||||
|
// // sharedPref.setObject(USER_PROFILE, result.list),
|
||||||
|
// // loginTokenID = result.logInTokenID,
|
||||||
|
// // sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID),
|
||||||
|
// // sharedPref.setString(TOKEN, result.authenticationTokenID),
|
||||||
|
// // checkIfUserAgreedBefore(result),
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // // // Navigator.of(context).pop(),
|
||||||
|
// // // GifLoaderDialogUtils.hideDialog(context),
|
||||||
|
// // // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // // AppToast.showErrorToast(message: result);
|
||||||
|
// // // startSMSService(tempType);
|
||||||
|
// // // }),
|
||||||
|
// // }
|
||||||
|
// // })
|
||||||
|
// // .catchError((err) {
|
||||||
|
// // // print(err);
|
||||||
|
// // // GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// // // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // // AppToast.showErrorToast(message: err);
|
||||||
|
// // // startSMSService(tempType);
|
||||||
|
// // // });
|
||||||
|
// // });
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// // checkIfUserAgreedBefore(CheckActivationCode result) {
|
||||||
|
// // if (result.isNeedUserAgreement == true) {
|
||||||
|
// // //move to agreement page.
|
||||||
|
// // } else {
|
||||||
|
// // goToHome();
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// insertIMEI() {
|
||||||
|
// authService.insertDeviceImei(selectedOption).then((value) => {}).catchError((err) {
|
||||||
|
// print(err);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // getToDoCount() {
|
||||||
|
// // toDoProvider.setState(0, true, "0");
|
||||||
|
// // ClinicListService service = new ClinicListService();
|
||||||
|
// // service.getActiveAppointmentNo(context).then((res) {
|
||||||
|
// // if (res['MessageStatus'] == 1) {
|
||||||
|
// // toDoProvider.setState(res['AppointmentActiveNumber'], true, "0");
|
||||||
|
// // } else {}
|
||||||
|
// // }).catchError((err) {
|
||||||
|
// // print(err);
|
||||||
|
// // });
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// // goToHome() async {
|
||||||
|
// // authenticatedUserObject.isLogin = true;
|
||||||
|
// // appointmentRateViewModel.isLogin = true;
|
||||||
|
// // projectViewModel.isLogin = true;
|
||||||
|
// // projectViewModel.user = authenticatedUserObject.user;
|
||||||
|
// // await authenticatedUserObject.getUser(getUser: true);
|
||||||
|
// //
|
||||||
|
// // // getToDoCount();
|
||||||
|
// //
|
||||||
|
// // appointmentRateViewModel
|
||||||
|
// // .getIsLastAppointmentRatedList()
|
||||||
|
// // .then((value) => {
|
||||||
|
// // getToDoCount(),
|
||||||
|
// // GifLoaderDialogUtils.hideDialog(AppGlobal.context),
|
||||||
|
// // if (appointmentRateViewModel.isHaveAppointmentNotRate)
|
||||||
|
// // {
|
||||||
|
// // Navigator.pushAndRemoveUntil(
|
||||||
|
// // context,
|
||||||
|
// // FadePage(
|
||||||
|
// // page: RateAppointmentDoctor(),
|
||||||
|
// // ),
|
||||||
|
// // (r) => false)
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // Navigator.pushAndRemoveUntil(
|
||||||
|
// // context,
|
||||||
|
// // FadePage(
|
||||||
|
// // page: LandingPage(),
|
||||||
|
// // ),
|
||||||
|
// // (r) => false)
|
||||||
|
// // },
|
||||||
|
// // insertIMEI()
|
||||||
|
// // })
|
||||||
|
// // .catchError((err) {
|
||||||
|
// // print(err);
|
||||||
|
// // });
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// loading(flag) {
|
||||||
|
// // setState(() {
|
||||||
|
// // isLoading = flag;
|
||||||
|
// // });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
|
||||||
|
Future<bool> loginWithFaceIDAndBiometrics() async {
|
||||||
|
IOSAuthMessages iosStrings =
|
||||||
|
const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID');
|
||||||
|
bool authenticated = false;
|
||||||
|
try {
|
||||||
|
authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, iOSAuthStrings: iosStrings);
|
||||||
|
} on PlatformException catch (e) {
|
||||||
|
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 == 2 && !checkBiometricIsAvailable(BiometricType.fingerprint)));
|
||||||
|
print("$_title:$isDisable");
|
||||||
|
return InkWell(
|
||||||
|
onTap: isDisable
|
||||||
|
? null
|
||||||
|
: () async {
|
||||||
|
if (_flag == 0) {
|
||||||
|
setState(() {
|
||||||
|
// isMoreOption = true;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
if (_flag == 2 || _flag == 3) {
|
||||||
|
bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics();
|
||||||
|
if (authenticateWithFaceAndTouchID) {
|
||||||
|
Navigator.pushNamedAndRemoveUntil(context, AppRoutes.dashboard, (Route<dynamic> route) => false);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await LoginApiClient().checkMobileAppVersion();
|
||||||
|
await LoginApiClient().memberLogin(AppState().username!, AppState().password!);
|
||||||
|
BasicMemberInformationModel? memberInformationModel = await LoginApiClient()
|
||||||
|
.mohemmSendActivationCodeByOTPNotificationType(checkBiometricIsAvailable(BiometricType.fingerprint) ? 1 : 0, AppState().memberLoginList?.pMOBILENUMBER, _flag, AppState().username);
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
OtpDialog(
|
||||||
|
context,
|
||||||
|
_flag,
|
||||||
|
int.tryParse(AppState().memberLoginList?.pMOBILENUMBER ?? ""),
|
||||||
|
(value) async {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
try {
|
||||||
|
GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(false, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().username);
|
||||||
|
if (genericResponseModel?.errorMessage != null) {
|
||||||
|
Utils.showToast(genericResponseModel?.errorMessage ?? "");
|
||||||
|
// Navigator.pop(context);
|
||||||
|
}
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Navigator.pop(context);
|
||||||
|
Navigator.pushNamedAndRemoveUntil(context, AppRoutes.dashboard, (Route<dynamic> route) => false);
|
||||||
|
} catch (ex) {
|
||||||
|
print(ex);
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, null);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
Navigator.pop(context),
|
||||||
|
},
|
||||||
|
).displayDialog(context);
|
||||||
|
|
||||||
|
// authenticateUser(_flag, isActive: _loginIndex);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
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.toText16()
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget getButton(int flag) {
|
||||||
|
switch (flag) {
|
||||||
|
case 4:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughWhatsapp.tr(), 'assets/images/login/verify_whatsapp.svg', flag, null);
|
||||||
|
case 1:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughSMS.tr(), 'assets/images/login/verify_sms.svg', flag, null);
|
||||||
|
case 2:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughFingerprint.tr(), 'assets/images/login/verify_thumb.svg', flag, BiometricType.fingerprint.index);
|
||||||
|
case 3:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughFace.tr(), 'assets/images/login/verify_face.svg', flag, BiometricType.face.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;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// formatDate(date) {
|
||||||
|
// return date;
|
||||||
|
// return DateFormat('MMM dd, yyy, kk:mm').format(date);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// showLoader(bool isTrue) {
|
||||||
|
// setState(() {
|
||||||
|
// // isLoading = isTrue;
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
import 'package:easy_localization/src/public_ext.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
|
||||||
|
|
||||||
|
class ConfirmDialog extends StatelessWidget {
|
||||||
|
final String? title;
|
||||||
|
final String? message;
|
||||||
|
final String? okTitle;
|
||||||
|
final VoidCallback? onTap;
|
||||||
|
|
||||||
|
const ConfirmDialog({Key? key, this.title, @required this.message, this.okTitle, this.onTap}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Dialog(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
shape: RoundedRectangleBorder(),
|
||||||
|
insetPadding: EdgeInsets.only(left: 21, right: 21),
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(left: 20, right: 20, top: 18, bottom: 28),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 16.0),
|
||||||
|
child: Text(
|
||||||
|
title ?? LocaleKeys.confirm.tr(),
|
||||||
|
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: Color(0xff2B353E), height: 35 / 24, letterSpacing: -0.96),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
icon: Icon(Icons.close),
|
||||||
|
color: Color(0xff2B353E),
|
||||||
|
constraints: BoxConstraints(),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
message ?? "",
|
||||||
|
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff808080), letterSpacing: -0.48),
|
||||||
|
),
|
||||||
|
SizedBox(height: 28),
|
||||||
|
DefaultButton(
|
||||||
|
okTitle ?? LocaleKeys.ok.tr(),
|
||||||
|
onTap == null ? () => Navigator.pop(context) : onTap,
|
||||||
|
textColor: Colors.white,
|
||||||
|
//color: Ap.green,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue