From bf08417bfa70c8b21864fee8e35ca90b42f81ba8 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 18 Jan 2022 10:11:12 +0300 Subject: [PATCH 1/4] login apis and models added. --- lib/api/login_api_client.dart | 35 + lib/api/tangheem_user_api_client.dart | 36 +- lib/classes/consts.dart | 8 +- .../basic_member_information_model.dart | 32 + .../check_mobile_app_version_model.dart | 191 +++ lib/models/generic_response_model.dart | 1022 +++++++++++++++++ lib/models/member_login_list_model.dart | 48 + lib/models/member_model.dart | 62 - lib/theme/app_theme.dart | 3 + lib/ui/landing/today_attendance_screen.dart | 2 +- lib/ui/login/new_password_screen.dart | 43 +- 11 files changed, 1378 insertions(+), 104 deletions(-) create mode 100644 lib/api/login_api_client.dart create mode 100644 lib/models/basic_member_information_model.dart create mode 100644 lib/models/check_mobile_app_version_model.dart create mode 100644 lib/models/generic_response_model.dart create mode 100644 lib/models/member_login_list_model.dart delete mode 100644 lib/models/member_model.dart diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart new file mode 100644 index 0000000..be1509e --- /dev/null +++ b/lib/api/login_api_client.dart @@ -0,0 +1,35 @@ +import 'dart:async'; + +import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/member_login_list_model.dart'; +import 'package:mohem_flutter_app/models/surah_model.dart'; + +import 'api_client.dart'; + +class LoginApiClient { + static final LoginApiClient _instance = LoginApiClient._internal(); + + LoginApiClient._internal(); + + factory LoginApiClient() => _instance; + + Future checkMobileAppVersion() async { + String url = "${ApiConsts.rest}CheckMobileAppVersion"; + var postParams = {}; + return await ApiClient().postJsonForObject((json) => CheckMobileAppVersionModel.fromJson(json), url, postParams); + } + + Future memberLogin() async { + String url = "${ApiConsts.rest}MemberLogin"; + var postParams = {}; + return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json).memberLoginList, url, postParams); + } + + Future mohemmSendActivationCodeByOTPNotificationType() async { + String url = "${ApiConsts.rest}Mohemm_SendActivationCodebyOTPNotificationType"; + var postParams = {}; + return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + } +} diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart index b849141..32a5a82 100644 --- a/lib/api/tangheem_user_api_client.dart +++ b/lib/api/tangheem_user_api_client.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/models/content_info_model.dart'; -import 'package:mohem_flutter_app/models/member_model.dart'; +import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:mohem_flutter_app/models/surah_model.dart'; import 'api_client.dart'; @@ -14,21 +14,21 @@ class TangheemUserApiClient { factory TangheemUserApiClient() => _instance; - Future getSurahs() async { - String url = "${ApiConsts.tangheemUsers}AlSuar_Get"; - var postParams = {}; - return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams); - } - - Future getMembers() async { - String url = "${ApiConsts.tangheemUsers}Committee_Get"; - var postParams = {}; - return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams); - } - - Future getContentInfo(int contentId) async { - String url = "${ApiConsts.tangheemUsers}ContentInfo_Get"; - var postParams = {"contentTypeId": contentId}; - return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); - } + // Future getSurahs() async { + // String url = "${ApiConsts.tangheemUsers}AlSuar_Get"; + // var postParams = {}; + // return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams); + // } + // + // Future getMembers() async { + // String url = "${ApiConsts.tangheemUsers}Committee_Get"; + // var postParams = {}; + // return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams); + // } + // + // Future getContentInfo(int contentId) async { + // String url = "${ApiConsts.tangheemUsers}ContentInfo_Get"; + // var postParams = {"contentTypeId": contentId}; + // return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); + // } } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 0c71f0c..ecf8b40 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,11 +1,9 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = "http://20.203.25.82"; // production server - static String baseUrlServices = baseUrl + "/services/"; // production server + static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + static String baseUrlServices = baseUrl + "/services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server - static String authentication = baseUrlServices + "api/Authentication/"; - static String tangheemUsers = baseUrlServices + "api/TangheemUsers/"; - static String adminConfiguration = baseUrlServices + "api/AdminConfiguration/"; + static String rest = baseUrlServices + "Utilities.svc/REST/"; static String user = baseUrlServices + "api/User/"; } diff --git a/lib/models/basic_member_information_model.dart b/lib/models/basic_member_information_model.dart new file mode 100644 index 0000000..33b55fa --- /dev/null +++ b/lib/models/basic_member_information_model.dart @@ -0,0 +1,32 @@ +class BasicMemberInformationModel { + String? pEMAILADDRESS; + String? pLEGISLATIONCODE; + String? pMOBILENUMBER; + String? pRETURNMSG; + String? pRETURNSTATUS; + + BasicMemberInformationModel( + {this.pEMAILADDRESS, + this.pLEGISLATIONCODE, + this.pMOBILENUMBER, + this.pRETURNMSG, + this.pRETURNSTATUS}); + + BasicMemberInformationModel.fromJson(Map json) { + pEMAILADDRESS = json['P_EMAIL_ADDRESS']; + pLEGISLATIONCODE = json['P_LEGISLATION_CODE']; + pMOBILENUMBER = json['P_MOBILE_NUMBER']; + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['P_EMAIL_ADDRESS'] = this.pEMAILADDRESS; + data['P_LEGISLATION_CODE'] = this.pLEGISLATIONCODE; + data['P_MOBILE_NUMBER'] = this.pMOBILENUMBER; + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + return data; + } +} diff --git a/lib/models/check_mobile_app_version_model.dart b/lib/models/check_mobile_app_version_model.dart new file mode 100644 index 0000000..cd301d3 --- /dev/null +++ b/lib/models/check_mobile_app_version_model.dart @@ -0,0 +1,191 @@ +class CheckMobileAppVersionModel { + String? date; + int? languageID; + int? serviceName; + String? time; + String? androidLink; + String? authenticationTokenID; + String? data; + bool? dataw; + int? dietType; + int? dietTypeID; + int? errorCode; + String? errorEndUserMessage; + String? errorEndUserMessageN; + String? errorMessage; + int? errorType; + int? foodCategory; + String? iOSLink; + bool? isAuthenticated; + int? mealOrderStatus; + int? mealType; + int? messageStatus; + int? numberOfResultRecords; + String? patientBlodType; + String? successMsg; + String? successMsgN; + String? vidaUpdatedResponse; + String? encryprURL; + bool? kioskHelp; + List? listRssItems; + List? listKioskFingerPrint; + List? listKioskFingerPrintGetByID; + List? listKioskGetLastTransaction; + List? listRegKioskFingerPrint; + String? message; + String? ramadanTimeObj; + String? habibTwitterList; + + CheckMobileAppVersionModel( + {this.date, + this.languageID, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenID, + this.data, + this.dataw, + this.dietType, + this.dietTypeID, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iOSLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.vidaUpdatedResponse, + this.encryprURL, + this.kioskHelp, + this.listRssItems, + this.listKioskFingerPrint, + this.listKioskFingerPrintGetByID, + this.listKioskGetLastTransaction, + this.listRegKioskFingerPrint, + this.message, + this.ramadanTimeObj, + this.habibTwitterList}); + + CheckMobileAppVersionModel.fromJson(Map json) { + date = json['Date']; + languageID = json['LanguageID']; + serviceName = json['ServiceName']; + time = json['Time']; + androidLink = json['AndroidLink']; + authenticationTokenID = json['AuthenticationTokenID']; + data = json['Data']; + dataw = json['Dataw']; + dietType = json['DietType']; + dietTypeID = json['DietTypeID']; + errorCode = json['ErrorCode']; + errorEndUserMessage = json['ErrorEndUserMessage']; + errorEndUserMessageN = json['ErrorEndUserMessageN']; + errorMessage = json['ErrorMessage']; + errorType = json['ErrorType']; + foodCategory = json['FoodCategory']; + iOSLink = json['IOSLink']; + isAuthenticated = json['IsAuthenticated']; + mealOrderStatus = json['MealOrderStatus']; + mealType = json['MealType']; + messageStatus = json['MessageStatus']; + numberOfResultRecords = json['NumberOfResultRecords']; + patientBlodType = json['PatientBlodType']; + successMsg = json['SuccessMsg']; + successMsgN = json['SuccessMsgN']; + vidaUpdatedResponse = json['VidaUpdatedResponse']; + encryprURL = json['EncryprURL']; + kioskHelp = json['KioskHelp']; + if (json['ListRssItems'] != null) { + listRssItems = []; + json['ListRssItems'].forEach((v) { + //listRssItems!.add(new Null.fromJson(v)); + }); + } + if (json['List_Kiosk_FingerPrint'] != null) { + listKioskFingerPrint = []; + json['List_Kiosk_FingerPrint'].forEach((v) { + // listKioskFingerPrint!.add(new Null.fromJson(v)); + }); + } + if (json['List_Kiosk_FingerPrintGetByID'] != null) { + listKioskFingerPrintGetByID = []; + json['List_Kiosk_FingerPrintGetByID'].forEach((v) { + // listKioskFingerPrintGetByID!.add(new Null.fromJson(v)); + }); + } + if (json['List_Kiosk_GetLastTransaction'] != null) { + listKioskGetLastTransaction = []; + json['List_Kiosk_GetLastTransaction'].forEach((v) { + // listKioskGetLastTransaction!.add(new Null.fromJson(v)); + }); + } + if (json['List_RegKiosk_FingerPrint'] != null) { + listRegKioskFingerPrint = []; + json['List_RegKiosk_FingerPrint'].forEach((v) { + // listRegKioskFingerPrint!.add(new Null.fromJson(v)); + }); + } + message = json['Message']; + ramadanTimeObj = json['RamadanTimeObj']; + habibTwitterList = json['habibTwitterList']; + } + + Map toJson() { + final Map data = new Map(); + data['Date'] = this.date; + data['LanguageID'] = this.languageID; + data['ServiceName'] = this.serviceName; + data['Time'] = this.time; + data['AndroidLink'] = this.androidLink; + data['AuthenticationTokenID'] = this.authenticationTokenID; + data['Data'] = this.data; + data['Dataw'] = this.dataw; + data['DietType'] = this.dietType; + data['DietTypeID'] = this.dietTypeID; + data['ErrorCode'] = this.errorCode; + data['ErrorEndUserMessage'] = this.errorEndUserMessage; + data['ErrorEndUserMessageN'] = this.errorEndUserMessageN; + data['ErrorMessage'] = this.errorMessage; + data['ErrorType'] = this.errorType; + data['FoodCategory'] = this.foodCategory; + data['IOSLink'] = this.iOSLink; + data['IsAuthenticated'] = this.isAuthenticated; + data['MealOrderStatus'] = this.mealOrderStatus; + data['MealType'] = this.mealType; + data['MessageStatus'] = this.messageStatus; + data['NumberOfResultRecords'] = this.numberOfResultRecords; + data['PatientBlodType'] = this.patientBlodType; + data['SuccessMsg'] = this.successMsg; + data['SuccessMsgN'] = this.successMsgN; + data['VidaUpdatedResponse'] = this.vidaUpdatedResponse; + data['EncryprURL'] = this.encryprURL; + data['KioskHelp'] = this.kioskHelp; + if (this.listRssItems != null) { + //data['ListRssItems'] = this.listRssItems!.map((v) => v.toJson()).toList(); + } + if (this.listKioskFingerPrint != null) { + // data['List_Kiosk_FingerPrint'] = this.listKioskFingerPrint!.map((v) => v.toJson()).toList(); + } + if (this.listKioskFingerPrintGetByID != null) { + //data['List_Kiosk_FingerPrintGetByID'] = this.listKioskFingerPrintGetByID!.map((v) => v.toJson()).toList(); + } + if (this.listKioskGetLastTransaction != null) { + //data['List_Kiosk_GetLastTransaction'] = this.listKioskGetLastTransaction!.map((v) => v.toJson()).toList(); + } + if (this.listRegKioskFingerPrint != null) { + //data['List_RegKiosk_FingerPrint'] = this.listRegKioskFingerPrint!.map((v) => v.toJson()).toList(); + } + data['Message'] = this.message; + data['RamadanTimeObj'] = this.ramadanTimeObj; + data['habibTwitterList'] = this.habibTwitterList; + return data; + } +} diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart new file mode 100644 index 0000000..ac7af0f --- /dev/null +++ b/lib/models/generic_response_model.dart @@ -0,0 +1,1022 @@ +import 'package:mohem_flutter_app/models/member_login_list_model.dart'; + +import 'basic_member_information_model.dart'; + +class GenericResponseModel { + String? date; + int? languageID; + int? serviceName; + String? time; + String? androidLink; + String? authenticationTokenID; + String? data; + bool? dataw; + int? dietType; + int? dietTypeID; + String? errorCode; + String? errorEndUserMessage; + String? errorEndUserMessageN; + String? errorMessage; + int? errorType; + int? foodCategory; + String? iOSLink; + bool? isAuthenticated; + int? mealOrderStatus; + int? mealType; + int? messageStatus; + int? numberOfResultRecords; + String? patientBlodType; + String? successMsg; + String? successMsgN; + String? vidaUpdatedResponse; + String? addAttSuccessList; + String? addAttachmentList; + String? bCDomain; + String? bCLogo; + BasicMemberInformationModel? basicMemberInformation; + bool? businessCardPrivilege; + String? calculateAbsenceDuration; + String? cancelHRTransactionLIst; + String? chatEmployeeLoginList; + String? companyBadge; + String? companyImage; + String? companyImageDescription; + String? companyImageURL; + String? companyMainCompany; + String? countryList; + String? createVacationRuleList; + String? deleteAttachmentList; + String? deleteVacationRuleList; + String? disableSessionList; + String? employeeQR; + String? forgetPasswordTokenID; + List? getAbsenceAttachmentsList; + List? getAbsenceAttendanceTypesList; + List? getAbsenceCollectionNotificationBodyList; + List? getAbsenceDffStructureList; + List? getAbsenceTransactionList; + List? getAccrualBalancesList; + List? getActionHistoryList; + List? getAddressDffStructureList; + List? getAddressNotificationBodyList; + List? getApprovesList; + List? getAttachementList; + List? getAttendanceTrackingList; + List? getBasicDetColsStructureList; + List? getBasicDetDffStructureList; + List? getBasicDetNtfBodyList; + List? getCEICollectionNotificationBodyList; + List? getCEIDFFStructureList; + List? getCEITransactionList; + List? getCcpDffStructureList; + List? getCcpOutputList; + List? getCcpTransactionsList; + List? getCcpTransactionsListNew; + List? getConcurrentProgramsList; + List? getContactColsStructureList; + List? getContactDetailsList; + List? getContactDffStructureList; + List? getContactNotificationBodyList; + List? getCountriesList; + List? getDayHoursTypeDetailsList; + List? getDeductionsList; + List? getDefaultValueList; + List? getEITCollectionNotificationBodyList; + List? getEITDFFStructureList; + List? getEITTransactionList; + List? getEarningsList; + List? getEmployeeAddressList; + List? getEmployeeBasicDetailsList; + List? getEmployeeContactsList; + List? getEmployeePhonesList; + List? getEmployeeSubordinatesList; + List? getFliexfieldStructureList; + List? getHrCollectionNotificationBodyList; + List? getHrTransactionList; + List? getItemCreationNtfBodyList; + List? getItemTypeNotificationsList; + List? getItemTypesList; + List? getLookupValuesList; + List? getMenuEntriesList; + List? getMoItemHistoryList; + List? getMoNotificationBodyList; + List? getNotificationButtonsList; + List? getNotificationReassignModeList; + List? getObjectValuesList; + List? getOpenMissingSwipesList; + List? getOpenNotificationsList; + List? getOpenNotificationsNumList; + List? getOpenPeriodDatesList; + List? getOrganizationsSalariesList; + List? getPaymentInformationList; + List? getPayslipList; + List? getPendingReqDetailsList; + List? getPendingReqFunctionsList; + List? getPerformanceAppraisalList; + List? getPhonesNotificationBodyList; + List? getPoItemHistoryList; + List? getPoNotificationBodyList; + List? getPrNotificationBodyList; + List? getQuotationAnalysisList; + List? getRFCEmployeeListList; + List? getRespondAttributeValueList; + List? getSITCollectionNotificationBodyList; + List? getSITDFFStructureList; + List? getSITTransactionList; + List? getScheduleShiftsDetailsList; + List? getShiftTypesList; + List? getStampMsNotificationBodyList; + List? getStampNsNotificationBodyList; + List? getSubordinatesAttdStatusList; + List? getSubordinatesLeavesList; + List? getSubordinatesLeavesTotalVacationsList; + List? getSummaryOfPaymentList; + List? getSwipesList; + List? getTermColsStructureList; + List? getTermDffStructureList; + List? getTermNotificationBodyList; + List? getTimeCardSummaryList; + List? getUserItemTypesList; + List? getVacationRulesList; + List? getVaccinationOnHandList; + List? getVaccinationsList; + List? getValueSetValuesList; + List? getWorkList; + String? hRCertificateTemplate; + String? imgURLsList; + String? insertApInv; + String? insertBooked; + String? insertEmpSwipesList; + String? insertJournal; + String? insertOrders; + String? intPortalGetEmployeeList; + bool? isDeviceTokenEmpty; + bool? isPasswordExpired; + bool? isRegisterAllowed; + bool? isRequriedValueSetEmpty; + bool? isUserSMSExcluded; + String? itemOnHand; + String? languageAvailable; + String? listSupplier; + String? listUserAgreement; + String? listEITStrucrure; + String? listItemImagesDetails; + String? listItemMaster; + String? listMedicineDetails; + String? listMenu; + String? listNewEmployees; + String? listRadScreen; + String? logInTokenID; + String? memberInformationList; + MemberLoginListModel? memberLoginList; + String? mohemmGetBusinessCardEnabledList; + String? mohemmGetFavoriteReplacementsList; + String? mohemmGetMobileDeviceInfobyEmpInfoList; + String? mohemmGetMobileLoginInfoList; + String? mohemmGetPatientIDList; + String? mohemmITGResponseItem; + bool? mohemmIsChangeIsActiveBusinessCardEnable; + bool? mohemmIsInsertBusinessCardEnable; + String? mohemmWifiPassword; + String? mohemmWifiSSID; + String? notificationAction; + String? notificationGetRespondAttributesList; + String? notificationRespondRolesList; + int? oracleOutPutNumber; + String? pASSWORDEXPIREDMSG; + String? pCOUNTRYCODE; + String? pCOUNTRYNAME; + String? pDESCFLEXCONTEXTCODE; + String? pDESCFLEXCONTEXTNAME; + Null? pForm; + String? pINFORMATION; + int? pMBLID; + String? pNUMOFSUBORDINATES; + String? pOPENNTFNUMBER; + String? pQUESTION; + int? pSESSIONID; + String? pSchema; + String? pharmacyStockAddPharmacyStockList; + String? pharmacyStockGetOnHandList; + String? privilegeList; + String? processTransactions; + String? registerUserNameList; + String? replacementList; + String? respondAttributesList; + String? respondRolesList; + String? resubmitAbsenceTransactionList; + String? resubmitEITTransactionList; + String? resubmitHrTransactionList; + String? sFHGetPoNotificationBodyList; + String? sFHGetPrNotificationBodyList; + String? startAbsenceApprovalProccess; + String? startAddressApprovalProcessList; + String? startBasicDetApprProcessList; + String? startCeiApprovalProcess; + String? startContactApprovalProcessList; + String? startEitApprovalProcess; + String? startHrApprovalProcessList; + String? startPhonesApprovalProcessList; + String? startSitApprovalProcess; + String? startTermApprovalProcessList; + String? submitAddressTransactionList; + String? submitBasicDetTransactionList; + String? submitCEITransactionList; + String? submitCcpTransactionList; + String? submitContactTransactionList; + String? submitEITTransactionList; + String? submitHrTransactionList; + String? submitPhonesTransactionList; + String? submitSITTransactionList; + String? submitTermTransactionList; + String? subordinatesOnLeavesList; + String? sumbitAbsenceTransactionList; + String? tokenID; + String? updateAttachmentList; + String? updateEmployeeImageList; + String? updateItemTypeSuccessList; + String? updateUserItemTypesList; + String? updateVacationRuleList; + String? vHREmployeeLoginList; + String? vHRGetEmployeeDetailsList; + String? vHRGetManagersDetailsList; + String? vHRGetProjectByCodeList; + bool? vHRIsVerificationCodeValid; + String? validateAbsenceTransactionList; + String? validateEITTransactionList; + String? validatePhonesTransactionList; + String? vrItemTypesList; + String? wFLookUpList; + String? eLearningGETEMPLOYEEPROFILEList; + String? eLearningLOGINList; + String? eLearningValidateLoginList; + String? eLearningValidate_LoginList; + String? ePharmacyGetItemOnHandList; + bool? isActiveCode; + bool? isSMSSent; + + GenericResponseModel( + {this.date, + this.languageID, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenID, + this.data, + this.dataw, + this.dietType, + this.dietTypeID, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iOSLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.vidaUpdatedResponse, + this.addAttSuccessList, + this.addAttachmentList, + this.bCDomain, + this.bCLogo, + this.basicMemberInformation, + this.businessCardPrivilege, + this.calculateAbsenceDuration, + this.cancelHRTransactionLIst, + this.chatEmployeeLoginList, + this.companyBadge, + this.companyImage, + this.companyImageDescription, + this.companyImageURL, + this.companyMainCompany, + this.countryList, + this.createVacationRuleList, + this.deleteAttachmentList, + this.deleteVacationRuleList, + this.disableSessionList, + this.employeeQR, + this.forgetPasswordTokenID, + this.getAbsenceAttachmentsList, + this.getAbsenceAttendanceTypesList, + this.getAbsenceCollectionNotificationBodyList, + this.getAbsenceDffStructureList, + this.getAbsenceTransactionList, + this.getAccrualBalancesList, + this.getActionHistoryList, + this.getAddressDffStructureList, + this.getAddressNotificationBodyList, + this.getApprovesList, + this.getAttachementList, + this.getAttendanceTrackingList, + this.getBasicDetColsStructureList, + this.getBasicDetDffStructureList, + this.getBasicDetNtfBodyList, + this.getCEICollectionNotificationBodyList, + this.getCEIDFFStructureList, + this.getCEITransactionList, + this.getCcpDffStructureList, + this.getCcpOutputList, + this.getCcpTransactionsList, + this.getCcpTransactionsListNew, + this.getConcurrentProgramsList, + this.getContactColsStructureList, + this.getContactDetailsList, + this.getContactDffStructureList, + this.getContactNotificationBodyList, + this.getCountriesList, + this.getDayHoursTypeDetailsList, + this.getDeductionsList, + this.getDefaultValueList, + this.getEITCollectionNotificationBodyList, + this.getEITDFFStructureList, + this.getEITTransactionList, + this.getEarningsList, + this.getEmployeeAddressList, + this.getEmployeeBasicDetailsList, + this.getEmployeeContactsList, + this.getEmployeePhonesList, + this.getEmployeeSubordinatesList, + this.getFliexfieldStructureList, + this.getHrCollectionNotificationBodyList, + this.getHrTransactionList, + this.getItemCreationNtfBodyList, + this.getItemTypeNotificationsList, + this.getItemTypesList, + this.getLookupValuesList, + this.getMenuEntriesList, + this.getMoItemHistoryList, + this.getMoNotificationBodyList, + this.getNotificationButtonsList, + this.getNotificationReassignModeList, + this.getObjectValuesList, + this.getOpenMissingSwipesList, + this.getOpenNotificationsList, + this.getOpenNotificationsNumList, + this.getOpenPeriodDatesList, + this.getOrganizationsSalariesList, + this.getPaymentInformationList, + this.getPayslipList, + this.getPendingReqDetailsList, + this.getPendingReqFunctionsList, + this.getPerformanceAppraisalList, + this.getPhonesNotificationBodyList, + this.getPoItemHistoryList, + this.getPoNotificationBodyList, + this.getPrNotificationBodyList, + this.getQuotationAnalysisList, + this.getRFCEmployeeListList, + this.getRespondAttributeValueList, + this.getSITCollectionNotificationBodyList, + this.getSITDFFStructureList, + this.getSITTransactionList, + this.getScheduleShiftsDetailsList, + this.getShiftTypesList, + this.getStampMsNotificationBodyList, + this.getStampNsNotificationBodyList, + this.getSubordinatesAttdStatusList, + this.getSubordinatesLeavesList, + this.getSubordinatesLeavesTotalVacationsList, + this.getSummaryOfPaymentList, + this.getSwipesList, + this.getTermColsStructureList, + this.getTermDffStructureList, + this.getTermNotificationBodyList, + this.getTimeCardSummaryList, + this.getUserItemTypesList, + this.getVacationRulesList, + this.getVaccinationOnHandList, + this.getVaccinationsList, + this.getValueSetValuesList, + this.getWorkList, + this.hRCertificateTemplate, + this.imgURLsList, + this.insertApInv, + this.insertBooked, + this.insertEmpSwipesList, + this.insertJournal, + this.insertOrders, + this.intPortalGetEmployeeList, + this.isDeviceTokenEmpty, + this.isPasswordExpired, + this.isRegisterAllowed, + this.isRequriedValueSetEmpty, + this.isUserSMSExcluded, + this.itemOnHand, + this.languageAvailable, + this.listSupplier, + this.listUserAgreement, + this.listEITStrucrure, + this.listItemImagesDetails, + this.listItemMaster, + this.listMedicineDetails, + this.listMenu, + this.listNewEmployees, + this.listRadScreen, + this.logInTokenID, + this.memberInformationList, + this.memberLoginList, + this.mohemmGetBusinessCardEnabledList, + this.mohemmGetFavoriteReplacementsList, + this.mohemmGetMobileDeviceInfobyEmpInfoList, + this.mohemmGetMobileLoginInfoList, + this.mohemmGetPatientIDList, + this.mohemmITGResponseItem, + this.mohemmIsChangeIsActiveBusinessCardEnable, + this.mohemmIsInsertBusinessCardEnable, + this.mohemmWifiPassword, + this.mohemmWifiSSID, + this.notificationAction, + this.notificationGetRespondAttributesList, + this.notificationRespondRolesList, + this.oracleOutPutNumber, + this.pASSWORDEXPIREDMSG, + this.pCOUNTRYCODE, + this.pCOUNTRYNAME, + this.pDESCFLEXCONTEXTCODE, + this.pDESCFLEXCONTEXTNAME, + this.pForm, + this.pINFORMATION, + this.pMBLID, + this.pNUMOFSUBORDINATES, + this.pOPENNTFNUMBER, + this.pQUESTION, + this.pSESSIONID, + this.pSchema, + this.pharmacyStockAddPharmacyStockList, + this.pharmacyStockGetOnHandList, + this.privilegeList, + this.processTransactions, + this.registerUserNameList, + this.replacementList, + this.respondAttributesList, + this.respondRolesList, + this.resubmitAbsenceTransactionList, + this.resubmitEITTransactionList, + this.resubmitHrTransactionList, + this.sFHGetPoNotificationBodyList, + this.sFHGetPrNotificationBodyList, + this.startAbsenceApprovalProccess, + this.startAddressApprovalProcessList, + this.startBasicDetApprProcessList, + this.startCeiApprovalProcess, + this.startContactApprovalProcessList, + this.startEitApprovalProcess, + this.startHrApprovalProcessList, + this.startPhonesApprovalProcessList, + this.startSitApprovalProcess, + this.startTermApprovalProcessList, + this.submitAddressTransactionList, + this.submitBasicDetTransactionList, + this.submitCEITransactionList, + this.submitCcpTransactionList, + this.submitContactTransactionList, + this.submitEITTransactionList, + this.submitHrTransactionList, + this.submitPhonesTransactionList, + this.submitSITTransactionList, + this.submitTermTransactionList, + this.subordinatesOnLeavesList, + this.sumbitAbsenceTransactionList, + this.tokenID, + this.updateAttachmentList, + this.updateEmployeeImageList, + this.updateItemTypeSuccessList, + this.updateUserItemTypesList, + this.updateVacationRuleList, + this.vHREmployeeLoginList, + this.vHRGetEmployeeDetailsList, + this.vHRGetManagersDetailsList, + this.vHRGetProjectByCodeList, + this.vHRIsVerificationCodeValid, + this.validateAbsenceTransactionList, + this.validateEITTransactionList, + this.validatePhonesTransactionList, + this.vrItemTypesList, + this.wFLookUpList, + this.eLearningGETEMPLOYEEPROFILEList, + this.eLearningLOGINList, + this.eLearningValidateLoginList, + this.eLearningValidate_LoginList, + this.ePharmacyGetItemOnHandList, + this.isActiveCode, + this.isSMSSent}); + + GenericResponseModel.fromJson(Map json) { + date = json['Date']; + languageID = json['LanguageID']; + serviceName = json['ServiceName']; + time = json['Time']; + androidLink = json['AndroidLink']; + authenticationTokenID = json['AuthenticationTokenID']; + data = json['Data']; + dataw = json['Dataw']; + dietType = json['DietType']; + dietTypeID = json['DietTypeID']; + errorCode = json['ErrorCode']; + errorEndUserMessage = json['ErrorEndUserMessage']; + errorEndUserMessageN = json['ErrorEndUserMessageN']; + errorMessage = json['ErrorMessage']; + errorType = json['ErrorType']; + foodCategory = json['FoodCategory']; + iOSLink = json['IOSLink']; + isAuthenticated = json['IsAuthenticated']; + mealOrderStatus = json['MealOrderStatus']; + mealType = json['MealType']; + messageStatus = json['MessageStatus']; + numberOfResultRecords = json['NumberOfResultRecords']; + patientBlodType = json['PatientBlodType']; + successMsg = json['SuccessMsg']; + successMsgN = json['SuccessMsgN']; + vidaUpdatedResponse = json['VidaUpdatedResponse']; + addAttSuccessList = json['AddAttSuccessList']; + addAttachmentList = json['AddAttachment_List']; + bCDomain = json['BC_Domain']; + bCLogo = json['BC_Logo']; + basicMemberInformation = json['BasicMemberInformation'] != null ? new BasicMemberInformationModel.fromJson(json['BasicMemberInformation']) : null; + businessCardPrivilege = json['BusinessCardPrivilege']; + calculateAbsenceDuration = json['CalculateAbsenceDuration']; + cancelHRTransactionLIst = json['CancelHRTransactionLIst']; + chatEmployeeLoginList = json['Chat_EmployeeLoginList']; + companyBadge = json['CompanyBadge']; + companyImage = json['CompanyImage']; + companyImageDescription = json['CompanyImageDescription']; + companyImageURL = json['CompanyImageURL']; + companyMainCompany = json['CompanyMainCompany']; + countryList = json['CountryList']; + createVacationRuleList = json['CreateVacationRuleList']; + deleteAttachmentList = json['DeleteAttachmentList']; + deleteVacationRuleList = json['DeleteVacationRuleList']; + disableSessionList = json['DisableSessionList']; + employeeQR = json['EmployeeQR']; + forgetPasswordTokenID = json['ForgetPasswordTokenID']; + getAbsenceAttachmentsList = json['GetAbsenceAttachmentsList'].cast(); + getAbsenceAttendanceTypesList = json['GetAbsenceAttendanceTypesList'].cast(); + getAbsenceCollectionNotificationBodyList = json['GetAbsenceCollectionNotificationBodyList'].cast(); + getAbsenceDffStructureList = json['GetAbsenceDffStructureList'].cast(); + getAbsenceTransactionList = json['GetAbsenceTransactionList'].cast(); + getAccrualBalancesList = json['GetAccrualBalancesList'].cast(); + getActionHistoryList = json['GetActionHistoryList'].cast(); + getAddressDffStructureList = json['GetAddressDffStructureList'].cast(); + getAddressNotificationBodyList = json['GetAddressNotificationBodyList'].cast(); + getApprovesList = json['GetApprovesList'].cast(); + getAttachementList = json['GetAttachementList'].cast(); + getAttendanceTrackingList = json['GetAttendanceTrackingList'].cast(); + getBasicDetColsStructureList = json['GetBasicDetColsStructureList'].cast(); + getBasicDetDffStructureList = json['GetBasicDetDffStructureList'].cast(); + getBasicDetNtfBodyList = json['GetBasicDetNtfBodyList'].cast(); + getCEICollectionNotificationBodyList = json['GetCEICollectionNotificationBodyList'].cast(); + getCEIDFFStructureList = json['GetCEIDFFStructureList'].cast(); + getCEITransactionList = json['GetCEITransactionList'].cast(); + getCcpDffStructureList = json['GetCcpDffStructureList'].cast(); + getCcpOutputList = json['GetCcpOutputList'].cast(); + getCcpTransactionsList = json['GetCcpTransactionsList'].cast(); + getCcpTransactionsListNew = json['GetCcpTransactionsList_New'].cast(); + getConcurrentProgramsList = json['GetConcurrentProgramsList'].cast(); + getContactColsStructureList = json['GetContactColsStructureList'].cast(); + getContactDetailsList = json['GetContactDetailsList'].cast(); + getContactDffStructureList = json['GetContactDffStructureList'].cast(); + getContactNotificationBodyList = json['GetContactNotificationBodyList'].cast(); + getCountriesList = json['GetCountriesList'].cast(); + getDayHoursTypeDetailsList = json['GetDayHoursTypeDetailsList'].cast(); + getDeductionsList = json['GetDeductionsList'].cast(); + getDefaultValueList = json['GetDefaultValueList'].cast(); + getEITCollectionNotificationBodyList = json['GetEITCollectionNotificationBodyList'].cast(); + getEITDFFStructureList = json['GetEITDFFStructureList'].cast(); + getEITTransactionList = json['GetEITTransactionList'].cast(); + getEarningsList = json['GetEarningsList'].cast(); + getEmployeeAddressList = json['GetEmployeeAddressList'].cast(); + getEmployeeBasicDetailsList = json['GetEmployeeBasicDetailsList'].cast(); + getEmployeeContactsList = json['GetEmployeeContactsList'].cast(); + getEmployeePhonesList = json['GetEmployeePhonesList'].cast(); + getEmployeeSubordinatesList = json['GetEmployeeSubordinatesList'].cast(); + getFliexfieldStructureList = json['GetFliexfieldStructureList'].cast(); + getHrCollectionNotificationBodyList = json['GetHrCollectionNotificationBodyList'].cast(); + getHrTransactionList = json['GetHrTransactionList'].cast(); + getItemCreationNtfBodyList = json['GetItemCreationNtfBodyList'].cast(); + getItemTypeNotificationsList = json['GetItemTypeNotificationsList'].cast(); + getItemTypesList = json['GetItemTypesList'].cast(); + getLookupValuesList = json['GetLookupValuesList'].cast(); + getMenuEntriesList = json['GetMenuEntriesList'].cast(); + getMoItemHistoryList = json['GetMoItemHistoryList'].cast(); + getMoNotificationBodyList = json['GetMoNotificationBodyList'].cast(); + getNotificationButtonsList = json['GetNotificationButtonsList'].cast(); + getNotificationReassignModeList = json['GetNotificationReassignModeList'].cast(); + getObjectValuesList = json['GetObjectValuesList'].cast(); + getOpenMissingSwipesList = json['GetOpenMissingSwipesList'].cast(); + getOpenNotificationsList = json['GetOpenNotificationsList'].cast(); + getOpenNotificationsNumList = json['GetOpenNotificationsNumList'].cast(); + getOpenPeriodDatesList = json['GetOpenPeriodDatesList'].cast(); + getOrganizationsSalariesList = json['GetOrganizationsSalariesList'].cast(); + getPaymentInformationList = json['GetPaymentInformationList'].cast(); + getPayslipList = json['GetPayslipList'].cast(); + getPendingReqDetailsList = json['GetPendingReqDetailsList'].cast(); + getPendingReqFunctionsList = json['GetPendingReqFunctionsList'].cast(); + getPerformanceAppraisalList = json['GetPerformanceAppraisalList'].cast(); + getPhonesNotificationBodyList = json['GetPhonesNotificationBodyList'].cast(); + getPoItemHistoryList = json['GetPoItemHistoryList'].cast(); + getPoNotificationBodyList = json['GetPoNotificationBodyList'].cast(); + getPrNotificationBodyList = json['GetPrNotificationBodyList'].cast(); + getQuotationAnalysisList = json['GetQuotationAnalysisList'].cast(); + getRFCEmployeeListList = json['GetRFCEmployeeListList'].cast(); + getRespondAttributeValueList = json['GetRespondAttributeValueList'].cast(); + getSITCollectionNotificationBodyList = json['GetSITCollectionNotificationBodyList'].cast(); + getSITDFFStructureList = json['GetSITDFFStructureList'].cast(); + getSITTransactionList = json['GetSITTransactionList'].cast(); + getScheduleShiftsDetailsList = json['GetScheduleShiftsDetailsList'].cast(); + getShiftTypesList = json['GetShiftTypesList'].cast(); + getStampMsNotificationBodyList = json['GetStampMsNotificationBodyList'].cast(); + getStampNsNotificationBodyList = json['GetStampNsNotificationBodyList'].cast(); + getSubordinatesAttdStatusList = json['GetSubordinatesAttdStatusList'].cast(); + getSubordinatesLeavesList = json['GetSubordinatesLeavesList'].cast(); + getSubordinatesLeavesTotalVacationsList = json['GetSubordinatesLeavesTotalVacationsList'].cast(); + getSummaryOfPaymentList = json['GetSummaryOfPaymentList'].cast(); + getSwipesList = json['GetSwipesList'].cast(); + getTermColsStructureList = json['GetTermColsStructureList'].cast(); + getTermDffStructureList = json['GetTermDffStructureList'].cast(); + getTermNotificationBodyList = json['GetTermNotificationBodyList'].cast(); + getTimeCardSummaryList = json['GetTimeCardSummaryList'].cast(); + getUserItemTypesList = json['GetUserItemTypesList'].cast(); + getVacationRulesList = json['GetVacationRulesList'].cast(); + getVaccinationOnHandList = json['GetVaccinationOnHandList'].cast(); + getVaccinationsList = json['GetVaccinationsList'].cast(); + getValueSetValuesList = json['GetValueSetValuesList'].cast(); + getWorkList = json['GetWorkList'].cast(); + hRCertificateTemplate = json['HRCertificateTemplate']; + imgURLsList = json['ImgURLsList']; + insertApInv = json['InsertApInv']; + insertBooked = json['InsertBooked']; + insertEmpSwipesList = json['InsertEmpSwipesList']; + insertJournal = json['InsertJournal']; + insertOrders = json['InsertOrders']; + intPortalGetEmployeeList = json['IntPortalGetEmployeeList']; + isDeviceTokenEmpty = json['IsDeviceTokenEmpty']; + isPasswordExpired = json['IsPasswordExpired']; + isRegisterAllowed = json['IsRegisterAllowed']; + isRequriedValueSetEmpty = json['IsRequriedValueSetEmpty']; + isUserSMSExcluded = json['IsUserSMSExcluded']; + itemOnHand = json['ItemOnHand']; + languageAvailable = json['LanguageAvailable']; + listSupplier = json['ListSupplier']; + listUserAgreement = json['ListUserAgreement']; + listEITStrucrure = json['List_EITStrucrure']; + listItemImagesDetails = json['List_ItemImagesDetails']; + listItemMaster = json['List_ItemMaster']; + listMedicineDetails = json['List_MedicineDetails']; + listMenu = json['List_Menu']; + listNewEmployees = json['List_NewEmployees']; + listRadScreen = json['List_RadScreen']; + logInTokenID = json['LogInTokenID']; + memberInformationList = json['MemberInformationList']; + memberLoginList = json['MemberLoginList'] != null ? MemberLoginListModel.fromJson(json['MemberLoginList']) : null; + mohemmGetBusinessCardEnabledList = json['Mohemm_GetBusinessCardEnabledList']; + mohemmGetFavoriteReplacementsList = json['Mohemm_GetFavoriteReplacementsList']; + mohemmGetMobileDeviceInfobyEmpInfoList = json['Mohemm_GetMobileDeviceInfobyEmpInfoList']; + mohemmGetMobileLoginInfoList = json['Mohemm_GetMobileLoginInfoList']; + mohemmGetPatientIDList = json['Mohemm_GetPatientID_List']; + mohemmITGResponseItem = json['Mohemm_ITG_ResponseItem']; + mohemmIsChangeIsActiveBusinessCardEnable = json['Mohemm_IsChangeIsActiveBusinessCardEnable']; + mohemmIsInsertBusinessCardEnable = json['Mohemm_IsInsertBusinessCardEnable']; + mohemmWifiPassword = json['Mohemm_Wifi_Password']; + mohemmWifiSSID = json['Mohemm_Wifi_SSID']; + notificationAction = json['NotificationAction']; + notificationGetRespondAttributesList = json['NotificationGetRespondAttributesList']; + notificationRespondRolesList = json['NotificationRespondRolesList']; + oracleOutPutNumber = json['OracleOutPutNumber']; + pASSWORDEXPIREDMSG = json['PASSWORD_EXPIRED_MSG']; + pCOUNTRYCODE = json['P_COUNTRY_CODE']; + pCOUNTRYNAME = json['P_COUNTRY_NAME']; + pDESCFLEXCONTEXTCODE = json['P_DESC_FLEX_CONTEXT_CODE']; + pDESCFLEXCONTEXTNAME = json['P_DESC_FLEX_CONTEXT_NAME']; + pForm = json['P_Form']; + pINFORMATION = json['P_INFORMATION']; + pMBLID = json['P_MBL_ID']; + pNUMOFSUBORDINATES = json['P_NUM_OF_SUBORDINATES']; + pOPENNTFNUMBER = json['P_OPEN_NTF_NUMBER']; + pQUESTION = json['P_QUESTION']; + pSESSIONID = json['P_SESSION_ID']; + pSchema = json['P_Schema']; + pharmacyStockAddPharmacyStockList = json['PharmacyStock_AddPharmacyStockList']; + pharmacyStockGetOnHandList = json['PharmacyStock_GetOnHandList']; + privilegeList = json['Privilege_List']; + processTransactions = json['ProcessTransactions']; + registerUserNameList = json['RegisterUserNameList']; + replacementList = json['ReplacementList']; + respondAttributesList = json['RespondAttributesList']; + respondRolesList = json['RespondRolesList']; + resubmitAbsenceTransactionList = json['ResubmitAbsenceTransactionList']; + resubmitEITTransactionList = json['ResubmitEITTransactionList']; + resubmitHrTransactionList = json['ResubmitHrTransactionList']; + sFHGetPoNotificationBodyList = json['SFH_GetPoNotificationBodyList']; + sFHGetPrNotificationBodyList = json['SFH_GetPrNotificationBodyList']; + startAbsenceApprovalProccess = json['StartAbsenceApprovalProccess']; + startAddressApprovalProcessList = json['StartAddressApprovalProcessList']; + startBasicDetApprProcessList = json['StartBasicDetApprProcessList']; + startCeiApprovalProcess = json['StartCeiApprovalProcess']; + startContactApprovalProcessList = json['StartContactApprovalProcessList']; + startEitApprovalProcess = json['StartEitApprovalProcess']; + startHrApprovalProcessList = json['StartHrApprovalProcessList']; + startPhonesApprovalProcessList = json['StartPhonesApprovalProcessList']; + startSitApprovalProcess = json['StartSitApprovalProcess']; + startTermApprovalProcessList = json['StartTermApprovalProcessList']; + submitAddressTransactionList = json['SubmitAddressTransactionList']; + submitBasicDetTransactionList = json['SubmitBasicDetTransactionList']; + submitCEITransactionList = json['SubmitCEITransactionList']; + submitCcpTransactionList = json['SubmitCcpTransactionList']; + submitContactTransactionList = json['SubmitContactTransactionList']; + submitEITTransactionList = json['SubmitEITTransactionList']; + submitHrTransactionList = json['SubmitHrTransactionList']; + submitPhonesTransactionList = json['SubmitPhonesTransactionList']; + submitSITTransactionList = json['SubmitSITTransactionList']; + submitTermTransactionList = json['SubmitTermTransactionList']; + subordinatesOnLeavesList = json['SubordinatesOnLeavesList']; + sumbitAbsenceTransactionList = json['SumbitAbsenceTransactionList']; + tokenID = json['TokenID']; + updateAttachmentList = json['UpdateAttachmentList']; + updateEmployeeImageList = json['UpdateEmployeeImageList']; + updateItemTypeSuccessList = json['UpdateItemTypeSuccessList']; + updateUserItemTypesList = json['UpdateUserItemTypesList']; + updateVacationRuleList = json['UpdateVacationRuleList']; + vHREmployeeLoginList = json['VHR_EmployeeLoginList']; + vHRGetEmployeeDetailsList = json['VHR_GetEmployeeDetailsList']; + vHRGetManagersDetailsList = json['VHR_GetManagersDetailsList']; + vHRGetProjectByCodeList = json['VHR_GetProjectByCodeList']; + vHRIsVerificationCodeValid = json['VHR_IsVerificationCodeValid']; + validateAbsenceTransactionList = json['ValidateAbsenceTransactionList']; + validateEITTransactionList = json['ValidateEITTransactionList']; + validatePhonesTransactionList = json['ValidatePhonesTransactionList']; + vrItemTypesList = json['VrItemTypesList']; + wFLookUpList = json['WFLookUpList']; + eLearningGETEMPLOYEEPROFILEList = json['eLearning_GET_EMPLOYEE_PROFILEList']; + eLearningLOGINList = json['eLearning_LOGINList']; + eLearningValidateLoginList = json['eLearning_ValidateLoginList']; + eLearningValidate_LoginList = json['eLearning_Validate_LoginList']; + ePharmacyGetItemOnHandList = json['ePharmacy_GetItemOnHandList']; + isActiveCode = json['isActiveCode']; + isSMSSent = json['isSMSSent']; + } + + Map toJson() { + final Map data = new Map(); + data['Date'] = this.date; + data['LanguageID'] = this.languageID; + data['ServiceName'] = this.serviceName; + data['Time'] = this.time; + data['AndroidLink'] = this.androidLink; + data['AuthenticationTokenID'] = this.authenticationTokenID; + data['Data'] = this.data; + data['Dataw'] = this.dataw; + data['DietType'] = this.dietType; + data['DietTypeID'] = this.dietTypeID; + data['ErrorCode'] = this.errorCode; + data['ErrorEndUserMessage'] = this.errorEndUserMessage; + data['ErrorEndUserMessageN'] = this.errorEndUserMessageN; + data['ErrorMessage'] = this.errorMessage; + data['ErrorType'] = this.errorType; + data['FoodCategory'] = this.foodCategory; + data['IOSLink'] = this.iOSLink; + data['IsAuthenticated'] = this.isAuthenticated; + data['MealOrderStatus'] = this.mealOrderStatus; + data['MealType'] = this.mealType; + data['MessageStatus'] = this.messageStatus; + data['NumberOfResultRecords'] = this.numberOfResultRecords; + data['PatientBlodType'] = this.patientBlodType; + data['SuccessMsg'] = this.successMsg; + data['SuccessMsgN'] = this.successMsgN; + data['VidaUpdatedResponse'] = this.vidaUpdatedResponse; + data['AddAttSuccessList'] = this.addAttSuccessList; + data['AddAttachment_List'] = this.addAttachmentList; + data['BC_Domain'] = this.bCDomain; + data['BC_Logo'] = this.bCLogo; + if (this.basicMemberInformation != null) { + data['BasicMemberInformation'] = this.basicMemberInformation!.toJson(); + } + data['BusinessCardPrivilege'] = this.businessCardPrivilege; + data['CalculateAbsenceDuration'] = this.calculateAbsenceDuration; + data['CancelHRTransactionLIst'] = this.cancelHRTransactionLIst; + data['Chat_EmployeeLoginList'] = this.chatEmployeeLoginList; + data['CompanyBadge'] = this.companyBadge; + data['CompanyImage'] = this.companyImage; + data['CompanyImageDescription'] = this.companyImageDescription; + data['CompanyImageURL'] = this.companyImageURL; + data['CompanyMainCompany'] = this.companyMainCompany; + data['CountryList'] = this.countryList; + data['CreateVacationRuleList'] = this.createVacationRuleList; + data['DeleteAttachmentList'] = this.deleteAttachmentList; + data['DeleteVacationRuleList'] = this.deleteVacationRuleList; + data['DisableSessionList'] = this.disableSessionList; + data['EmployeeQR'] = this.employeeQR; + data['ForgetPasswordTokenID'] = this.forgetPasswordTokenID; + data['GetAbsenceAttachmentsList'] = this.getAbsenceAttachmentsList; + data['GetAbsenceAttendanceTypesList'] = this.getAbsenceAttendanceTypesList; + data['GetAbsenceCollectionNotificationBodyList'] = this.getAbsenceCollectionNotificationBodyList; + data['GetAbsenceDffStructureList'] = this.getAbsenceDffStructureList; + data['GetAbsenceTransactionList'] = this.getAbsenceTransactionList; + data['GetAccrualBalancesList'] = this.getAccrualBalancesList; + data['GetActionHistoryList'] = this.getActionHistoryList; + data['GetAddressDffStructureList'] = this.getAddressDffStructureList; + data['GetAddressNotificationBodyList'] = this.getAddressNotificationBodyList; + data['GetApprovesList'] = this.getApprovesList; + data['GetAttachementList'] = this.getAttachementList; + data['GetAttendanceTrackingList'] = this.getAttendanceTrackingList; + data['GetBasicDetColsStructureList'] = this.getBasicDetColsStructureList; + data['GetBasicDetDffStructureList'] = this.getBasicDetDffStructureList; + data['GetBasicDetNtfBodyList'] = this.getBasicDetNtfBodyList; + data['GetCEICollectionNotificationBodyList'] = this.getCEICollectionNotificationBodyList; + data['GetCEIDFFStructureList'] = this.getCEIDFFStructureList; + data['GetCEITransactionList'] = this.getCEITransactionList; + data['GetCcpDffStructureList'] = this.getCcpDffStructureList; + data['GetCcpOutputList'] = this.getCcpOutputList; + data['GetCcpTransactionsList'] = this.getCcpTransactionsList; + data['GetCcpTransactionsList_New'] = this.getCcpTransactionsListNew; + data['GetConcurrentProgramsList'] = this.getConcurrentProgramsList; + data['GetContactColsStructureList'] = this.getContactColsStructureList; + data['GetContactDetailsList'] = this.getContactDetailsList; + data['GetContactDffStructureList'] = this.getContactDffStructureList; + data['GetContactNotificationBodyList'] = this.getContactNotificationBodyList; + data['GetCountriesList'] = this.getCountriesList; + data['GetDayHoursTypeDetailsList'] = this.getDayHoursTypeDetailsList; + data['GetDeductionsList'] = this.getDeductionsList; + data['GetDefaultValueList'] = this.getDefaultValueList; + data['GetEITCollectionNotificationBodyList'] = this.getEITCollectionNotificationBodyList; + data['GetEITDFFStructureList'] = this.getEITDFFStructureList; + data['GetEITTransactionList'] = this.getEITTransactionList; + data['GetEarningsList'] = this.getEarningsList; + data['GetEmployeeAddressList'] = this.getEmployeeAddressList; + data['GetEmployeeBasicDetailsList'] = this.getEmployeeBasicDetailsList; + data['GetEmployeeContactsList'] = this.getEmployeeContactsList; + data['GetEmployeePhonesList'] = this.getEmployeePhonesList; + data['GetEmployeeSubordinatesList'] = this.getEmployeeSubordinatesList; + data['GetFliexfieldStructureList'] = this.getFliexfieldStructureList; + data['GetHrCollectionNotificationBodyList'] = this.getHrCollectionNotificationBodyList; + data['GetHrTransactionList'] = this.getHrTransactionList; + data['GetItemCreationNtfBodyList'] = this.getItemCreationNtfBodyList; + data['GetItemTypeNotificationsList'] = this.getItemTypeNotificationsList; + data['GetItemTypesList'] = this.getItemTypesList; + data['GetLookupValuesList'] = this.getLookupValuesList; + data['GetMenuEntriesList'] = this.getMenuEntriesList; + data['GetMoItemHistoryList'] = this.getMoItemHistoryList; + data['GetMoNotificationBodyList'] = this.getMoNotificationBodyList; + data['GetNotificationButtonsList'] = this.getNotificationButtonsList; + data['GetNotificationReassignModeList'] = this.getNotificationReassignModeList; + data['GetObjectValuesList'] = this.getObjectValuesList; + data['GetOpenMissingSwipesList'] = this.getOpenMissingSwipesList; + data['GetOpenNotificationsList'] = this.getOpenNotificationsList; + data['GetOpenNotificationsNumList'] = this.getOpenNotificationsNumList; + data['GetOpenPeriodDatesList'] = this.getOpenPeriodDatesList; + data['GetOrganizationsSalariesList'] = this.getOrganizationsSalariesList; + data['GetPaymentInformationList'] = this.getPaymentInformationList; + data['GetPayslipList'] = this.getPayslipList; + data['GetPendingReqDetailsList'] = this.getPendingReqDetailsList; + data['GetPendingReqFunctionsList'] = this.getPendingReqFunctionsList; + data['GetPerformanceAppraisalList'] = this.getPerformanceAppraisalList; + data['GetPhonesNotificationBodyList'] = this.getPhonesNotificationBodyList; + data['GetPoItemHistoryList'] = this.getPoItemHistoryList; + data['GetPoNotificationBodyList'] = this.getPoNotificationBodyList; + data['GetPrNotificationBodyList'] = this.getPrNotificationBodyList; + data['GetQuotationAnalysisList'] = this.getQuotationAnalysisList; + data['GetRFCEmployeeListList'] = this.getRFCEmployeeListList; + data['GetRespondAttributeValueList'] = this.getRespondAttributeValueList; + data['GetSITCollectionNotificationBodyList'] = this.getSITCollectionNotificationBodyList; + data['GetSITDFFStructureList'] = this.getSITDFFStructureList; + data['GetSITTransactionList'] = this.getSITTransactionList; + data['GetScheduleShiftsDetailsList'] = this.getScheduleShiftsDetailsList; + data['GetShiftTypesList'] = this.getShiftTypesList; + data['GetStampMsNotificationBodyList'] = this.getStampMsNotificationBodyList; + data['GetStampNsNotificationBodyList'] = this.getStampNsNotificationBodyList; + data['GetSubordinatesAttdStatusList'] = this.getSubordinatesAttdStatusList; + data['GetSubordinatesLeavesList'] = this.getSubordinatesLeavesList; + data['GetSubordinatesLeavesTotalVacationsList'] = this.getSubordinatesLeavesTotalVacationsList; + data['GetSummaryOfPaymentList'] = this.getSummaryOfPaymentList; + data['GetSwipesList'] = this.getSwipesList; + data['GetTermColsStructureList'] = this.getTermColsStructureList; + data['GetTermDffStructureList'] = this.getTermDffStructureList; + data['GetTermNotificationBodyList'] = this.getTermNotificationBodyList; + data['GetTimeCardSummaryList'] = this.getTimeCardSummaryList; + data['GetUserItemTypesList'] = this.getUserItemTypesList; + data['GetVacationRulesList'] = this.getVacationRulesList; + data['GetVaccinationOnHandList'] = this.getVaccinationOnHandList; + data['GetVaccinationsList'] = this.getVaccinationsList; + data['GetValueSetValuesList'] = this.getValueSetValuesList; + data['GetWorkList'] = this.getWorkList; + data['HRCertificateTemplate'] = this.hRCertificateTemplate; + data['ImgURLsList'] = this.imgURLsList; + data['InsertApInv'] = this.insertApInv; + data['InsertBooked'] = this.insertBooked; + data['InsertEmpSwipesList'] = this.insertEmpSwipesList; + data['InsertJournal'] = this.insertJournal; + data['InsertOrders'] = this.insertOrders; + data['IntPortalGetEmployeeList'] = this.intPortalGetEmployeeList; + data['IsDeviceTokenEmpty'] = this.isDeviceTokenEmpty; + data['IsPasswordExpired'] = this.isPasswordExpired; + data['IsRegisterAllowed'] = this.isRegisterAllowed; + data['IsRequriedValueSetEmpty'] = this.isRequriedValueSetEmpty; + data['IsUserSMSExcluded'] = this.isUserSMSExcluded; + data['ItemOnHand'] = this.itemOnHand; + data['LanguageAvailable'] = this.languageAvailable; + data['ListSupplier'] = this.listSupplier; + data['ListUserAgreement'] = this.listUserAgreement; + data['List_EITStrucrure'] = this.listEITStrucrure; + data['List_ItemImagesDetails'] = this.listItemImagesDetails; + data['List_ItemMaster'] = this.listItemMaster; + data['List_MedicineDetails'] = this.listMedicineDetails; + data['List_Menu'] = this.listMenu; + data['List_NewEmployees'] = this.listNewEmployees; + data['List_RadScreen'] = this.listRadScreen; + data['LogInTokenID'] = this.logInTokenID; + data['MemberInformationList'] = this.memberInformationList; + data['MemberLoginList'] = this.memberLoginList; + data['Mohemm_GetBusinessCardEnabledList'] = this.mohemmGetBusinessCardEnabledList; + data['Mohemm_GetFavoriteReplacementsList'] = this.mohemmGetFavoriteReplacementsList; + data['Mohemm_GetMobileDeviceInfobyEmpInfoList'] = this.mohemmGetMobileDeviceInfobyEmpInfoList; + data['Mohemm_GetMobileLoginInfoList'] = this.mohemmGetMobileLoginInfoList; + data['Mohemm_GetPatientID_List'] = this.mohemmGetPatientIDList; + data['Mohemm_ITG_ResponseItem'] = this.mohemmITGResponseItem; + data['Mohemm_IsChangeIsActiveBusinessCardEnable'] = this.mohemmIsChangeIsActiveBusinessCardEnable; + data['Mohemm_IsInsertBusinessCardEnable'] = this.mohemmIsInsertBusinessCardEnable; + data['Mohemm_Wifi_Password'] = this.mohemmWifiPassword; + data['Mohemm_Wifi_SSID'] = this.mohemmWifiSSID; + data['NotificationAction'] = this.notificationAction; + data['NotificationGetRespondAttributesList'] = this.notificationGetRespondAttributesList; + data['NotificationRespondRolesList'] = this.notificationRespondRolesList; + data['OracleOutPutNumber'] = this.oracleOutPutNumber; + data['PASSWORD_EXPIRED_MSG'] = this.pASSWORDEXPIREDMSG; + data['P_COUNTRY_CODE'] = this.pCOUNTRYCODE; + data['P_COUNTRY_NAME'] = this.pCOUNTRYNAME; + data['P_DESC_FLEX_CONTEXT_CODE'] = this.pDESCFLEXCONTEXTCODE; + data['P_DESC_FLEX_CONTEXT_NAME'] = this.pDESCFLEXCONTEXTNAME; + data['P_Form'] = this.pForm; + data['P_INFORMATION'] = this.pINFORMATION; + data['P_MBL_ID'] = this.pMBLID; + data['P_NUM_OF_SUBORDINATES'] = this.pNUMOFSUBORDINATES; + data['P_OPEN_NTF_NUMBER'] = this.pOPENNTFNUMBER; + data['P_QUESTION'] = this.pQUESTION; + data['P_SESSION_ID'] = this.pSESSIONID; + data['P_Schema'] = this.pSchema; + data['PharmacyStock_AddPharmacyStockList'] = this.pharmacyStockAddPharmacyStockList; + data['PharmacyStock_GetOnHandList'] = this.pharmacyStockGetOnHandList; + data['Privilege_List'] = this.privilegeList; + data['ProcessTransactions'] = this.processTransactions; + data['RegisterUserNameList'] = this.registerUserNameList; + data['ReplacementList'] = this.replacementList; + data['RespondAttributesList'] = this.respondAttributesList; + data['RespondRolesList'] = this.respondRolesList; + data['ResubmitAbsenceTransactionList'] = this.resubmitAbsenceTransactionList; + data['ResubmitEITTransactionList'] = this.resubmitEITTransactionList; + data['ResubmitHrTransactionList'] = this.resubmitHrTransactionList; + data['SFH_GetPoNotificationBodyList'] = this.sFHGetPoNotificationBodyList; + data['SFH_GetPrNotificationBodyList'] = this.sFHGetPrNotificationBodyList; + data['StartAbsenceApprovalProccess'] = this.startAbsenceApprovalProccess; + data['StartAddressApprovalProcessList'] = this.startAddressApprovalProcessList; + data['StartBasicDetApprProcessList'] = this.startBasicDetApprProcessList; + data['StartCeiApprovalProcess'] = this.startCeiApprovalProcess; + data['StartContactApprovalProcessList'] = this.startContactApprovalProcessList; + data['StartEitApprovalProcess'] = this.startEitApprovalProcess; + data['StartHrApprovalProcessList'] = this.startHrApprovalProcessList; + data['StartPhonesApprovalProcessList'] = this.startPhonesApprovalProcessList; + data['StartSitApprovalProcess'] = this.startSitApprovalProcess; + data['StartTermApprovalProcessList'] = this.startTermApprovalProcessList; + data['SubmitAddressTransactionList'] = this.submitAddressTransactionList; + data['SubmitBasicDetTransactionList'] = this.submitBasicDetTransactionList; + data['SubmitCEITransactionList'] = this.submitCEITransactionList; + data['SubmitCcpTransactionList'] = this.submitCcpTransactionList; + data['SubmitContactTransactionList'] = this.submitContactTransactionList; + data['SubmitEITTransactionList'] = this.submitEITTransactionList; + data['SubmitHrTransactionList'] = this.submitHrTransactionList; + data['SubmitPhonesTransactionList'] = this.submitPhonesTransactionList; + data['SubmitSITTransactionList'] = this.submitSITTransactionList; + data['SubmitTermTransactionList'] = this.submitTermTransactionList; + data['SubordinatesOnLeavesList'] = this.subordinatesOnLeavesList; + data['SumbitAbsenceTransactionList'] = this.sumbitAbsenceTransactionList; + data['TokenID'] = this.tokenID; + data['UpdateAttachmentList'] = this.updateAttachmentList; + data['UpdateEmployeeImageList'] = this.updateEmployeeImageList; + data['UpdateItemTypeSuccessList'] = this.updateItemTypeSuccessList; + data['UpdateUserItemTypesList'] = this.updateUserItemTypesList; + data['UpdateVacationRuleList'] = this.updateVacationRuleList; + data['VHR_EmployeeLoginList'] = this.vHREmployeeLoginList; + data['VHR_GetEmployeeDetailsList'] = this.vHRGetEmployeeDetailsList; + data['VHR_GetManagersDetailsList'] = this.vHRGetManagersDetailsList; + data['VHR_GetProjectByCodeList'] = this.vHRGetProjectByCodeList; + data['VHR_IsVerificationCodeValid'] = this.vHRIsVerificationCodeValid; + data['ValidateAbsenceTransactionList'] = this.validateAbsenceTransactionList; + data['ValidateEITTransactionList'] = this.validateEITTransactionList; + data['ValidatePhonesTransactionList'] = this.validatePhonesTransactionList; + data['VrItemTypesList'] = this.vrItemTypesList; + data['WFLookUpList'] = this.wFLookUpList; + data['eLearning_GET_EMPLOYEE_PROFILEList'] = this.eLearningGETEMPLOYEEPROFILEList; + data['eLearning_LOGINList'] = this.eLearningLOGINList; + data['eLearning_ValidateLoginList'] = this.eLearningValidateLoginList; + data['eLearning_Validate_LoginList'] = this.eLearningValidateLoginList; + data['ePharmacy_GetItemOnHandList'] = this.ePharmacyGetItemOnHandList; + data['isActiveCode'] = this.isActiveCode; + data['isSMSSent'] = this.isSMSSent; + return data; + } +} diff --git a/lib/models/member_login_list_model.dart b/lib/models/member_login_list_model.dart new file mode 100644 index 0000000..ffbc942 --- /dev/null +++ b/lib/models/member_login_list_model.dart @@ -0,0 +1,48 @@ +class MemberLoginListModel { + String? pEMAILADDRESS; + String? pINVALIDLOGINMSG; + String? pLEGISLATIONCODE; + String? pMOBILENUMBER; + String? pPASSOWRDEXPIRED; + String? pPASSWORDEXPIREDMSG; + String? pRETURNMSG; + String? pRETURNSTATUS; + int? pSESSIONID; + + MemberLoginListModel( + {this.pEMAILADDRESS, + this.pINVALIDLOGINMSG, + this.pLEGISLATIONCODE, + this.pMOBILENUMBER, + this.pPASSOWRDEXPIRED, + this.pPASSWORDEXPIREDMSG, + this.pRETURNMSG, + this.pRETURNSTATUS, + this.pSESSIONID}); + + MemberLoginListModel.fromJson(Map json) { + pEMAILADDRESS = json['P_EMAIL_ADDRESS']; + pINVALIDLOGINMSG = json['P_INVALID_LOGIN_MSG']; + pLEGISLATIONCODE = json['P_LEGISLATION_CODE']; + pMOBILENUMBER = json['P_MOBILE_NUMBER']; + pPASSOWRDEXPIRED = json['P_PASSOWRD_EXPIRED']; + pPASSWORDEXPIREDMSG = json['P_PASSWORD_EXPIRED_MSG']; + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + pSESSIONID = json['P_SESSION_ID']; + } + + Map toJson() { + final Map data = new Map(); + data['P_EMAIL_ADDRESS'] = this.pEMAILADDRESS; + data['P_INVALID_LOGIN_MSG'] = this.pINVALIDLOGINMSG; + data['P_LEGISLATION_CODE'] = this.pLEGISLATIONCODE; + data['P_MOBILE_NUMBER'] = this.pMOBILENUMBER; + data['P_PASSOWRD_EXPIRED'] = this.pPASSOWRDEXPIRED; + data['P_PASSWORD_EXPIRED_MSG'] = this.pPASSWORDEXPIREDMSG; + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + data['P_SESSION_ID'] = this.pSESSIONID; + return data; + } +} diff --git a/lib/models/member_model.dart b/lib/models/member_model.dart deleted file mode 100644 index d968827..0000000 --- a/lib/models/member_model.dart +++ /dev/null @@ -1,62 +0,0 @@ -class MemberModel { - int? totalItemsCount; - int? statusCode; - String? message; - List? data; - - MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data}); - - MemberModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - statusCode = json['statusCode']; - message = json['message']; - if (json['data'] != null) { - data = []; - json['data'].forEach((v) { - data?.add(new MemberDataModel.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - data['statusCode'] = this.statusCode; - data['message'] = this.message; - if (this.data != null) { - data['data'] = this.data?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class MemberDataModel { - int? committeeId; - String? firstName; - String? lastName; - String? description; - String? picture; - int? orderNo; - - MemberDataModel({this.committeeId, this.firstName, this.lastName, this.description, this.picture, this.orderNo}); - - MemberDataModel.fromJson(Map json) { - committeeId = json['committeeId']; - firstName = json['firstName']; - lastName = json['lastName']; - description = json['description']; - picture = json['picture']; - orderNo = json['orderNo']; - } - - Map toJson() { - final Map data = new Map(); - data['committeeId'] = this.committeeId; - data['firstName'] = this.firstName; - data['lastName'] = this.lastName; - data['description'] = this.description; - data['picture'] = this.picture; - data['orderNo'] = this.orderNo; - return data; - } -} diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index aed8437..c28da2f 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -15,6 +15,9 @@ class AppTheme { }, ), hintColor: Colors.grey[400], + colorScheme: ColorScheme.fromSwatch( + + ), disabledColor: Colors.grey[300], errorColor: const Color.fromRGBO(235, 80, 60, 1.0), scaffoldBackgroundColor: MyColors.backgroundColor, diff --git a/lib/ui/landing/today_attendance_screen.dart b/lib/ui/landing/today_attendance_screen.dart index 0ba3791..ac42dd1 100644 --- a/lib/ui/landing/today_attendance_screen.dart +++ b/lib/ui/landing/today_attendance_screen.dart @@ -43,7 +43,7 @@ class _TodayAttendanceScreenState extends State { children: [ Container( color: MyColors.backgroundBlackColor, - padding: EdgeInsets.only(left: 21, right: 21, bottom: 21), + padding: EdgeInsets.only(top: 4,left: 21, right: 21, bottom: 21), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/ui/login/new_password_screen.dart b/lib/ui/login/new_password_screen.dart index dca855e..5774298 100644 --- a/lib/ui/login/new_password_screen.dart +++ b/lib/ui/login/new_password_screen.dart @@ -35,32 +35,39 @@ class _NewPasswordScreenState extends State { @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), + ), + ), body: Column( children: [ - const SizedBox(height: 23), + //const SizedBox(height: 23), Expanded( child: Padding( padding: const EdgeInsets.all(21.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded(child: SizedBox()), - Row( - children: [ - LocaleKeys.english.tr().toText14(color: MyColors.textMixColor).onPress(() {}), - Container( - width: 1, - color: MyColors.darkWhiteColor, - height: 16, - margin: const EdgeInsets.only(left: 10, right: 10), - ), - LocaleKeys.arabic.tr().toText14().onPress(() {}), - ], - ), - ], - ), + // Row( + // children: [ + // Expanded(child: SizedBox()), + // Row( + // children: [ + // LocaleKeys.english.tr().toText14(color: MyColors.textMixColor).onPress(() {}), + // Container( + // width: 1, + // color: MyColors.darkWhiteColor, + // height: 16, + // margin: const EdgeInsets.only(left: 10, right: 10), + // ), + // LocaleKeys.arabic.tr().toText14().onPress(() {}), + // ], + // ), + // ], + // ), Expanded( child: Column( mainAxisSize: MainAxisSize.min, From f1beefbc46f4eacb7fd1dddeeb349b183d16e47c Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 19 Jan 2022 17:03:59 +0300 Subject: [PATCH 2/4] login apis, models & forgot password screen added. --- assets/langs/ar-SA.json | 91 +++++------ assets/langs/en-US.json | 3 + lib/api/api_client.dart | 3 +- lib/api/login_api_client.dart | 81 ++++++++-- lib/app_state/app_state.dart | 32 ++-- lib/classes/consts.dart | 3 +- lib/classes/utils.dart | 5 +- lib/config/routes.dart | 3 + lib/dialogs/otp_dialog.dart | 71 ++++----- lib/generated/codegen_loader.g.dart | 94 ++++++------ lib/main.dart | 9 +- lib/models/generic_response_model.dart | 184 +++++++++++------------ lib/models/post_params_model.dart | 34 +++++ lib/ui/login/forgot_password_screen.dart | 114 ++++++++++++++ lib/ui/login/login_screen.dart | 39 ++++- lib/ui/login/new_password_screen.dart | 3 +- lib/ui/login/verify_login_screen.dart | 22 ++- 17 files changed, 534 insertions(+), 257 deletions(-) create mode 100644 lib/models/post_params_model.dart create mode 100644 lib/ui/login/forgot_password_screen.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index fee81e6..1d9e8bc 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -2,50 +2,53 @@ "mohemm": "Mohemm", "english": "English", "arabic": "Arabic", - "login": "Login", - "pleaseEnterLoginDetails": "Please enter the detail below to login", - "username": "Username", - "password": "Password", - "welcomeBack": "Welcome back", - "wouldYouLikeToLoginWithCurrentUsername": "Would you like to login with current Username?", - "lastLoginDetails": "Last Login Details:", - "verificationType": "Verification Type:", - "pleaseVerify": "Please Verify", - "verifyThroughFace": "Verify Through Face", - "verifyThroughFingerprint": "Verify Through Fingerprint", - "verifyThroughSMS": "Verify Through SMS", - "verifyThroughWhatsapp": "Verify Through Whatsapp", - "useAnotherAccount": "Use Another Account", - "pleaseEnterTheVerificationCodeSentTo": "Please enter the verification code sent to ", - "theVerificationCodeWillExpireIn": "The verification code will expire in ", - "goodMorning": "Good Morning", - "markAttendance": "Mark Attendance", - "timeLeftToday": "Time Left Today", - "checkIn": "Check In", - "workList": "Work List", - "leaveBalance": "Leave Balance", - "missingSwipes": "Missing Swipes", - "ticketBalance": "Ticket Balance", - "other": "Other", - "services": "Services", - "viewAllServices": "View All Services", - "monthlyAttendance": "Monthly Attendance", - "workFromHome": "Work From Home", - "ticketRequest": "Ticket Request", - "viewAllOffers": "View All Offers", - "offers": "Offers & ", - "discounts": "Discounts", - "newString": "New", - "setTheNewPassword": "Set the new password", - "typeYourNewPasswordBelow": "Type your new password below", - "confirmPassword": "Confirm Password", - "update": "Update", - "title": "Title", - "home": "Home", - "mySalary": "My Salary", - "createRequest": "Create Request", - "forgotPassword": "Forgot Password", - "itemsForSale": "Items for Sale", + "login": "تسجيل الدخول", + "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", + "username": "اسم المستخدم", + "password": "كلمة المرور", + "welcomeBack": "مرحبا بعودتك", + "wouldYouLikeToLoginWithCurrentUsername": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟", + "lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:", + "verificationType": "نوع التحقق:", + "pleaseVerify": "ارجوك تحقق", + "verifyThroughFace": "تحقق من خلال الوجه", + "verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع", + "verifyThroughSMS": "تحقق من خلال الرسائل القصيرة", + "verifyThroughWhatsapp": "تحقق من خلال Whatsapp", + "useAnotherAccount": "استخدم حسابا آخر", + "pleaseEnterTheVerificationCodeSentTo": "الرجاء إدخال رمز التحقق المرسل إلى ", + "theVerificationCodeWillExpireIn": "ستنتهي صلاحية رمز التحقق في ", + "goodMorning": "صباح الخير", + "markAttendance": "علامة الحضور", + "timeLeftToday": "الوقت المتبقي اليوم", + "checkIn": "تحقق في", + "workList": "قائمة العمل", + "leaveBalance": "رصيد الاجازات", + "missingSwipes": "الضربات الشديدة في عداد المفقودين", + "ticketBalance": "رصيد التذكرة", + "other": "آخر", + "services": "خدمات", + "viewAllServices": "عرض جميع الخدمات", + "monthlyAttendance": "الحضور الشهري", + "workFromHome": "العمل من المنزل", + "ticketRequest": "طلب تذكرة", + "viewAllOffers": "مشاهدة جميع العروض", + "offers": "عروض & ", + "discounts": "الخصومات", + "newString": "جديد", + "setTheNewPassword": "قم بتعيين كلمة المرور الجديدة", + "typeYourNewPasswordBelow": "اكتب كلمة المرور الجديدة أدناه", + "confirmPassword": "تأكيد كلمة المرور", + "update": "تحديث", + "title": "عنوان", + "home": "مسكن", + "mySalary": "راتبي", + "createRequest": "إنشاء طلب", + "forgotPassword": "هل نسيت كلمة السر", + "employeeId": "هوية الموظف", + "loginCodeWillSentToMobileNumber": "الرجاء إدخال معرف الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المحمول", + "changePassword": "تغيير كلمة المرور", + "itemsForSale": "سلع للبيع", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", "clickMe": "Click me", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index fee81e6..9c812ce 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -45,6 +45,9 @@ "mySalary": "My Salary", "createRequest": "Create Request", "forgotPassword": "Forgot Password", + "employeeId": "Employee ID", + "loginCodeWillSentToMobileNumber": "Please Enter your Employee ID, A login code will be sent to your mobile number", + "changePassword": "Change Password", "itemsForSale": "Items for Sale", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index afba61e..fc289c0 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -70,6 +70,7 @@ class ApiClient { var jsonData = jsonDecode(response.body); return factoryConstructor(jsonData); } catch (ex) { + print(ex); throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); } } @@ -103,7 +104,7 @@ class ApiClient { var queryString = new Uri(queryParameters: queryParameters).query; url = url + '?' + queryString; } - var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 15)); + var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 60)); if (response.statusCode >= 200 && response.statusCode < 300) { return response; diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart index be1509e..1811414 100644 --- a/lib/api/login_api_client.dart +++ b/lib/api/login_api_client.dart @@ -1,10 +1,11 @@ import 'dart:async'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; -import 'package:mohem_flutter_app/models/surah_model.dart'; import 'api_client.dart'; @@ -16,20 +17,78 @@ class LoginApiClient { factory LoginApiClient() => _instance; Future checkMobileAppVersion() async { - String url = "${ApiConsts.rest}CheckMobileAppVersion"; - var postParams = {}; + String url = "${ApiConsts.utilitiesRest}CheckMobileAppVersion"; + Map postParams = {}; + postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) => CheckMobileAppVersionModel.fromJson(json), url, postParams); } - Future memberLogin() async { - String url = "${ApiConsts.rest}MemberLogin"; - var postParams = {}; - return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json).memberLoginList, url, postParams); + Future memberLogin(String username, String password) async { + String url = "${ApiConsts.erpRest}MemberLogin"; + Map postParams = {"P_APP_VERSION": "CS", "P_LANGUAGE": "US", "P_PASSWORD": password, "P_USER_NAME": username}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + AppState().postParamsObject?.setLogInTokenID = responseData.logInTokenID; + return responseData.memberLoginList; + }, url, postParams); } - Future mohemmSendActivationCodeByOTPNotificationType() async { - String url = "${ApiConsts.rest}Mohemm_SendActivationCodebyOTPNotificationType"; - var postParams = {}; - return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json), url, postParams); + Future mohemmSendActivationCodeByOTPNotificationType(int isMobileFingerPrint, String? mobileNumber, int optSendType, String? pUserName) async { + String url = "${ApiConsts.erpRest}Mohemm_SendActivationCodebyOTPNotificationType"; + Map postParams = {"IsMobileFingerPrint": isMobileFingerPrint, "MobileNumber": mobileNumber, "OTP_SendType": optSendType, "P_USER_NAME": pUserName}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json).basicMemberInformation, url, postParams); + } + + Future checkActivationCode(bool isDeviceNFC, String? mobileNumber, String activationCode, String? pUserName) async { + String url = "${ApiConsts.erpRest}CheckActivationCode"; + Map postParams = {"isDeviceNFC": isDeviceNFC, "MobileNumber": mobileNumber, "activationCode": activationCode, "P_USER_NAME": pUserName}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + AppState().postParamsObject?.setTokenID = responseData.tokenID; + return responseData; + }, url, postParams); + } + + Future getBasicUserInformation(String pAppVersion, String pUsername) async { + String url = "${ApiConsts.erpRest}Get_BasicUserInformation"; + Map postParams = {"P_APP_VERSION": pAppVersion, "P_USER_NAME": pUsername}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) => GenericResponseModel.fromJson(json).basicMemberInformation, url, postParams); + } + + Future sendPublicActivationCode(String? mobileNumber, String? pUsername) async { + String url = "${ApiConsts.erpRest}SendPublicActivationCode"; + Map postParams = {"MobileNumber": mobileNumber, "P_MOBILE_NUMBER": mobileNumber, "P_USER_NAME": pUsername}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + AppState().postParamsObject?.setLogInTokenID = responseData.logInTokenID; + return responseData; + }, url, postParams); + } + + Future checkPublicActivationCode(String activationCode, String? pUserName) async { + String url = "${ApiConsts.erpRest}checkPublicActivationCode"; + Map postParams = {"activationCode": activationCode, "P_USER_NAME": pUserName}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + AppState().setForgetPasswordTokenID = responseData.tokenID; + return responseData; + }, url, postParams); + } + + Future changePasswordForget(String forgetPasswordTokenID, String pNewPassword, String pConfirmNewPassword, String? pUserName) async { + String url = "${ApiConsts.erpRest}ChangePassword_Forget"; + Map postParams = {"P_USER_NAME": pUserName, "ForgetPasswordTokenID": forgetPasswordTokenID, "P_Confirm_NEW_PASSWORD": pConfirmNewPassword, "P_NEW_PASSWORD": pNewPassword}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + + return responseData; + }, url, postParams); } } diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 9303802..2af87d8 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -1,5 +1,5 @@ -import 'package:mohem_flutter_app/models/content_info_model.dart'; -import 'package:mohem_flutter_app/models/surah_model.dart'; +import 'package:mohem_flutter_app/models/member_login_list_model.dart'; +import 'package:mohem_flutter_app/models/post_params_model.dart'; class AppState { static final AppState _instance = AppState._internal(); @@ -8,19 +8,29 @@ class AppState { factory AppState() => _instance; - SurahModel? _surahModel; + String? forgetPasswordTokenID; - SurahModel? get getSurahModel => _surahModel; + set setForgetPasswordTokenID(token) => forgetPasswordTokenID = token; - void setSurahModel(SurahModel _surahModel) { - this._surahModel = _surahModel; - } + String? get getForgetPasswordTokenID => forgetPasswordTokenID; + + PostParamsModel? _postParams; - ContentInfoDataModel? _copyRight; + PostParamsModel? get postParamsObject => _postParams; - ContentInfoDataModel? get getContentInfoModel => _copyRight; + Map get postParamsJson => _postParams?.toJson() ?? {}; - void setContentInfoModel(ContentInfoDataModel _copyRight) { - this._copyRight = _copyRight; + void setPostParamsModel(PostParamsModel _postParams) { + this._postParams = _postParams; } + + String? username; + + set setUserName(_username) => username = _username; + + MemberLoginListModel? _memberLoginList; + + MemberLoginListModel? get memberLoginList => _memberLoginList; + + set setMemberLoginListModel(MemberLoginListModel? _memberLoginList) => this._memberLoginList = _memberLoginList; } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index ecf8b40..b0453c0 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -3,7 +3,8 @@ class ApiConsts { static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server static String baseUrlServices = baseUrl + "/services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server - static String rest = baseUrlServices + "Utilities.svc/REST/"; + static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; + static String erpRest = baseUrlServices + "ERP.svc/REST/"; static String user = baseUrlServices + "api/User/"; } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 4d26ed6..94fd87b 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; // import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart'; @@ -9,8 +10,8 @@ class Utils { static bool get isLoading => _isLoadingVisible; static void showToast(String message) { - // Fluttertoast.showToast( - // msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 1, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0); + Fluttertoast.showToast( + msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 1, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0); } static dynamic getNotNullValue(List list, int index) { diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 4e72b26..39a4ebc 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/ui/landing/dashboard.dart'; import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/login/forgot_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/login_screen.dart'; import 'package:mohem_flutter_app/ui/login/new_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; @@ -13,6 +14,7 @@ class AppRoutes { static const String loginVerifyAccount = "/loginVerifyAccount"; static const String login = "/login"; static const String verifyLogin = "/verifyLogin"; + static const String forgotPassword = "/forgotPassword"; static const String newPassword = "/newPassword"; static const String loginVerification = "/loginVerification"; static const String dashboard = "/dashboard"; @@ -28,6 +30,7 @@ class AppRoutes { verifyLogin: (context) => VerifyLoginScreen(), dashboard: (context) => Dashboard(), newPassword: (context) => NewPasswordScreen(), + forgotPassword: (context) => ForgotPasswordScreen(), todayAttendance: (context) => TodayAttendanceScreen(), //Work List diff --git a/lib/dialogs/otp_dialog.dart b/lib/dialogs/otp_dialog.dart index f589211..d82cf9c 100644 --- a/lib/dialogs/otp_dialog.dart +++ b/lib/dialogs/otp_dialog.dart @@ -11,7 +11,7 @@ import 'package:mohem_flutter_app/widgets/otp_widget.dart'; class OtpDialog { final int type; - final int mobileNo; + final int? mobileNo; final Function(String) onSuccess; final Function onFailure; final BuildContext context; @@ -57,10 +57,11 @@ class OtpDialog { String displayTime = ''; String? _code; dynamic setState; + bool stopTimer = false; // static String signature; - displayDialog(BuildContext context) async { + void displayDialog(BuildContext context) async { return showDialog( context: context, barrierColor: Colors.black.withOpacity(0.63), @@ -68,8 +69,8 @@ class OtpDialog { // projectProvider = Provider.of(context); return Dialog( backgroundColor: Colors.white, - shape: RoundedRectangleBorder(), - insetPadding: EdgeInsets.only(left: 21, right: 21), + shape: const RoundedRectangleBorder(), + insetPadding: const EdgeInsets.only(left: 21, right: 21), child: StatefulBuilder(builder: (context, setState) { if (displayTime == '') { startTimer(setState); @@ -91,14 +92,13 @@ class OtpDialog { width: 50, ), IconButton( - padding: EdgeInsets.zero, - icon: const Icon(Icons.close), - constraints: const BoxConstraints(), - onPressed: () { - Navigator.pop(context); - this.onFailure(); - }, - ) + padding: EdgeInsets.zero, + icon: const Icon(Icons.close), + constraints: const BoxConstraints(), + onPressed: () { + stopTimer = true; + onFailure(); + }) ], ), 22.height, @@ -150,22 +150,20 @@ class OtpDialog { InputDecoration buildInputDecoration(BuildContext context) { return InputDecoration( counterText: " ", - // ts/images/password_icon.png - // contentPadding: EdgeInsets.only(top: 20, bottom: 20), - enabledBorder: OutlineInputBorder( + enabledBorder: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10)), borderSide: BorderSide(color: Colors.black), ), focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderRadius: const BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(color: Theme.of(context).primaryColor), ), errorBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderRadius: const BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(color: Theme.of(context).errorColor), ), focusedErrorBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(10.0)), + borderRadius: const BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(color: Theme.of(context).errorColor), ), ); @@ -181,33 +179,27 @@ class OtpDialog { // } // } - checkValue() { - //print(verifyAccountFormValue); - // if (verifyAccountForm?.currentState!.validate()) { - // onSuccess(digit1.text.toString() + digit2.text.toString() + digit3.text.toString() + digit4.text.toString()); - // } - } - - getSecondsAsDigitalClock(int inputSeconds) { - var sec_num = int.parse(inputSeconds.toString()); // don't forget the second param - var hours = (sec_num / 3600).floor(); - var minutes = ((sec_num - hours * 3600) / 60).floor(); - var seconds = sec_num - hours * 3600 - minutes * 60; - var minutesString = ""; - var secondsString = ""; + String getSecondsAsDigitalClock(int inputSeconds) { + int secNum = int.parse(inputSeconds.toString()); // don't forget the second param + int hours = (secNum / 3600).floor(); + int minutes = ((secNum - hours * 3600) / 60).floor(); + double seconds = secNum - hours * 3600 - minutes * 60; + String minutesString = ""; + String secondsString = ""; minutesString = minutes < 10 ? "0" + minutes.toString() : minutes.toString(); - secondsString = seconds < 10 ? "0" + seconds.toString() : seconds.toString(); + secondsString = seconds < 10 ? "0" + seconds.toStringAsFixed(0) : seconds.toStringAsFixed(0); return minutesString + ":" + secondsString; } - startTimer(setState) { - this.remainingTime--; + void startTimer(setState) { + remainingTime--; + if (stopTimer) return; setState(() { - displayTime = this.getSecondsAsDigitalClock(this.remainingTime); + displayTime = getSecondsAsDigitalClock(remainingTime); }); - timer = Future.delayed(Duration(seconds: 1), () { - if (this.remainingTime > 0) { + timer = Future.delayed(const Duration(seconds: 1), () { + if (remainingTime > 0) { startTimer(setState); } else { Navigator.pop(context); @@ -219,8 +211,9 @@ class OtpDialog { Navigator.pop(context); } - _onOtpCallBack(String otpCode, bool? isAutofill) { + void _onOtpCallBack(String otpCode, bool? isAutofill) { if (otpCode.length == 4) { + stopTimer = true; onSuccess(otpCode); } } diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 9829f4c..b43f3bd 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -18,50 +18,53 @@ class CodegenLoader extends AssetLoader{ "mohemm": "Mohemm", "english": "English", "arabic": "Arabic", - "login": "Login", - "pleaseEnterLoginDetails": "Please enter the detail below to login", - "username": "Username", - "password": "Password", - "welcomeBack": "Welcome back", - "wouldYouLikeToLoginWithCurrentUsername": "Would you like to login with current Username?", - "lastLoginDetails": "Last Login Details:", - "verificationType": "Verification Type:", - "pleaseVerify": "Please Verify", - "verifyThroughFace": "Verify Through Face", - "verifyThroughFingerprint": "Verify Through Fingerprint", - "verifyThroughSMS": "Verify Through SMS", - "verifyThroughWhatsapp": "Verify Through Whatsapp", - "useAnotherAccount": "Use Another Account", - "pleaseEnterTheVerificationCodeSentTo": "Please enter the verification code sent to ", - "theVerificationCodeWillExpireIn": "The verification code will expire in ", - "goodMorning": "Good Morning", - "markAttendance": "Mark Attendance", - "timeLeftToday": "Time Left Today", - "checkIn": "Check In", - "workList": "Work List", - "leaveBalance": "Leave Balance", - "missingSwipes": "Missing Swipes", - "ticketBalance": "Ticket Balance", - "other": "Other", - "services": "Services", - "viewAllServices": "View All Services", - "monthlyAttendance": "Monthly Attendance", - "workFromHome": "Work From Home", - "ticketRequest": "Ticket Request", - "viewAllOffers": "View All Offers", - "offers": "Offers & ", - "discounts": "Discounts", - "newString": "New", - "setTheNewPassword": "Set the new password", - "typeYourNewPasswordBelow": "Type your new password below", - "confirmPassword": "Confirm Password", - "update": "Update", - "title": "Title", - "home": "Home", - "mySalary": "My Salary", - "createRequest": "Create Request", - "forgotPassword": "Forgot Password", - "itemsForSale": "Items for Sale", + "login": "تسجيل الدخول", + "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", + "username": "اسم المستخدم", + "password": "كلمة المرور", + "welcomeBack": "مرحبا بعودتك", + "wouldYouLikeToLoginWithCurrentUsername": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟", + "lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:", + "verificationType": "نوع التحقق:", + "pleaseVerify": "ارجوك تحقق", + "verifyThroughFace": "تحقق من خلال الوجه", + "verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع", + "verifyThroughSMS": "تحقق من خلال الرسائل القصيرة", + "verifyThroughWhatsapp": "تحقق من خلال Whatsapp", + "useAnotherAccount": "استخدم حسابا آخر", + "pleaseEnterTheVerificationCodeSentTo": "الرجاء إدخال رمز التحقق المرسل إلى ", + "theVerificationCodeWillExpireIn": "ستنتهي صلاحية رمز التحقق في ", + "goodMorning": "صباح الخير", + "markAttendance": "علامة الحضور", + "timeLeftToday": "الوقت المتبقي اليوم", + "checkIn": "تحقق في", + "workList": "قائمة العمل", + "leaveBalance": "رصيد الاجازات", + "missingSwipes": "الضربات الشديدة في عداد المفقودين", + "ticketBalance": "رصيد التذكرة", + "other": "آخر", + "services": "خدمات", + "viewAllServices": "عرض جميع الخدمات", + "monthlyAttendance": "الحضور الشهري", + "workFromHome": "العمل من المنزل", + "ticketRequest": "طلب تذكرة", + "viewAllOffers": "مشاهدة جميع العروض", + "offers": "عروض & ", + "discounts": "الخصومات", + "newString": "جديد", + "setTheNewPassword": "قم بتعيين كلمة المرور الجديدة", + "typeYourNewPasswordBelow": "اكتب كلمة المرور الجديدة أدناه", + "confirmPassword": "تأكيد كلمة المرور", + "update": "تحديث", + "title": "عنوان", + "home": "مسكن", + "mySalary": "راتبي", + "createRequest": "إنشاء طلب", + "forgotPassword": "هل نسيت كلمة السر", + "employeeId": "هوية الموظف", + "loginCodeWillSentToMobileNumber": "الرجاء إدخال معرف الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المحمول", + "changePassword": "تغيير كلمة المرور", + "itemsForSale": "سلع للبيع", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", "clickMe": "Click me", @@ -147,6 +150,9 @@ static const Map en_US = { "mySalary": "My Salary", "createRequest": "Create Request", "forgotPassword": "Forgot Password", + "employeeId": "Employee ID", + "loginCodeWillSentToMobileNumber": "Please Enter your Employee ID, A login code will be sent to your mobile number", + "changePassword": "Change Password", "itemsForSale": "Items for Sale", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", diff --git a/lib/main.dart b/lib/main.dart index b118397..99cff95 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,11 @@ +import 'dart:io'; + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/config/app_provider.dart'; import 'package:mohem_flutter_app/generated/codegen_loader.g.dart'; +import 'package:mohem_flutter_app/models/post_params_model.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; import 'package:sizer/sizer.dart'; @@ -12,7 +16,7 @@ Future main() async { await EasyLocalization.ensureInitialized(); runApp( EasyLocalization( - supportedLocales: [ + supportedLocales: const [ Locale('en', 'US'), Locale('ar', 'SA'), ], @@ -39,6 +43,9 @@ class MyApp extends StatelessWidget { return AppProvider( child: Sizer( builder: (context, orientation, deviceType) { + AppState().setPostParamsModel( + PostParamsModel(languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2, channel: 31, versionID: 3.2, mobileType: Platform.isAndroid ? "android" : "ios"), + ); return MaterialApp( theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), debugShowCheckedModeBanner: false, diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index ac7af0f..5bfa4fc 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -556,98 +556,98 @@ class GenericResponseModel { disableSessionList = json['DisableSessionList']; employeeQR = json['EmployeeQR']; forgetPasswordTokenID = json['ForgetPasswordTokenID']; - getAbsenceAttachmentsList = json['GetAbsenceAttachmentsList'].cast(); - getAbsenceAttendanceTypesList = json['GetAbsenceAttendanceTypesList'].cast(); - getAbsenceCollectionNotificationBodyList = json['GetAbsenceCollectionNotificationBodyList'].cast(); - getAbsenceDffStructureList = json['GetAbsenceDffStructureList'].cast(); - getAbsenceTransactionList = json['GetAbsenceTransactionList'].cast(); - getAccrualBalancesList = json['GetAccrualBalancesList'].cast(); - getActionHistoryList = json['GetActionHistoryList'].cast(); - getAddressDffStructureList = json['GetAddressDffStructureList'].cast(); - getAddressNotificationBodyList = json['GetAddressNotificationBodyList'].cast(); - getApprovesList = json['GetApprovesList'].cast(); - getAttachementList = json['GetAttachementList'].cast(); - getAttendanceTrackingList = json['GetAttendanceTrackingList'].cast(); - getBasicDetColsStructureList = json['GetBasicDetColsStructureList'].cast(); - getBasicDetDffStructureList = json['GetBasicDetDffStructureList'].cast(); - getBasicDetNtfBodyList = json['GetBasicDetNtfBodyList'].cast(); - getCEICollectionNotificationBodyList = json['GetCEICollectionNotificationBodyList'].cast(); - getCEIDFFStructureList = json['GetCEIDFFStructureList'].cast(); - getCEITransactionList = json['GetCEITransactionList'].cast(); - getCcpDffStructureList = json['GetCcpDffStructureList'].cast(); - getCcpOutputList = json['GetCcpOutputList'].cast(); - getCcpTransactionsList = json['GetCcpTransactionsList'].cast(); - getCcpTransactionsListNew = json['GetCcpTransactionsList_New'].cast(); - getConcurrentProgramsList = json['GetConcurrentProgramsList'].cast(); - getContactColsStructureList = json['GetContactColsStructureList'].cast(); - getContactDetailsList = json['GetContactDetailsList'].cast(); - getContactDffStructureList = json['GetContactDffStructureList'].cast(); - getContactNotificationBodyList = json['GetContactNotificationBodyList'].cast(); - getCountriesList = json['GetCountriesList'].cast(); - getDayHoursTypeDetailsList = json['GetDayHoursTypeDetailsList'].cast(); - getDeductionsList = json['GetDeductionsList'].cast(); - getDefaultValueList = json['GetDefaultValueList'].cast(); - getEITCollectionNotificationBodyList = json['GetEITCollectionNotificationBodyList'].cast(); - getEITDFFStructureList = json['GetEITDFFStructureList'].cast(); - getEITTransactionList = json['GetEITTransactionList'].cast(); - getEarningsList = json['GetEarningsList'].cast(); - getEmployeeAddressList = json['GetEmployeeAddressList'].cast(); - getEmployeeBasicDetailsList = json['GetEmployeeBasicDetailsList'].cast(); - getEmployeeContactsList = json['GetEmployeeContactsList'].cast(); - getEmployeePhonesList = json['GetEmployeePhonesList'].cast(); - getEmployeeSubordinatesList = json['GetEmployeeSubordinatesList'].cast(); - getFliexfieldStructureList = json['GetFliexfieldStructureList'].cast(); - getHrCollectionNotificationBodyList = json['GetHrCollectionNotificationBodyList'].cast(); - getHrTransactionList = json['GetHrTransactionList'].cast(); - getItemCreationNtfBodyList = json['GetItemCreationNtfBodyList'].cast(); - getItemTypeNotificationsList = json['GetItemTypeNotificationsList'].cast(); - getItemTypesList = json['GetItemTypesList'].cast(); - getLookupValuesList = json['GetLookupValuesList'].cast(); - getMenuEntriesList = json['GetMenuEntriesList'].cast(); - getMoItemHistoryList = json['GetMoItemHistoryList'].cast(); - getMoNotificationBodyList = json['GetMoNotificationBodyList'].cast(); - getNotificationButtonsList = json['GetNotificationButtonsList'].cast(); - getNotificationReassignModeList = json['GetNotificationReassignModeList'].cast(); - getObjectValuesList = json['GetObjectValuesList'].cast(); - getOpenMissingSwipesList = json['GetOpenMissingSwipesList'].cast(); - getOpenNotificationsList = json['GetOpenNotificationsList'].cast(); - getOpenNotificationsNumList = json['GetOpenNotificationsNumList'].cast(); - getOpenPeriodDatesList = json['GetOpenPeriodDatesList'].cast(); - getOrganizationsSalariesList = json['GetOrganizationsSalariesList'].cast(); - getPaymentInformationList = json['GetPaymentInformationList'].cast(); - getPayslipList = json['GetPayslipList'].cast(); - getPendingReqDetailsList = json['GetPendingReqDetailsList'].cast(); - getPendingReqFunctionsList = json['GetPendingReqFunctionsList'].cast(); - getPerformanceAppraisalList = json['GetPerformanceAppraisalList'].cast(); - getPhonesNotificationBodyList = json['GetPhonesNotificationBodyList'].cast(); - getPoItemHistoryList = json['GetPoItemHistoryList'].cast(); - getPoNotificationBodyList = json['GetPoNotificationBodyList'].cast(); - getPrNotificationBodyList = json['GetPrNotificationBodyList'].cast(); - getQuotationAnalysisList = json['GetQuotationAnalysisList'].cast(); - getRFCEmployeeListList = json['GetRFCEmployeeListList'].cast(); - getRespondAttributeValueList = json['GetRespondAttributeValueList'].cast(); - getSITCollectionNotificationBodyList = json['GetSITCollectionNotificationBodyList'].cast(); - getSITDFFStructureList = json['GetSITDFFStructureList'].cast(); - getSITTransactionList = json['GetSITTransactionList'].cast(); - getScheduleShiftsDetailsList = json['GetScheduleShiftsDetailsList'].cast(); - getShiftTypesList = json['GetShiftTypesList'].cast(); - getStampMsNotificationBodyList = json['GetStampMsNotificationBodyList'].cast(); - getStampNsNotificationBodyList = json['GetStampNsNotificationBodyList'].cast(); - getSubordinatesAttdStatusList = json['GetSubordinatesAttdStatusList'].cast(); - getSubordinatesLeavesList = json['GetSubordinatesLeavesList'].cast(); - getSubordinatesLeavesTotalVacationsList = json['GetSubordinatesLeavesTotalVacationsList'].cast(); - getSummaryOfPaymentList = json['GetSummaryOfPaymentList'].cast(); - getSwipesList = json['GetSwipesList'].cast(); - getTermColsStructureList = json['GetTermColsStructureList'].cast(); - getTermDffStructureList = json['GetTermDffStructureList'].cast(); - getTermNotificationBodyList = json['GetTermNotificationBodyList'].cast(); - getTimeCardSummaryList = json['GetTimeCardSummaryList'].cast(); - getUserItemTypesList = json['GetUserItemTypesList'].cast(); - getVacationRulesList = json['GetVacationRulesList'].cast(); - getVaccinationOnHandList = json['GetVaccinationOnHandList'].cast(); - getVaccinationsList = json['GetVaccinationsList'].cast(); - getValueSetValuesList = json['GetValueSetValuesList'].cast(); - getWorkList = json['GetWorkList'].cast(); + getAbsenceAttachmentsList = json['GetAbsenceAttachmentsList']; + getAbsenceAttendanceTypesList = json['GetAbsenceAttendanceTypesList']; + getAbsenceCollectionNotificationBodyList = json['GetAbsenceCollectionNotificationBodyList']; + getAbsenceDffStructureList = json['GetAbsenceDffStructureList']; + getAbsenceTransactionList = json['GetAbsenceTransactionList']; + getAccrualBalancesList = json['GetAccrualBalancesList']; + getActionHistoryList = json['GetActionHistoryList']; + getAddressDffStructureList = json['GetAddressDffStructureList']; + getAddressNotificationBodyList = json['GetAddressNotificationBodyList']; + getApprovesList = json['GetApprovesList']; + getAttachementList = json['GetAttachementList']; + getAttendanceTrackingList = json['GetAttendanceTrackingList']; + getBasicDetColsStructureList = json['GetBasicDetColsStructureList']; + getBasicDetDffStructureList = json['GetBasicDetDffStructureList']; + getBasicDetNtfBodyList = json['GetBasicDetNtfBodyList']; + getCEICollectionNotificationBodyList = json['GetCEICollectionNotificationBodyList']; + getCEIDFFStructureList = json['GetCEIDFFStructureList']; + getCEITransactionList = json['GetCEITransactionList']; + getCcpDffStructureList = json['GetCcpDffStructureList']; + getCcpOutputList = json['GetCcpOutputList']; + getCcpTransactionsList = json['GetCcpTransactionsList']; + getCcpTransactionsListNew = json['GetCcpTransactionsList_New']; + getConcurrentProgramsList = json['GetConcurrentProgramsList']; + getContactColsStructureList = json['GetContactColsStructureList']; + getContactDetailsList = json['GetContactDetailsList']; + getContactDffStructureList = json['GetContactDffStructureList']; + getContactNotificationBodyList = json['GetContactNotificationBodyList']; + getCountriesList = json['GetCountriesList']; + getDayHoursTypeDetailsList = json['GetDayHoursTypeDetailsList']; + getDeductionsList = json['GetDeductionsList']; + getDefaultValueList = json['GetDefaultValueList']; + getEITCollectionNotificationBodyList = json['GetEITCollectionNotificationBodyList']; + getEITDFFStructureList = json['GetEITDFFStructureList']; + getEITTransactionList = json['GetEITTransactionList']; + getEarningsList = json['GetEarningsList']; + getEmployeeAddressList = json['GetEmployeeAddressList']; + getEmployeeBasicDetailsList = json['GetEmployeeBasicDetailsList']; + getEmployeeContactsList = json['GetEmployeeContactsList']; + getEmployeePhonesList = json['GetEmployeePhonesList']; + getEmployeeSubordinatesList = json['GetEmployeeSubordinatesList']; + getFliexfieldStructureList = json['GetFliexfieldStructureList']; + getHrCollectionNotificationBodyList = json['GetHrCollectionNotificationBodyList']; + getHrTransactionList = json['GetHrTransactionList']; + getItemCreationNtfBodyList = json['GetItemCreationNtfBodyList']; + getItemTypeNotificationsList = json['GetItemTypeNotificationsList']; + getItemTypesList = json['GetItemTypesList']; + getLookupValuesList = json['GetLookupValuesList']; + getMenuEntriesList = json['GetMenuEntriesList']; + getMoItemHistoryList = json['GetMoItemHistoryList']; + getMoNotificationBodyList = json['GetMoNotificationBodyList']; + getNotificationButtonsList = json['GetNotificationButtonsList']; + getNotificationReassignModeList = json['GetNotificationReassignModeList']; + getObjectValuesList = json['GetObjectValuesList']; + getOpenMissingSwipesList = json['GetOpenMissingSwipesList']; + getOpenNotificationsList = json['GetOpenNotificationsList']; + getOpenNotificationsNumList = json['GetOpenNotificationsNumList']; + getOpenPeriodDatesList = json['GetOpenPeriodDatesList']; + getOrganizationsSalariesList = json['GetOrganizationsSalariesList']; + getPaymentInformationList = json['GetPaymentInformationList']; + getPayslipList = json['GetPayslipList']; + getPendingReqDetailsList = json['GetPendingReqDetailsList']; + getPendingReqFunctionsList = json['GetPendingReqFunctionsList']; + getPerformanceAppraisalList = json['GetPerformanceAppraisalList']; + getPhonesNotificationBodyList = json['GetPhonesNotificationBodyList']; + getPoItemHistoryList = json['GetPoItemHistoryList']; + getPoNotificationBodyList = json['GetPoNotificationBodyList']; + getPrNotificationBodyList = json['GetPrNotificationBodyList']; + getQuotationAnalysisList = json['GetQuotationAnalysisList']; + getRFCEmployeeListList = json['GetRFCEmployeeListList']; + getRespondAttributeValueList = json['GetRespondAttributeValueList']; + getSITCollectionNotificationBodyList = json['GetSITCollectionNotificationBodyList']; + getSITDFFStructureList = json['GetSITDFFStructureList']; + getSITTransactionList = json['GetSITTransactionList']; + getScheduleShiftsDetailsList = json['GetScheduleShiftsDetailsList']; + getShiftTypesList = json['GetShiftTypesList']; + getStampMsNotificationBodyList = json['GetStampMsNotificationBodyList']; + getStampNsNotificationBodyList = json['GetStampNsNotificationBodyList']; + getSubordinatesAttdStatusList = json['GetSubordinatesAttdStatusList']; + getSubordinatesLeavesList = json['GetSubordinatesLeavesList']; + getSubordinatesLeavesTotalVacationsList = json['GetSubordinatesLeavesTotalVacationsList']; + getSummaryOfPaymentList = json['GetSummaryOfPaymentList']; + getSwipesList = json['GetSwipesList']; + getTermColsStructureList = json['GetTermColsStructureList']; + getTermDffStructureList = json['GetTermDffStructureList']; + getTermNotificationBodyList = json['GetTermNotificationBodyList']; + getTimeCardSummaryList = json['GetTimeCardSummaryList']; + getUserItemTypesList = json['GetUserItemTypesList']; + getVacationRulesList = json['GetVacationRulesList']; + getVaccinationOnHandList = json['GetVaccinationOnHandList']; + getVaccinationsList = json['GetVaccinationsList']; + getValueSetValuesList = json['GetValueSetValuesList']; + getWorkList = json['GetWorkList']; hRCertificateTemplate = json['HRCertificateTemplate']; imgURLsList = json['ImgURLsList']; insertApInv = json['InsertApInv']; diff --git a/lib/models/post_params_model.dart b/lib/models/post_params_model.dart new file mode 100644 index 0000000..cd6dd72 --- /dev/null +++ b/lib/models/post_params_model.dart @@ -0,0 +1,34 @@ +class PostParamsModel { + double? versionID; + int? channel; + int? languageID; + String? mobileType; + String? logInTokenID; + String? tokenID; + + PostParamsModel({this.versionID, this.channel, this.languageID, this.mobileType, this.logInTokenID, this.tokenID}); + + PostParamsModel.fromJson(Map json) { + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + mobileType = json['MobileType']; + logInTokenID = json['LogInTokenID']; + tokenID = json['TokenID']; + } + + Map toJson() { + final Map data = new Map(); + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['MobileType'] = this.mobileType; + data['LogInTokenID'] = this.logInTokenID; + data['TokenID'] = this.tokenID; + return data; + } + + set setLogInTokenID(String? token) => logInTokenID = token; + + set setTokenID(String? token) => tokenID = token; +} diff --git a/lib/ui/login/forgot_password_screen.dart b/lib/ui/login/forgot_password_screen.dart new file mode 100644 index 0000000..89bd66e --- /dev/null +++ b/lib/ui/login/forgot_password_screen.dart @@ -0,0 +1,114 @@ +import 'package:easy_localization/src/public_ext.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/login_api_client.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/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'; +import 'package:mohem_flutter_app/widgets/input_widget.dart'; + +class ForgotPasswordScreen extends StatefulWidget { + ForgotPasswordScreen({Key? key}) : super(key: key); + + @override + _ForgotPasswordScreenState createState() { + return _ForgotPasswordScreenState(); + } +} + +class _ForgotPasswordScreenState extends State { + TextEditingController employeeId = TextEditingController(); + BasicMemberInformationModel? _basicMemberInformation; + GenericResponseModel? genericResponseModel; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + void performLogin() async { + // Utils.showLoading(context); + try { + _basicMemberInformation = await LoginApiClient().getBasicUserInformation("CS", employeeId.text); + genericResponseModel = await LoginApiClient().sendPublicActivationCode(_basicMemberInformation?.pMOBILENUMBER, employeeId.text); + OtpDialog( + context, + 1, + int.tryParse(_basicMemberInformation?.pMOBILENUMBER ?? ""), + (value) async { + GenericResponseModel? genericResponseModel = await LoginApiClient().checkPublicActivationCode(value, employeeId.text); + if (genericResponseModel?.errorMessage != null) { + Utils.showToast(genericResponseModel?.errorMessage ?? ""); + return; + } + + Navigator.pushNamed(context, AppRoutes.newPassword); + // this.checkActivationCode(value: value); + }, + () => { + Navigator.pop(context), + }, + ).displayDialog(context); + } catch (ex) { + print(ex); + Utils.handleException(ex, null); + // Utils.hideLoading(context); + } + } + + @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), + ), + ), + body: Column( + children: [ + //const SizedBox(height: 23), + Expanded( + child: Padding( + padding: const EdgeInsets.all(21.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + LocaleKeys.forgotPassword.tr().toText24(isBold: true), + LocaleKeys.loginCodeWillSentToMobileNumber.tr().toText16(), + 16.height, + InputWidget(LocaleKeys.employeeId.tr(), "123456", employeeId), + ], + ), + ) + ], + ), + ), + ), + DefaultButton(LocaleKeys.changePassword.tr(), () async { + //Navigator.pushNamed(context, AppRoutes.verifyLogin); + }) + .insideContainer + ], + ), + ); + } +} diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index f7f8e05..1db57f1 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -2,12 +2,18 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.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/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/check_mobile_app_version_model.dart'; +import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart'; @@ -24,6 +30,9 @@ class _LoginScreenState extends State { TextEditingController username = TextEditingController(); TextEditingController password = TextEditingController(); + CheckMobileAppVersionModel? _checkMobileAppVersion; + MemberLoginListModel? _memberLoginList; + @override void initState() { super.initState(); @@ -34,6 +43,23 @@ class _LoginScreenState extends State { super.dispose(); } + void performLogin() async { + // Utils.showLoading(context); + try { + _checkMobileAppVersion = await LoginApiClient().checkMobileAppVersion(); + _memberLoginList = await LoginApiClient().memberLogin(username.text, password.text); + AppState().setMemberLoginListModel = _memberLoginList; + AppState().username = username.text; + print(_memberLoginList?.toJson()); + // Utils.hideLoading(context); + Navigator.pushNamed(context, AppRoutes.verifyLogin); + } catch (ex) { + print(ex); + Utils.handleException(ex, null); + // Utils.hideLoading(context); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -51,14 +77,18 @@ class _LoginScreenState extends State { Expanded(child: SizedBox()), Row( children: [ - LocaleKeys.english.tr().toText14(color: MyColors.textMixColor).onPress(() {}), + LocaleKeys.english.tr().toText14(color: MyColors.textMixColor).onPress(() { + context.setLocale(const Locale("en", "US")); + }), Container( width: 1, color: MyColors.darkWhiteColor, height: 16, margin: const EdgeInsets.only(left: 10, right: 10), ), - LocaleKeys.arabic.tr().toText14().onPress(() {}), + LocaleKeys.arabic.tr().toText14().onPress(() { + context.setLocale(const Locale("ar", "SA")); + }), ], ), ], @@ -79,7 +109,7 @@ class _LoginScreenState extends State { Align( alignment: Alignment.centerRight, child: LocaleKeys.forgotPassword.tr().toText12(isUnderLine: true, color: MyColors.textMixColor).onPress(() { - Navigator.pushNamed(context, AppRoutes.newPassword); + Navigator.pushNamed(context, AppRoutes.forgotPassword); }), ), ], @@ -92,7 +122,8 @@ class _LoginScreenState extends State { DefaultButton(LocaleKeys.login.tr(), () async { // context.setLocale(const Locale("en", "US")); // to change Loacle - Navigator.pushNamed(context, AppRoutes.verifyLogin); + SystemChannels.textInput.invokeMethod('TextInput.hide'); + performLogin(); }).insideContainer ], ), diff --git a/lib/ui/login/new_password_screen.dart b/lib/ui/login/new_password_screen.dart index 5774298..3fc37f1 100644 --- a/lib/ui/login/new_password_screen.dart +++ b/lib/ui/login/new_password_screen.dart @@ -88,9 +88,8 @@ class _NewPasswordScreenState extends State { ), ), DefaultButton(LocaleKeys.update.tr(), () async { - // context.setLocale(const Locale("en", "US")); // to change Loacle - Navigator.pushNamed(context, AppRoutes.verifyLogin); + // Navigator.pushNamed(context, AppRoutes.verifyLogin); }).insideContainer ], ), diff --git a/lib/ui/login/verify_login_screen.dart b/lib/ui/login/verify_login_screen.dart index 54be916..26b978f 100644 --- a/lib/ui/login/verify_login_screen.dart +++ b/lib/ui/login/verify_login_screen.dart @@ -3,13 +3,18 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.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 VerifyLoginScreen extends StatefulWidget { @@ -613,19 +618,26 @@ class _VerifyLoginScreenState extends State { return InkWell( onTap: isDisable ? null - : () { + : () async { if (_flag == 0) { setState(() { // isMoreOption = true; }); } else { + BasicMemberInformationModel? memberInformationModel = await LoginApiClient() + .mohemmSendActivationCodeByOTPNotificationType(checkBiometricIsAvailable(BiometricType.fingerprint) ? 1 : 0, AppState().memberLoginList?.pMOBILENUMBER, _flag, AppState().username); OtpDialog( context, _flag, - //this.mobileNumber - 0554870506, - (value) { - Navigator.pushReplacementNamed(context, AppRoutes.dashboard); + int.tryParse(AppState().memberLoginList?.pMOBILENUMBER ?? ""), + (value) async { + GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(false, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().username); + if (genericResponseModel?.errorMessage != null) { + Utils.showToast(genericResponseModel?.errorMessage ?? ""); + // Navigator.pop(context); + } + + Navigator.pushNamedAndRemoveUntil(context, AppRoutes.dashboard, (Route route) => false); // this.checkActivationCode(value: value); }, () => { From e3d331a223800c723f9cc9f95c2bb2018a1b2785 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 24 Jan 2022 14:59:23 +0300 Subject: [PATCH 3/4] loading icon added --- assets/images/logos/loading_mohemm_logo.gif | Bin 0 -> 97273 bytes lib/classes/utils.dart | 15 ++++--- lib/ui/login/login_screen.dart | 6 +-- lib/widgets/loading_dialog.dart | 47 ++++++++++++++++++++ 4 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 assets/images/logos/loading_mohemm_logo.gif create mode 100644 lib/widgets/loading_dialog.dart diff --git a/assets/images/logos/loading_mohemm_logo.gif b/assets/images/logos/loading_mohemm_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffefdb00a07c0c906a5e135a3ca82b631d1f2f5f GIT binary patch literal 97273 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]i;9t#<8;Rg6K9PhQ# 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

D+*e(F$VD`)4@PH9li6;PfX6cLGk zW%vJf9Ivr10ip&Gr2l|7EKK(ByVG>F+D@e-)Sbhh4-mE|A6OKMQ;WdUMFYBjM*e>! z8^X5uv5ic$_g#8Wej0NeisTH*K%xKAd+1G)oi&m=kk}y7wF}EVhhQiRf@v+N4M+`- zb;Ch#DnL&nGnmZ04JZ)!-iYWaag(EtU`3vXuHZ0_dm1GY4`Hv+81B^&txS8q?8mT? z2Vr2NDhpgXlodhF3*w2`s^jQdKpdnQ*J%%sDG@%Z?}pv}6d1|L@jkBa5XT#0DL3I< zX&nX;hNw@l2-+!ykZ??!>Wr4U*_SCsazL@F5WxcuO6bVq2LgtCxIq z9HSwESgSO}>yFm@DXs)gqml!HAjT8-$03{(F>^Uw4=0UD(H0kATY0dCqG~!-D!w02 zvZzg(NtYPR+mt#tl}^&q>_cj`RSGQ-^bu_JZ1kD^Xu5W{8#WLSuba94_}S_A1m@aI z8euFZ)wI6oIIAy@Uv#^bjV1`G`BuhePy<2Z5<&QT8FtxeXwU3Bt_%fyC#A_J;-9jq zz7gKuAgGmcc-9k@BXWkX@!z%QOmjJj!;%k2 z+vTpEG z)>Lgz*CFm`-?LTsPdWBnIo`NZ#aP;irq8)I{+WC4OE5E=%rxPe4#sH7R4O{_TFkp_ zH34I_XIKPxQF%YEGkkeeNT!taaKq8Vx9GSQN2Cs_$m_#?Yx2p@_;I_7Mvt59lw-!V zUkkp1P9F5-hQp>>kWrnz$#UiJb>$1+VnKD?p%+y&9#!@Mm0!CH4v(v9@v1#e%H+kW z64)yqZ2(c!ZjzIQYWH*=At&~sbTxER)ucAn)N&PZj^*K!rDXn(Q;h6%0j?q-_slG# zSG<)D=u)Dv+PFM3HX6Skf9c{n8(GKTG^yIy3B@c&sN#tiIyzs8yQHPA?B0UF+M?b< zy)KE8t;z|{eFIq3tjb zDBB32GntioOJ9o2_kGKz-bkX7O_pGKcH%>|Sr+c-5IfvV_pzDq z&dc7hBA+hx^}SBZsX_AvuPbhEsdKuNKt9xbA&?n!vYq{wqb_|%S61RQ&Lz8L^0s0q z4oN25rg$1CLf`WC78wvp{4CIbf)9z++sd0zuU?_3OAnPr0*+PMSO`m12(k>X+Ff3^ zydrG3*=!V?0?8%(OUYgGLx`jsjT7?36+3Nn0{l9 zbBx!B?bY!K>`b~VSE1@A749a7bSXNu`SZ4XAL|}D$%C+T;Kg=+t?Nw0!43|DRt5Id z&^H=7y;7A9S6=OA`O)2y(3yPKb*0!t(%jp3+7Z#~PU6%x;si(Xb@(RqS@yi_s;?tl z#3sLo417%J5l-j^5SVuA_FG#uG$-`q-3(mh^~H3_d%-|EclP_z16g++gVQMn6$6-K z`?dUjYvbOjY4xDMclf}8Uw3`3^*xbPeGq(<3L6TWs7IRbo!p0h2H*hB0_xzjm-r5G ztT8BQHApSfTe{i$0)e_x2QU}B3k_^{bMk!asK>R%##1n~QQy!wGKlF7g&2nSH3qUZ zy3G8wC1==3VFZwc0hz5~+|wa?AmD2Wk)E7XhPz0kvGZVj2v3)aLM647@AhX5P((3fG$?W79=z0@cUoyKnGy92tXzKUm zpXHg4YGXEi<3SBWNvDoyCX*m2U>z_&#xSm=IlnvOexsS?h{ElgnMa(Bdtt7lg>lr- zM0kyp+h?;!#&N{`Zja!gLx$P@zAlPJIMp^ZD3pkvahmZ@bDPPu<~`;6VP)V$`1`w{ zxj(TzX6N=4FpyRMlI;1o)WRH-9LPy_ zSutrrNptuSaVa)@HMwfsN;X*Q&+>!Q3f}Wo#zlexG){xiGLmTNm-Mvid0o7zT`~)v z|M{9V@rV6uonZb2{8B8Z;13%?3vP`Ihds8(kPV}2z`@xBbasi{6xHanLLUZRM{k7l zZ?b4^o_;3oYP2DMZS-w#1`==KsjmOU#vS|fKC!hJ53Cp3LTUVGR@BjvN(WfpMEmc5#9bxN`o~v2eRNc)^HaC?*MTm1ITwPjU67yI|X1Nx8j!dMSbJI+ZTHXHYq^4s}$F!vZhVY3~c^CmVeGQB+#uBPq$pq^;r zgONOlLMZMhmpKx%Pk)HXyio)cOnX?a%i2sna>-W77C?R1Ia%TlYFcEZCD>fa`?4X+ z1o}rjRnz)Ad)4P|;yX~?5-c;4J=el5njN4|$Y=Ze;A6Qee80la)w2P~0w?9Jz_arM?44eV z>Jym&LLsK@fPo_j9izoGO#N<3%5He!~w!9dI-4 zMJAryO`lQIVO2CP70wM0x}IAeg17*i5f|tBgcq-maOhd^;zKq*2%J)s;yYMixiB7G z{B1^G*ylm8sP@*FpL|++d?qA}RbPVT*0-Md_afI7idiq{v;bOJp!?1@hmyZi%i#hM zcr^&D2$|3M)ga(}g_Z^G5DY|xG=0txoNUm5Mev+F{yq3b3DzqFRss5Jtk5_6XTanV z004qDw19mN3YCT7vF?4N{}@>e0EhxW{0&%i6Clt60qormlieR?_dhI{udSY5Tbp0o zzPYw9zIMDP2Lk_3-R$$4PPNr8Rm02G3)S0C=HdA{nUceqPP7bJH3p2Q--&A;$+6+! zvz0eu!p8XnKe>*kSp~@+9Q+PFJmXH+Pp$zLo#^Su;_sVGe^aB4yD(ld5lzX;Y=J>G zd%fv3kG(E$z67fE3jN5Ld`ZFU-`5_w@bXu_GTvM{F`Kp0kMXuD#Yl!)B8-DVN3LB+ zYhV8SvDNEO@^OLN$SRv>(c_?7|Lc)UqsH;^9`%cR^-P|_&2$Ruha&ZT{ zf!iNvg@)sd(05M;~WPk29F$-+X4K6h}fWfZVqi>_OD1i(DfJBT_fe)n%cAAEVn@DB!`<3KvFQ6_Uw=x6U)VDTkl!8~AogU1 z6u3A>24l13qSiIy(`&43RkEx@tKuD%V~z7SfIc?frPiL@_=teX3N4IPETM!}b4Z!` zQP8p?bB_EZdw%SYpK@G_Hd>=F5k^-_O@Y3@LP2Rp5MlgX8)(3J`n=ttBkjXC=hk;=Q&U^L#dtf%9#kPLPTV^jj2q_1}A!&(n80m zkcXK0I_)(&C5m+d$0n7#APxJ{XextBBKhQNl%PFaeyE42vv*!Z61tc`@4DsW(bP$Y z{T>{6TVEbCIxsQQmMO~;&zwsm6P}Q5g zEtB1gno_Nw7O6N5NPUQzrVD#EDrVl`B4`kzh>Q0GvlklR#A=D;vA;r#C$Xqca@&?~N`6Ge$hbHy*y_8%Y&`E`rF{!25n%FHiHr*w}uY zHSd_at>7+Z$g;={MR1$m^eE3zOpvWrTy%Z%+)Z#I694^W5j!j9M69{Xe<6yqd^Qx! zX&a*@G3){P)}~HjqAibK`ZTaCPk*aPrL(nSwICX}7zvy2$Q+^Yp z-=auj)2!5ZvfyB{WMn9p$@bmDl?2*F9**7e5t81uVdf@6Vig4D{2T#b&st36(%q+f z+y3@(GzTF~#VhK^ek!6kR-CWS*vbE@%8Pc8Mtz+QrH6+;QSdwf?&%z`olk&8bq6VU zp+f*Nc&wh5XQXOd#mQdQB+uD!I=w~(Pxr*c3lVv&2mUBZz4a-P7cG%s6RTM(l$wdp z0k9GAiNUv4?sD6KPyse6c!E*bP%P!xYL>CoE34XhMq(K+U=dfTJrg8p%CHnwqr=+^ zmG@i999OJ55qfanDW0dp&W?@{TA9>x+<+2uK=xHhkm_zb5z$fi?>M0MVJ@iEJ_*G97qfxrm zP2Z~|g6+QXuBA${0O}2GI2D0v%RepaqpVyea6yhM)$gGdymzBog7Q(=D6x9dU{227 zI%Ur?RFeP8SR8x!(m>hkhzqts?*CkKe`zUW&UfB$N`o{+&RZ)jDf7@yI$e}_|9Ji8eU>@keq$Sql~ z`CTKQSAoV*xM13`B z&DZSR*dK&&fdS&7Cf}y6t5~AAp*V?9ENYsOQp#qxSCcRD_?HGAFvUh1pIIFm-6YJ0 zXDj!i;z+#r#x9f`g7ot=N0Dw)s5y9%p3GsYHqyTm&} z#lw=It(3j7Y<9s}L7N%}Mdq<+UWXM6x>$%}zaFt$c0Fx~3VUX))6m57<1K%nqb@lq z^j*%CTuvW=S?F%~oY=!EczR8ISP(B%BlM{k_NC_6~G-71N^Qt(i2^l35@dgeP=XqZ*r->u73L}xYf#+|RTRNQ%I|{*%s!v(ig4s1^51CKs`+PFJ9B;9ks0nyF`h`3kb`V+dMF`L zPKe*38U+GZ52>9f{-*rZn=EdeL?mv*H6T|AR0uQWX?L}4^G+I7+kChB@n%Fm^Ue5Puz`x^Sq%pgS{>u(`WDFm;E0p*q++Pe^p~{UaHiD)m zjDZKrzK4J8ZlIv*`Q63_ogS{*6|Mn}II<=HzzpFu&eSnpG+hzom>3UXT=&>Y!&m;w zMr=JTlHfSp+Fpxdk1zvebLSKB!|sg-Jc=R=eEP$zP2B$c-X|u&H`Hn(vgwEH9p^JU zn~2Dqh}V~L7*P)?xgtP=l-tYOESm=9Y zEepSRwF$i7SZ(TM-L%i~DR>FzYzfqIKq9diY2{EegZMPn5ER&w)ZHZ9K5=|aq&YSg zbK1%}VZ8G=p4&j|u~#H`0YXxp`A%4iD#(LqRIpStjjS zyt)NDHgS`_xjp_l91CC@Ludvv*c((Zct2^2put`?i~|UHq-MuWb&JeAfM&P{%+u;8 z85*J5Q-+jq(teSytXp;0s^*Lqwst|jN&3E%jEUeXxT3_qeULk@=5_x||NeUsbP-(r z)2;}=(6=+;S9kHBFU8PXb8|)fZ8a#B5uiD%R0LmZ_j5L4xP)6iJKZU2ygJF?6Zc|qtauV9>R1P* z>H*;Vw5#nbdlK)feNwVsRiso`y?$RSqS{ln4X6pDE25ibdS&SR6e-&J;fo2gqmCl<-y)Gg?^T+zjHDuj!H;|si z1Hs+MI;F7^03E&cIa;Zj%zIVMtM!q$atPiuz}tA5o44QEM1@&PLX)_40yYUeHBTDZ zS6=SZ8SY{?9`bs<>v{Y8r|t5mhGo?8Nz&h;=s3LKasb21fvW$%ir?Dr@e0s$6UZnRLEyq(e@sTZUw%=uU)}wq~G2^Dk z^o=*REr1Q|R$gclnnbS`0MkHr-nJNKW=^NK34cJ6NVjNV+~XT>7svmFjpP>XhWX8S zo0Sa4PL;SFG@Ko5n{60K>d@$Ut{G-jU$Ix(uX|F{f3s zyt-wlF_juk{u&)NPF155N=X*oZ|{hI!Mfa}>pXg!=Z}oLPcAXtwp~>Z!~IQ|UsTRS95&OZ45O`2#2}qV;;H7KUGQA7<(6b~ElRHg1FT72ogS zJlq-zaO#Io4lu~!79fZp{~lzOd4~=_ni*+6?JG_$!Bq%)dwfB7(%-JMWDb7Y{t=QetTUN~a{2DlI!o5=4g;u{5L4Y`Tp=%L4c2K2B6 z4i-A@_ zLo6z7*KK2IUkD$f$J|Z&i_dfu`k;*n;&sG0;%r1pvo~X_F)MLWR0L!Bo7SxF{A@Ih z^Lm;N69ASFX`YcFf~IOrT(3@B=%oQ8&TOR+tmecS0itFh=jlg%P@zzwUX!WRpxKVP zX8V;{noEEl3~z#{TgiFk^k9Z=5qlz(XjyaimF8GbL-WNU;4+bwJZS!gVZ3g7o_3Ky zsbmgods;H6eTRM~Aa{X41gpYget&C{th1Bx1GXLvg^$^`bq6-U7p;O8G4ZSRRwKjx zIWs9>j;QdpvF5+LkzNi&4O{GUo)YRGrVD-nhA;hX9%5m9|7m8_-|;<9A%qNtpHMOl zG@VuA9|}%BE z{ei_27YDUskTg#9Y@tBfox^0vdz(2~Xhm{+p{>u}q3~afOAS~PkX=YKaoy!}ieqFh zQC#tB?1U$o1QC<5q6sn^r%xX)3$Y2iQ8+R`eux&)@i>1YB1}V{nM`7 z8-x$N^JPtqSvIko-}xr3K2LJv+8)5rChO?U`o<5Dg;S=%TNC_{DtE%^`}5^rn$|sy z(4f7|I@9f(q(!*q&{+RA_D7s{z{cKrFQ#s075ac7qSWB)S&UoYzVWEWshO(ni^i?X z^W~U^8WG=J4oh4m)UM0y+z{hZUT{6m#SW&c1PM&r&W={flEH{SqGmT%WVY6}su5`O~-?QMo)bZ4&1GgO@Xu!UpTX5c z++jRn)WXvPY-7N@5DTpNlDR3^vANb(KGP|lFt#HMBf;4I6S$c+NA?JY$5k>t1vyjP z?x!I<9ea{Xfd0au)!$`yLe-qk3jp_TjpRA)6T;6nLm(8PXRPisdMbkkF|RA0kc+7P z3k;cl6YmNE^Q3{UKYccKE^y?4c@{x>5UgaCrfZ`2-sm%tQeGn#TwVZfAqxNNLI>7U zG$9;~_Z&hB11ju+$@T~x5q@!YxC1N~#a9=0s-PEaECHpy03hU2qWHViyYDi)-=Exn z$L!?EKfO{kzfw+t{$Gj>>ps*Qv^s82wb!q{wRkhIHqtPY+iK%(AVty9I7KZv=LaTJ zj5h5xopUbR>-ef_Y8Q@MuJN-eQ6M&n|NC^;t4tOq8ATS8RkS6o-Hzx^kO#TIBvf9f zBk0$R&|D3>-iuKIPy5A4HTEapS=!GrR3L{s1?|v^8<^FA$0yfAE_tt3_Qd+MQfHI5J!1WEyW@?0)bf}UA{nhIg@0d6}XF#Eh> zx#&mo4{`^D*~Gh*B`g-~*|9X39aAsJB-DU=4HP*i>~VgK@OG!MmOn;QMPoPE(LmXhRxiSt zEn~UZ3*{MPXPKxFtNZaQiai9@UaDKiRnxm%y#lw}KL*Jyv$v0GtgRR|RrC=k_7p5} zY6VJ>W<`6Rso6uGw4~Vk*lLF zyRd}?KhSPj%Y861J;@bH#(2h`qY*BAkn7E!d)j9d(&wg@W#K$D&aW%U+9g+{<)oq) zYUL7D$zG)D&f4Hy-*@smQ?Z)gj7M;SLf6H8()#Loy^1oTmNV*fbSYbKQh-90M~?U} z-xruF0-?^|O7Le~qe04Z0KxbyIm5Q2g;nCtxZcB%42lLfFMsW#9Vr#mMnL(UIleW{ zb*+M9Z`Da?t$ zI|%3d>NBAMis_x7^?ebs*<=0wy!}-*nJTv$t0wA3u;y(DwS8H4(ym-X{{1(~XaO%b zR#q71lhm?~)onNTu0Fu@Ls=4&=~p96x~)D|uyiWj4)96{>wqS@d)E=92Nh++c`DZl zczE`K=CeLk>>h-<$})n0jOpKyh>(_%RV39x4ha2*s$)vFlDuAM6e|_n_ajCiNW$eC zTmUY|Xl#RxL1ndUf$YVssAVw%7yk7?O0H#1S+!y<99D5c0LF>Yir93Gbau(2@n;EE z>)SirQDKja=}$z3;iTXEWCth~ue|78oPZK^k$UKZ;Hr6h)Ii ze@XJC`%dcXP(xa@rJrVlcWE3psy?KhV8=5`LG-R)f=}zC7}--ATctt%(sK+Fho7{h zK2Qa257sxxH=Oj2Lu*Zhdi!c@a-47+OVoK*C{=XCK_x;%)9Fk0SaQm{ zW6F~XaFX^FxW=Y@@_E7Be@4`3spo8ClfoWR8~ktK__;(jPb3r_Re5N%7;w^9As;Z=QlrI+f5=Q6ff%%W*kwm%))U&KgBbcTK* za6h7HrcpILJPorFXM(vO;^F+zuZg?oo0;w zGJ~kUjMxf-4ExgslR4t4fF3ehJZRyoIx;pZN5_R&-iYwe_(?r9qT;Z{u?u9eLKUkl zPV6TP!Nwx`U*>E_Vhm@a%zbRXEjEFM&&TxLr?B*?U5AF&b|~t5ihnPMs^V->u(l6w z{PvMrRUqNhgbIJkB=o4&JdhPZ>Dun8eiUgP11hv?QMm@S9clN6h`dLU*02%8)BMT5 zu0m~mxr*OHMB5m)gQi@9lMeN>^j%^(dwTgf*E7*O2B;+Z+O1G=%;pf$u5)sCDes#t zGuQDTVTUkE*g7SsfU+}agSErYCIZqZQtJ#Ai1rLxXOGg&r7Sj@G}emzM>9M~Np$M9 zVA3ebc1}tZ0O&TZixNEELQewu_&(4+tU`CI-6Mgz)E+IwmkbRqs#0mo$i| z)sve1UV>NK*c{6&6;%=L0k#DECTG#31<*@8Cl_o{P7Ik?J^aNEn$x$?o9d*h(!Q_W);=S7hqFI2iLkWq1(`sx zo;t)#F9zIoUH3IK;f6#pFo%Xanci^iH0#lpVGD06VH<3Dz;cPH&HrW zQ-Xi8XHJAM(=CYh)hA@L3Om?h>W(GjZ-dlrsdVi^VO&MTbNj!1{PU~GJfrED2^%k3 zg1tvYpS>}I%9dG_czk*7(~#?8^;Ktu=^Q|k8CF~UOK?K#+ULt~Uih=d(v5rZ=8hAG z69`5q_1)wGZh>fr)U_CpDA5mD(GhIvE4E^!0alps9X7)ejlkhM7hXZ+CSaV`Zypk9~(z2DCrjhiS>+hn}E~Nc|gw ztlap11)h^8^`JK^AKdJBgyxx_hH&rk1wLev1ETkXb*?R9$W5}8IjL&j%Ul44%7WV|0_@mBDIvHWB1$^GFuY9IJ_k49h^E%1 zW}I?hXZrI=L$DIu=fWFSG5o^K`fcY{sOi!>64AiMJy)5u@JCX|J9yYtLzwrF&s*JK zCWqJA-@O&>p#WHzBoxg0&hv*z@ORQ6Wrx=*OCi7a_+Ga{x&=bKcEbU_AyvMSvo^A- zH{NT$zMQR)QUP3@XwNxzAxx1EqKX)8Q8uD@?luh{=(h1?q64B{e!Qg=e6&YOltdmz zJ`ZVyIHG&BbFUPf%L1gxUOt*~9;@hLkdewu(KKf`@O`&rJQeW_n6zC~cZ5fd--kd> z;eP8dsu?^FikMA>NDezJpApS@PlvN9nfW# zeGU*48QVrqK|DOm&Qp-+CBR}gUL9uq1^kKJGT@y2ErC~jiJujfjQQ-qC%|qT=}2&X zCgg{MsV*#JLP(Gb@d<@z=ZMt7U~|)i1u&IbUy4MewkE7O*i??hmarv|X(!G@-{?{* zBKi`c`-x~gEiAGGEHN;NQNpfhv^7lP_(qK&#yNNY6~ic`RK(VJ(2@Ms(GLCz%7d1 zmzhc`S+p?*0|TifXUW0%DHcYWd##emj%ktpHsA09%Ca7-Dl#fpvKmLMOIfn(RkD2? zv$9h&DZ=n17;STJQv_9#tlEU@Vv-wTQiz7dhQt!I5RSPA=}*LTJ&e+3xpMo_D!Kd- z*^n?iEqLC$p-ddElsyLtJ;(GNvHXwN@=Mf72j!0KqdEFY$^4#xEhCk6(L8UXJPezB za9I9IdH&jH!EURJ8figiR64dy7M zGPFn-Rd~EoXd0;|SrJztgXlBL(Lg~ofhAnVpT)$J)xe0*7YJk3Y$B0jqOg2+K&gm$ ziN|iHr9Z$hHbMvi2ta+7J`};|DJ5hAB2P;#vh%o6MKcDauS@U)(AlL<+;;C{b4Ub` zkrnyvqj^rgWw2#rf@&5OMLC@yR;n>_)W2L)rL6fgQuHNu?rQnGzX1XT(UU2U0G5;l zAoUJ4vbi-%EgW*k%E-toX=E`31fDdhR+PpfFFsd1q{e&!R-sv|9*^}D7MN}URh%?s z?xj`Zjg?1x*k2ASYE+@K*$^pKvNt9jDAi`5MYI{Kf1VU}g2F)8`GR(zF-YT{Ja8s@0*Z;K#%Eb#`r zav^r@?2oEPrUlfomQog%3sHLjEPLQClW~-0&WZiNUVDxg7#La&!f}nNCJgZR(lO0 z%F#`%5mTJlxV=ejOjT?RYz)W7cm856@tIJq$;YWFO|Q}UzH0iencxhc`&|uhd+o?w z-Q;ae04VTkx+UbO*flN(yAa!hr#XtY$ycH*md60|u^nftHSwr8bR3)|(~`bcH)_<( z6Wd(Qihm72b&D5qyhMRyF{HKH(kp8$S8J*UQJAYRrNG8l**K4%1i%6nS=oNeRiYbb z)McVlI^EjqTyLw`-g<^*DbeB;*e1-~w0_%Rj~2(OrEOF0N>o8U% z));J?;^^!J6$33g2@2~+0#TW9m4i54kV?RJo{k;=?m-i9VGr&~PCK$P*9zEuzV^Xi zymQ{!;bt7%1;A+?@8Qd7v#xF3)#Jia?@4v+VUxu=kZ6e<@0y@}qXzDVNOrTh)U&UP zb60jfwAV~jnmwiK$C1UjFzNnm)c+`bP}J6~KI)bMNNYgW8D&_e84B?v00icmNz2MuNAUjfFcuU3mQ$m**f6gkmKUP;b=*k%y#M)M>qNTD}Gf zUOcP8;PzB}y0$;P&wC~5y5h6W*uNrig>?rLHXLT-{&qn>p>RqSVic4^^HxZHea_W* z#hHRZ+P;n=&6qlC-^b!M&&KAs?Ri2g+>&%+@XgTtPa%ufPc(qd?QZ07X=Q7wGe_jl ziL^4z38SJ*63Cgf-=1$Kax!;%rVz<@5jKk%d>#=_!aQZuv*}($UusI(kBywea*Ma$ z3cF|$SW_WJCWn1k-rjv3&Nj=jCjOD~+NqWwVVWC>N(zh94Ya?r`5q2D=knYmg zS{NsmX+O)P%xH-P6b`kD$+bt>3^2gzv)D3}n%_ayh_w(71^SrWNQ5f`Y?C%VSwE&Y z7W}sE;4>2UbI<~RzB=d>^=lV22E3=KO0CSV zLJ0JX2=j90PN}NT69lSP4h&Ka2fPi=^6Majuq3*i^$|D+9Tsx4EI_%L;|PRWmz>%Z zCzU_d;!cTmn?CPKq=8aSEBu}H7^g^a;r}{TisGJ=eJeOTr%fB&*ptY-O}i*7SbsUE zc;e!*@QhcZS@R8evT0oB{kUr@_S}Q8rXwpl-e<;p?U_&x51#wwH?iJrkySI?kmHSp z#TJeoajv?X%}@Nfbv49+vi>_6bA(ObF^FF~GZt)qzS)d#uWCMM{FfY{k>2nMHI*&T z;18<*%BTCQdGmJ@N{=T_0ff9KB0a5A))1K(&aSotnR`_QsiZrDAJ#t$(YYoCFoZ~{ zHaT}oZPnzMzo}q}uhF^M18D}FB}wOEmHaM9?Y!Ny|JQVY^L(1(B3(M^SQGzY&3tJ- zs_~O!jD@cJ=gl!+?xQZu;?$bN z!y!;uUo@;IoNK}YoxjwZGQ%Bu?|_Mcc6N{h1u#c)$8SE?FSXlt;zyKMghL+xzBD9f zj5?Y9boIzVF~6NS8a%TpzvccB@^X3H0Bz6@_Xu`9E9{TRBJ!B%C#qUS3Et}clv@^J z0;{eu>eyS6G=&aD53A9 z_@hi(TZmVpGU02C)JeDmOkfACTq+E)rY5d9-RA+MM0jm#b`EiAB>p`dP{2pM5yD_w zbsD}I=$NSiW+qjV%sR=UC{cKQSa*P~5I%mazFZ2k9ypxj$8NXGU96g5^1Lu1eyn}S zA7*04@SR*`H7#L5owfC!VVT?LDPQv+lst@k9Gy*VCPX?p>&Io%&yr*K4Ltp@3E4hp zwoSS6k+Bdjhs%745nK+g&AM~hQxv2T`7P`Ac01fsu~ST^k4!hDt=~>qjjLFfyRn39 z#^DI{ahCEQJe6XwTyd&NJ6cJv)L0xT6d3@?%T5imuqG|cj){2l{3WxHAD4PcR$~Fp zL8)P6bmi2Qp64A|p+2FrV)W@?9?hjY^re=#SOj)$#R5|SEYD<*V#x2f{^6_zNUVLBU#z1YczYm;WM8@RVQeD*Wj?ppJI5fx z)V*Qp9K+FxdgaSBs&8e9b1k)Jp3!`oQvD7@Bb**W*+v!rX4QO;hc#%Y18-D;>h1mT zFJQH$QxPP{F-QLAxAacSz>^RV^X5M%UsV63P6)30mVniC_qc6Q>H4@u_{eoM@vGW* zon_HG22`D#FKVMOs-pF%uG=V;tVjmOb7+e;a!{BdDqY)iH)S;F`TGj4S_!Tzv#nYoo=5?6w<4g1i z+WHJ!pQk(0*RNR)|Ne#c2b0-R*eg? zddX@-s|)Fm^muYyo1@OKW^3QN9<8kX+dzzDK4NyKw{Sf`EEp!|uO-zTuMeqHvDIEM~(}wiN`iah}gdCcKf{FT?Z=^A6PwF%BzVl1p&h_y5 zgh_@HJlhl>b~pE)sqg${jSia!Oeso!rmf^9FY4Zf*1qcXmTs1HWB=BW@CrIIt|}+bPS(oTltNKiCM` zyJmpQh;-!5CcO>byT>G2l@5wtS`R*UJEK2%5mZ$dTlcb%P`SeEn^ei>;bDPwe@fLwzN{Hlt zobcn+z$liMo`EU(h#oUu#aDNsawP)9uyo6m5s%s)F=0w6n}Jz~TA?BHXlS`t#9)pd zNa~_=ENQdWh#_m>NeV7;Z#Z~yBSnr%O)f$2>}?Ei9QWCCc(ZAw|5scggfcqgRp%H} zhCX~5urMH@33N+{M@yOAMQ0FOwJ-TYGvK$gIDQIL_g`Lyv#~xrvGA8`G-NbpaY^2C zBbzNl@ZCv?F5)S}0Tz)I1{hgUv}4zs9~u8O)5W~`q!sy*qX=qAevjS94ExwY_5D4U z0Vj5ph|i@AyZf=9Rcx2GpE=xw8lyN#@{03mn7Z9d%v2>+e{8tE@g)EfZ_!qqUg+hh zPsQqY!xaa*pLHiGHVQt3dbY%(aV^)5=PHWfrYT7b&qq7yF{XqBIFwX} za7M7Pj2WkvRqoIn7QO1)cGfOs)N!tDMP(mA)EH>z2_|$_4{MbZP?hDgzc1A2#tqgg z8qT>KTw0_d)ULJZyA?-}>%uisz?OkCPxDH`SY?MKQ+QNoGkdICsm8nU6ZL=9&L^$0 z3EXcOpFAZX#di=W5@?@XJ+MZQY%0_Z0!(tw3W^Qt9EV8_2|PxEpA*=YvKLFv4O6_C zs2XQA^sArXnd$HtS=zljo{}t9s2h{!kLT>FnZh%k;Z54YWr1=$0Z36jf7bqiq!xD;~JxX07`wtL#2nD`61&IXgZML>qmzSE{|qHhZUI8g%O znl@G-a&{2EFIiB$w2ED0N+5SCiFmn0dS#NI*nx#|y$?tP2ROm>#L zh_f(tFBV`-Pgx{=5=@`95Ilrbj)@45TkK!Y3t1kLQ({d3)l+bGKl&n6Kk={_yF zQKYJeq>$Yjtb{-509R|{WnkON6KM}XQMHa1yq4VhZE&WA@x&SzUA7isHDhj8P>WXy zb1x@7@7*~Q%jweoKfG~<*SKlJ5hGZ;pJnV8XXJ+B?H;>AYMhKclcwiO-=`5#1qOfIC8N?OOPv4Fb7{De76Gw#(3CMHGGb#rRA#QgaJe_iCs zlYj_O@OcTAN;wouTzTTx_u`BBgV!9Z)nN-4rJ{d7YWbpOlmERa$1$o z7U|+7sDr1F;9rc}MxGFds^7YFtHt0{3R2O*% zd%vtkRGMFlYqwF4R@+Zv!oG7G=6iT)zwbPfCOg6%5`Ih*$yXV2nXL4ZG?#l2xV;q421MgrATSSN$sNtqn)6w`FiAa>Mm zXX#va8s`+uXz&xlsNCQirxNvLJek z6{Va+Gw$Ybv^|h$f_;r{nnkQfw*1J%As@%}Vk^Z6!GnOa@sVF`57CvhlH?Kdwa7|u zNGQL|uRV2NSj}{T54*AHFY~3lcc}tR_4v;}tNBXI3KCwof|%dR7qpMI>t3Tq=>ara zv@@quCM*L|Zs9>zAG9o<0JLGXaqf~%$r%rf#8lzfI@NFDba(tkeHmy>|9M0VJdm0L z94NK?pOT8_;t*h8xNx@b?h*6}8whby*$w_sF6QD)WD>xa+^N zbpHptjF#$+cE3M|8%O6DY4XH(>G<_AHQKV6Bn zE07`R{B2_K1jJG(-Hnhz{rUj0{1!CiB1Vw5=**S-T8j3PY2C3rRB7_QA&Ii*E0E)L zQ1ju;XfL1rw~p(>eJhPfe1%Sw``U7^4w~xQhQzK&cfT+F*G@^#qv-{c;M1bc`|C{p zhV+6<_}}|o>LiBu2HF+_0stR-I%{kL#m)El*^e-KomiwVbUCTU&0z)FxaaAb35u@RfcGJ3c26K)VCSeW^Wo;fVbEF@-?mZ1J% z4)0xl40}?)gF{)me?C`P$oumP6-4-$k$s^keMMRR2fi@}4O^XCWQK;-<4tBtv))08 z{%;l5xI7&iC}X<0IHzC9m>yRJf(9Mtn6252(#b;h0S~LP7M*xhYr5KaYC8WNI##=t z-XU{&?wpRHy3CbF^#j6f2Ms+%+_Lp^Lw6-k&Q?6LscWhdRY-|l-@MjoCllBDy=v4> z({XsJBG1}xoJ-ZhSmx8b(1oL!&f7!KN$te0?}}3{kS+=PhGODNE#7CgOjS8nTm-3h=%bbl z#^j5&_-O)lk-vQ$S_J{zgYE3crfhN_wPPj<>2|y)mznb}u#{H+|Q>C@BfO}g@Im)!kya*b~fGm|6adM z(7d2ofG0@i?7SDrZ>QWd5@*$jv34ShJ$(_Czyra7qXZt1{L>pv+;(^PfF_%o{&*t|o^hmB@u z<5Nsa1!wFBqos5+qmC(s_F$9FR-Tz`7e8P08frKPklM_==o21>z4kQMHFo>4Al|k- zGZdONT)4bGBHZIuXkmx~qgl)R<=8tCTXa@Iy>9as5JLvPxsKEsgdu zy$bP{ewM#jUu&<<`&Q^d9XB==mQ)v-XGuPr#UA||5?{y-xr`4;d#ZJity^jSGB!-{ zDNgP*uTkCXJG z=^h0(vO2g*y3*M!d_o3ep|g4UoL9XkqhC3ETU7=gs6<{ca$8t(DgI%or zX{#eNKP)10;s?9L?Wk5leQKHdPwo^}#{cBUaj*br0Po|p1l$3d002BR0F6%vtwr>H zz$4{09jPtsf9xAl&4t!Iw(L*|IjxV>6%Qve%E!{F)PEjL;nb}#9jz}J&k(R4%T;M8 zoy-ySJX{}bDEnF<^8rY&+K8MfhNk>aXWn>A&1QEf7KlN;wRXEdnv}jS+73H(jh&@VXOqd9>W%ygAj`etojlA7}bhv#aCw&;DHHo3CAu zqwe(kc!6ej*Wde_KS!HiySve7z>~-1_oMi;6^6%-e5{@n-rxEFR^r@_ATw~-j-;|f wZb#Ai>~DW$jN;shW=(h4iQz0o?!@vYlY{?z!7%_Bj|+|sK;vNl4<1PTFZd@KD*ylh literal 0 HcmV?d00001 diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 94fd87b..d80fdf5 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -3,6 +3,7 @@ import 'package:fluttertoast/fluttertoast.dart'; // import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart'; +import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; class Utils { static bool _isLoadingVisible = false; @@ -33,13 +34,13 @@ class Utils { static void showLoading(BuildContext context) { WidgetsBinding.instance?.addPostFrameCallback((_) { _isLoadingVisible = true; - // showDialog( - // context: context, - // barrierColor: ColorConsts.primaryBlack.withOpacity(0.5), - // builder: (BuildContext context) => LoadingDialog(), - // ).then((value) { - // _isLoadingVisible = false; - // }); + showDialog( + context: context, + barrierColor: Colors.black.withOpacity(0.5), + builder: (BuildContext context) => LoadingDialog(), + ).then((value) { + _isLoadingVisible = false; + }); }); } diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index 1db57f1..5f0f266 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -44,19 +44,19 @@ class _LoginScreenState extends State { } void performLogin() async { - // Utils.showLoading(context); + Utils.showLoading(context); try { _checkMobileAppVersion = await LoginApiClient().checkMobileAppVersion(); _memberLoginList = await LoginApiClient().memberLogin(username.text, password.text); AppState().setMemberLoginListModel = _memberLoginList; AppState().username = username.text; print(_memberLoginList?.toJson()); - // Utils.hideLoading(context); + Utils.hideLoading(context); Navigator.pushNamed(context, AppRoutes.verifyLogin); } catch (ex) { print(ex); Utils.handleException(ex, null); - // Utils.hideLoading(context); + Utils.hideLoading(context); } } diff --git a/lib/widgets/loading_dialog.dart b/lib/widgets/loading_dialog.dart new file mode 100644 index 0000000..9c88a39 --- /dev/null +++ b/lib/widgets/loading_dialog.dart @@ -0,0 +1,47 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class LoadingDialog extends StatefulWidget { + LoadingDialog({Key? key}) : super(key: key); + + @override + _LoadingDialogState createState() { + return _LoadingDialogState(); + } +} + +class _LoadingDialogState extends State { + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Dialog( + insetPadding: const EdgeInsets.symmetric(horizontal: 60.0, vertical: 24.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + elevation: 0, + backgroundColor: Colors.transparent, + child: Directionality( + textDirection: TextDirection.rtl, + child: Center( + child: Image.asset( + "assets/images/logos/loading_mohemm_logo.gif", + height: 96.0, + width: 96.0, + ), + ), + ), + ); + } +} From 02be1cde49aa3713e0eee2465d76c7e6315b204b Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 26 Jan 2022 10:58:58 +0300 Subject: [PATCH 4/4] api structure improvement. --- lib/api/api_client.dart | 27 +- lib/models/generic_response_model.dart | 32 +- lib/models/member_information_list_model.dart | 336 ++++++++++++++++++ lib/models/privilege_list_model.dart | 21 ++ lib/theme/app_theme.dart | 4 +- lib/ui/login/verify_login_screen.dart | 23 +- 6 files changed, 419 insertions(+), 24 deletions(-) create mode 100644 lib/models/member_information_list_model.dart create mode 100644 lib/models/privilege_list_model.dart diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index fc289c0..7de80da 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -25,11 +25,19 @@ class APIError { APIException _throwAPIException(Response response) { switch (response.statusCode) { + case 200: + APIError? apiError; + if (response.body != null && response.body.isNotEmpty) { + var jsonError = jsonDecode(response.body); + print(jsonError); + apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); + } + return APIException(APIException.BAD_REQUEST, error: apiError); case 400: APIError? apiError; if (response.body != null && response.body.isNotEmpty) { var jsonError = jsonDecode(response.body); - apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']); + apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); } return APIException(APIException.BAD_REQUEST, error: apiError); case 401: @@ -66,13 +74,18 @@ class ApiClient { print("body:$jsonObject"); } var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); - try { + // try { var jsonData = jsonDecode(response.body); - return factoryConstructor(jsonData); - } catch (ex) { - print(ex); - throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); - } + if (jsonData["ErrorMessage"] != null) { + return factoryConstructor(jsonData); + } else { + throw _throwAPIException(response); + } + // } catch (ex) { + // print(response.body); + // print(ex); + // throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); + // } } Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 5bfa4fc..b993db8 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -1,6 +1,8 @@ import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'basic_member_information_model.dart'; +import 'member_information_list_model.dart'; +import 'privilege_list_model.dart'; class GenericResponseModel { String? date; @@ -167,10 +169,10 @@ class GenericResponseModel { String? listNewEmployees; String? listRadScreen; String? logInTokenID; - String? memberInformationList; + List? memberInformationList; MemberLoginListModel? memberLoginList; String? mohemmGetBusinessCardEnabledList; - String? mohemmGetFavoriteReplacementsList; + List? mohemmGetFavoriteReplacementsList; String? mohemmGetMobileDeviceInfobyEmpInfoList; String? mohemmGetMobileLoginInfoList; String? mohemmGetPatientIDList; @@ -198,7 +200,7 @@ class GenericResponseModel { String? pSchema; String? pharmacyStockAddPharmacyStockList; String? pharmacyStockGetOnHandList; - String? privilegeList; + List? privilegeList; String? processTransactions; String? registerUserNameList; String? replacementList; @@ -673,7 +675,12 @@ class GenericResponseModel { listNewEmployees = json['List_NewEmployees']; listRadScreen = json['List_RadScreen']; logInTokenID = json['LogInTokenID']; - memberInformationList = json['MemberInformationList']; + if (json['MemberInformationList'] != null) { + memberInformationList = []; + json['MemberInformationList'].forEach((v) { + memberInformationList!.add(MemberInformationListModel.fromJson(v)); + }); + } memberLoginList = json['MemberLoginList'] != null ? MemberLoginListModel.fromJson(json['MemberLoginList']) : null; mohemmGetBusinessCardEnabledList = json['Mohemm_GetBusinessCardEnabledList']; mohemmGetFavoriteReplacementsList = json['Mohemm_GetFavoriteReplacementsList']; @@ -704,7 +711,14 @@ class GenericResponseModel { pSchema = json['P_Schema']; pharmacyStockAddPharmacyStockList = json['PharmacyStock_AddPharmacyStockList']; pharmacyStockGetOnHandList = json['PharmacyStock_GetOnHandList']; - privilegeList = json['Privilege_List']; + + if (json['Privilege_List'] != null) { + privilegeList = []; + json['Privilege_List'].forEach((v) { + privilegeList!.add(PrivilegeListModel.fromJson(v)); + }); + } + processTransactions = json['ProcessTransactions']; registerUserNameList = json['RegisterUserNameList']; replacementList = json['ReplacementList']; @@ -930,7 +944,9 @@ class GenericResponseModel { data['List_NewEmployees'] = this.listNewEmployees; data['List_RadScreen'] = this.listRadScreen; data['LogInTokenID'] = this.logInTokenID; - data['MemberInformationList'] = this.memberInformationList; + if (this.memberInformationList != null) { + data['MemberInformationList'] = this.memberInformationList!.map((v) => v.toJson()).toList(); + } data['MemberLoginList'] = this.memberLoginList; data['Mohemm_GetBusinessCardEnabledList'] = this.mohemmGetBusinessCardEnabledList; data['Mohemm_GetFavoriteReplacementsList'] = this.mohemmGetFavoriteReplacementsList; @@ -961,7 +977,9 @@ class GenericResponseModel { data['P_Schema'] = this.pSchema; data['PharmacyStock_AddPharmacyStockList'] = this.pharmacyStockAddPharmacyStockList; data['PharmacyStock_GetOnHandList'] = this.pharmacyStockGetOnHandList; - data['Privilege_List'] = this.privilegeList; + if (this.privilegeList != null) { + data['Privilege_List'] = this.privilegeList!.map((v) => v.toJson()).toList(); + } data['ProcessTransactions'] = this.processTransactions; data['RegisterUserNameList'] = this.registerUserNameList; data['ReplacementList'] = this.replacementList; diff --git a/lib/models/member_information_list_model.dart b/lib/models/member_information_list_model.dart new file mode 100644 index 0000000..a3bc05f --- /dev/null +++ b/lib/models/member_information_list_model.dart @@ -0,0 +1,336 @@ +class MemberInformationListModel { + String? aCTUALTERMINATIONDATE; + String? aSSIGNMENTENDDATE; + int? aSSIGNMENTID; + String? aSSIGNMENTNUMBER; + String? aSSIGNMENTSTARTDATE; + int? aSSIGNMENTSTATUSTYPEID; + String? aSSIGNMENTTYPE; + int? bUSINESSGROUPID; + String? bUSINESSGROUPNAME; + String? businessCardQR; + String? cURRENTEMPLOYEEFLAG; + String? eMPLOYEEDISPLAYNAME; + String? eMPLOYEEDISPLAYNAMEAr; + String? eMPLOYEEDISPLAYNAMEEn; + String? eMPLOYEEEMAILADDRESS; + String? eMPLOYEEIMAGE; + String? eMPLOYEEMOBILENUMBER; + String? eMPLOYEENAME; + String? eMPLOYEENAMEAr; + String? eMPLOYEENAMEEn; + String? eMPLOYEENUMBER; + String? eMPLOYEEWORKNUMBER; + String? eMPLOYMENTCATEGORY; + String? eMPLOYMENTCATEGORYMEANING; + String? employeeQR; + String? fREQUENCY; + String? fREQUENCYMEANING; + int? fROMROWNUM; + String? gRADEID; + String? gRADENAME; + String? hIREDATE; + int? jOBID; + String? jOBNAME; + String? jOBNAMEAr; + String? jOBNAMEEn; + int? lEDGERID; + int? lOCATIONID; + String? lOCATIONNAME; + String? mANUALTIMECARDFLAG; + String? mANUALTIMECARDMEANING; + String? mobileNumberWithZipCode; + String? nATIONALITYCODE; + String? nATIONALITYMEANING; + String? nATIONALIDENTIFIER; + String? nORMALHOURS; + int? nOOFROWS; + int? oRGANIZATIONID; + String? oRGANIZATIONNAME; + String? pAYROLLCODE; + int? pAYROLLID; + String? pAYROLLNAME; + int? pERSONID; + String? pERSONTYPE; + int? pERSONTYPEID; + String? pERINFORMATIONCATEGORY; + int? pOSITIONID; + String? pOSITIONNAME; + String? pRIMARYFLAG; + int? rOWNUM; + int? sERVICEDAYS; + int? sERVICEMONTHS; + int? sERVICEYEARS; + String? sUPERVISORASSIGNMENTID; + String? sUPERVISORDISPLAYNAME; + String? sUPERVISOREMAILADDRESS; + int? sUPERVISORID; + String? sUPERVISORMOBILENUMBER; + String? sUPERVISORNAME; + String? sUPERVISORNUMBER; + String? sUPERVISORWORKNUMBER; + String? sWIPESEXEMPTEDFLAG; + String? sWIPESEXEMPTEDMEANING; + String? sYSTEMPERSONTYPE; + String? tKEMAILADDRESS; + String? tKEMPLOYEEDISPLAYNAME; + String? tKEMPLOYEENAME; + String? tKEMPLOYEENUMBER; + int? tKPERSONID; + int? tOROWNUM; + String? uNITNUMBER; + String? uSERSTATUS; + + MemberInformationListModel( + {this.aCTUALTERMINATIONDATE, + this.aSSIGNMENTENDDATE, + this.aSSIGNMENTID, + this.aSSIGNMENTNUMBER, + this.aSSIGNMENTSTARTDATE, + this.aSSIGNMENTSTATUSTYPEID, + this.aSSIGNMENTTYPE, + this.bUSINESSGROUPID, + this.bUSINESSGROUPNAME, + this.businessCardQR, + this.cURRENTEMPLOYEEFLAG, + this.eMPLOYEEDISPLAYNAME, + this.eMPLOYEEDISPLAYNAMEAr, + this.eMPLOYEEDISPLAYNAMEEn, + this.eMPLOYEEEMAILADDRESS, + this.eMPLOYEEIMAGE, + this.eMPLOYEEMOBILENUMBER, + this.eMPLOYEENAME, + this.eMPLOYEENAMEAr, + this.eMPLOYEENAMEEn, + this.eMPLOYEENUMBER, + this.eMPLOYEEWORKNUMBER, + this.eMPLOYMENTCATEGORY, + this.eMPLOYMENTCATEGORYMEANING, + this.employeeQR, + this.fREQUENCY, + this.fREQUENCYMEANING, + this.fROMROWNUM, + this.gRADEID, + this.gRADENAME, + this.hIREDATE, + this.jOBID, + this.jOBNAME, + this.jOBNAMEAr, + this.jOBNAMEEn, + this.lEDGERID, + this.lOCATIONID, + this.lOCATIONNAME, + this.mANUALTIMECARDFLAG, + this.mANUALTIMECARDMEANING, + this.mobileNumberWithZipCode, + this.nATIONALITYCODE, + this.nATIONALITYMEANING, + this.nATIONALIDENTIFIER, + this.nORMALHOURS, + this.nOOFROWS, + this.oRGANIZATIONID, + this.oRGANIZATIONNAME, + this.pAYROLLCODE, + this.pAYROLLID, + this.pAYROLLNAME, + this.pERSONID, + this.pERSONTYPE, + this.pERSONTYPEID, + this.pERINFORMATIONCATEGORY, + this.pOSITIONID, + this.pOSITIONNAME, + this.pRIMARYFLAG, + this.rOWNUM, + this.sERVICEDAYS, + this.sERVICEMONTHS, + this.sERVICEYEARS, + this.sUPERVISORASSIGNMENTID, + this.sUPERVISORDISPLAYNAME, + this.sUPERVISOREMAILADDRESS, + this.sUPERVISORID, + this.sUPERVISORMOBILENUMBER, + this.sUPERVISORNAME, + this.sUPERVISORNUMBER, + this.sUPERVISORWORKNUMBER, + this.sWIPESEXEMPTEDFLAG, + this.sWIPESEXEMPTEDMEANING, + this.sYSTEMPERSONTYPE, + this.tKEMAILADDRESS, + this.tKEMPLOYEEDISPLAYNAME, + this.tKEMPLOYEENAME, + this.tKEMPLOYEENUMBER, + this.tKPERSONID, + this.tOROWNUM, + this.uNITNUMBER, + this.uSERSTATUS}); + + MemberInformationListModel.fromJson(Map json) { + aCTUALTERMINATIONDATE = json['ACTUAL_TERMINATION_DATE']; + aSSIGNMENTENDDATE = json['ASSIGNMENT_END_DATE']; + aSSIGNMENTID = json['ASSIGNMENT_ID']; + aSSIGNMENTNUMBER = json['ASSIGNMENT_NUMBER']; + aSSIGNMENTSTARTDATE = json['ASSIGNMENT_START_DATE']; + aSSIGNMENTSTATUSTYPEID = json['ASSIGNMENT_STATUS_TYPE_ID']; + aSSIGNMENTTYPE = json['ASSIGNMENT_TYPE']; + bUSINESSGROUPID = json['BUSINESS_GROUP_ID']; + bUSINESSGROUPNAME = json['BUSINESS_GROUP_NAME']; + businessCardQR = json['BusinessCardQR']; + cURRENTEMPLOYEEFLAG = json['CURRENT_EMPLOYEE_FLAG']; + eMPLOYEEDISPLAYNAME = json['EMPLOYEE_DISPLAY_NAME']; + eMPLOYEEDISPLAYNAMEAr = json['EMPLOYEE_DISPLAY_NAME_Ar']; + eMPLOYEEDISPLAYNAMEEn = json['EMPLOYEE_DISPLAY_NAME_En']; + eMPLOYEEEMAILADDRESS = json['EMPLOYEE_EMAIL_ADDRESS']; + eMPLOYEEIMAGE = json['EMPLOYEE_IMAGE']; + eMPLOYEEMOBILENUMBER = json['EMPLOYEE_MOBILE_NUMBER']; + eMPLOYEENAME = json['EMPLOYEE_NAME']; + eMPLOYEENAMEAr = json['EMPLOYEE_NAME_Ar']; + eMPLOYEENAMEEn = json['EMPLOYEE_NAME_En']; + eMPLOYEENUMBER = json['EMPLOYEE_NUMBER']; + eMPLOYEEWORKNUMBER = json['EMPLOYEE_WORK_NUMBER']; + eMPLOYMENTCATEGORY = json['EMPLOYMENT_CATEGORY']; + eMPLOYMENTCATEGORYMEANING = json['EMPLOYMENT_CATEGORY_MEANING']; + employeeQR = json['EmployeeQR']; + fREQUENCY = json['FREQUENCY']; + fREQUENCYMEANING = json['FREQUENCY_MEANING']; + fROMROWNUM = json['FROM_ROW_NUM']; + gRADEID = json['GRADE_ID']; + gRADENAME = json['GRADE_NAME']; + hIREDATE = json['HIRE_DATE']; + jOBID = json['JOB_ID']; + jOBNAME = json['JOB_NAME']; + jOBNAMEAr = json['JOB_NAME_Ar']; + jOBNAMEEn = json['JOB_NAME_En']; + lEDGERID = json['LEDGER_ID']; + lOCATIONID = json['LOCATION_ID']; + lOCATIONNAME = json['LOCATION_NAME']; + mANUALTIMECARDFLAG = json['MANUAL_TIMECARD_FLAG']; + mANUALTIMECARDMEANING = json['MANUAL_TIMECARD_MEANING']; + mobileNumberWithZipCode = json['MobileNumberWithZipCode']; + nATIONALITYCODE = json['NATIONALITY_CODE']; + nATIONALITYMEANING = json['NATIONALITY_MEANING']; + nATIONALIDENTIFIER = json['NATIONAL_IDENTIFIER']; + nORMALHOURS = json['NORMAL_HOURS']; + nOOFROWS = json['NO_OF_ROWS']; + oRGANIZATIONID = json['ORGANIZATION_ID']; + oRGANIZATIONNAME = json['ORGANIZATION_NAME']; + pAYROLLCODE = json['PAYROLL_CODE']; + pAYROLLID = json['PAYROLL_ID']; + pAYROLLNAME = json['PAYROLL_NAME']; + pERSONID = json['PERSON_ID']; + pERSONTYPE = json['PERSON_TYPE']; + pERSONTYPEID = json['PERSON_TYPE_ID']; + pERINFORMATIONCATEGORY = json['PER_INFORMATION_CATEGORY']; + pOSITIONID = json['POSITION_ID']; + pOSITIONNAME = json['POSITION_NAME']; + pRIMARYFLAG = json['PRIMARY_FLAG']; + rOWNUM = json['ROW_NUM']; + sERVICEDAYS = json['SERVICE_DAYS']; + sERVICEMONTHS = json['SERVICE_MONTHS']; + sERVICEYEARS = json['SERVICE_YEARS']; + sUPERVISORASSIGNMENTID = json['SUPERVISOR_ASSIGNMENT_ID']; + sUPERVISORDISPLAYNAME = json['SUPERVISOR_DISPLAY_NAME']; + sUPERVISOREMAILADDRESS = json['SUPERVISOR_EMAIL_ADDRESS']; + sUPERVISORID = json['SUPERVISOR_ID']; + sUPERVISORMOBILENUMBER = json['SUPERVISOR_MOBILE_NUMBER']; + sUPERVISORNAME = json['SUPERVISOR_NAME']; + sUPERVISORNUMBER = json['SUPERVISOR_NUMBER']; + sUPERVISORWORKNUMBER = json['SUPERVISOR_WORK_NUMBER']; + sWIPESEXEMPTEDFLAG = json['SWIPES_EXEMPTED_FLAG']; + sWIPESEXEMPTEDMEANING = json['SWIPES_EXEMPTED_MEANING']; + sYSTEMPERSONTYPE = json['SYSTEM_PERSON_TYPE']; + tKEMAILADDRESS = json['TK_EMAIL_ADDRESS']; + tKEMPLOYEEDISPLAYNAME = json['TK_EMPLOYEE_DISPLAY_NAME']; + tKEMPLOYEENAME = json['TK_EMPLOYEE_NAME']; + tKEMPLOYEENUMBER = json['TK_EMPLOYEE_NUMBER']; + tKPERSONID = json['TK_PERSON_ID']; + tOROWNUM = json['TO_ROW_NUM']; + uNITNUMBER = json['UNIT_NUMBER']; + uSERSTATUS = json['USER_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['ACTUAL_TERMINATION_DATE'] = this.aCTUALTERMINATIONDATE; + data['ASSIGNMENT_END_DATE'] = this.aSSIGNMENTENDDATE; + data['ASSIGNMENT_ID'] = this.aSSIGNMENTID; + data['ASSIGNMENT_NUMBER'] = this.aSSIGNMENTNUMBER; + data['ASSIGNMENT_START_DATE'] = this.aSSIGNMENTSTARTDATE; + data['ASSIGNMENT_STATUS_TYPE_ID'] = this.aSSIGNMENTSTATUSTYPEID; + data['ASSIGNMENT_TYPE'] = this.aSSIGNMENTTYPE; + data['BUSINESS_GROUP_ID'] = this.bUSINESSGROUPID; + data['BUSINESS_GROUP_NAME'] = this.bUSINESSGROUPNAME; + data['BusinessCardQR'] = this.businessCardQR; + data['CURRENT_EMPLOYEE_FLAG'] = this.cURRENTEMPLOYEEFLAG; + data['EMPLOYEE_DISPLAY_NAME'] = this.eMPLOYEEDISPLAYNAME; + data['EMPLOYEE_DISPLAY_NAME_Ar'] = this.eMPLOYEEDISPLAYNAMEAr; + data['EMPLOYEE_DISPLAY_NAME_En'] = this.eMPLOYEEDISPLAYNAMEEn; + data['EMPLOYEE_EMAIL_ADDRESS'] = this.eMPLOYEEEMAILADDRESS; + data['EMPLOYEE_IMAGE'] = this.eMPLOYEEIMAGE; + data['EMPLOYEE_MOBILE_NUMBER'] = this.eMPLOYEEMOBILENUMBER; + data['EMPLOYEE_NAME'] = this.eMPLOYEENAME; + data['EMPLOYEE_NAME_Ar'] = this.eMPLOYEENAMEAr; + data['EMPLOYEE_NAME_En'] = this.eMPLOYEENAMEEn; + data['EMPLOYEE_NUMBER'] = this.eMPLOYEENUMBER; + data['EMPLOYEE_WORK_NUMBER'] = this.eMPLOYEEWORKNUMBER; + data['EMPLOYMENT_CATEGORY'] = this.eMPLOYMENTCATEGORY; + data['EMPLOYMENT_CATEGORY_MEANING'] = this.eMPLOYMENTCATEGORYMEANING; + data['EmployeeQR'] = this.employeeQR; + data['FREQUENCY'] = this.fREQUENCY; + data['FREQUENCY_MEANING'] = this.fREQUENCYMEANING; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['GRADE_ID'] = this.gRADEID; + data['GRADE_NAME'] = this.gRADENAME; + data['HIRE_DATE'] = this.hIREDATE; + data['JOB_ID'] = this.jOBID; + data['JOB_NAME'] = this.jOBNAME; + data['JOB_NAME_Ar'] = this.jOBNAMEAr; + data['JOB_NAME_En'] = this.jOBNAMEEn; + data['LEDGER_ID'] = this.lEDGERID; + data['LOCATION_ID'] = this.lOCATIONID; + data['LOCATION_NAME'] = this.lOCATIONNAME; + data['MANUAL_TIMECARD_FLAG'] = this.mANUALTIMECARDFLAG; + data['MANUAL_TIMECARD_MEANING'] = this.mANUALTIMECARDMEANING; + data['MobileNumberWithZipCode'] = this.mobileNumberWithZipCode; + data['NATIONALITY_CODE'] = this.nATIONALITYCODE; + data['NATIONALITY_MEANING'] = this.nATIONALITYMEANING; + data['NATIONAL_IDENTIFIER'] = this.nATIONALIDENTIFIER; + data['NORMAL_HOURS'] = this.nORMALHOURS; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['ORGANIZATION_ID'] = this.oRGANIZATIONID; + data['ORGANIZATION_NAME'] = this.oRGANIZATIONNAME; + data['PAYROLL_CODE'] = this.pAYROLLCODE; + data['PAYROLL_ID'] = this.pAYROLLID; + data['PAYROLL_NAME'] = this.pAYROLLNAME; + data['PERSON_ID'] = this.pERSONID; + data['PERSON_TYPE'] = this.pERSONTYPE; + data['PERSON_TYPE_ID'] = this.pERSONTYPEID; + data['PER_INFORMATION_CATEGORY'] = this.pERINFORMATIONCATEGORY; + data['POSITION_ID'] = this.pOSITIONID; + data['POSITION_NAME'] = this.pOSITIONNAME; + data['PRIMARY_FLAG'] = this.pRIMARYFLAG; + data['ROW_NUM'] = this.rOWNUM; + data['SERVICE_DAYS'] = this.sERVICEDAYS; + data['SERVICE_MONTHS'] = this.sERVICEMONTHS; + data['SERVICE_YEARS'] = this.sERVICEYEARS; + data['SUPERVISOR_ASSIGNMENT_ID'] = this.sUPERVISORASSIGNMENTID; + data['SUPERVISOR_DISPLAY_NAME'] = this.sUPERVISORDISPLAYNAME; + data['SUPERVISOR_EMAIL_ADDRESS'] = this.sUPERVISOREMAILADDRESS; + data['SUPERVISOR_ID'] = this.sUPERVISORID; + data['SUPERVISOR_MOBILE_NUMBER'] = this.sUPERVISORMOBILENUMBER; + data['SUPERVISOR_NAME'] = this.sUPERVISORNAME; + data['SUPERVISOR_NUMBER'] = this.sUPERVISORNUMBER; + data['SUPERVISOR_WORK_NUMBER'] = this.sUPERVISORWORKNUMBER; + data['SWIPES_EXEMPTED_FLAG'] = this.sWIPESEXEMPTEDFLAG; + data['SWIPES_EXEMPTED_MEANING'] = this.sWIPESEXEMPTEDMEANING; + data['SYSTEM_PERSON_TYPE'] = this.sYSTEMPERSONTYPE; + data['TK_EMAIL_ADDRESS'] = this.tKEMAILADDRESS; + data['TK_EMPLOYEE_DISPLAY_NAME'] = this.tKEMPLOYEEDISPLAYNAME; + data['TK_EMPLOYEE_NAME'] = this.tKEMPLOYEENAME; + data['TK_EMPLOYEE_NUMBER'] = this.tKEMPLOYEENUMBER; + data['TK_PERSON_ID'] = this.tKPERSONID; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['UNIT_NUMBER'] = this.uNITNUMBER; + data['USER_STATUS'] = this.uSERSTATUS; + return data; + } +} \ No newline at end of file diff --git a/lib/models/privilege_list_model.dart b/lib/models/privilege_list_model.dart new file mode 100644 index 0000000..3ef3954 --- /dev/null +++ b/lib/models/privilege_list_model.dart @@ -0,0 +1,21 @@ +class PrivilegeListModel { + int? iD; + String? serviceName; + bool? previlege; + + PrivilegeListModel({this.iD, this.serviceName, this.previlege}); + + PrivilegeListModel.fromJson(Map json) { + iD = json['ID']; + serviceName = json['ServiceName']; + previlege = json['Previlege']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ServiceName'] = this.serviceName; + data['Previlege'] = this.previlege; + return data; + } +} diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index c28da2f..51987cd 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -15,9 +15,7 @@ class AppTheme { }, ), hintColor: Colors.grey[400], - colorScheme: ColorScheme.fromSwatch( - - ), + colorScheme: ColorScheme.fromSwatch(accentColor: MyColors.backgroundColor), disabledColor: Colors.grey[300], errorColor: const Color.fromRGBO(235, 80, 60, 1.0), scaffoldBackgroundColor: MyColors.backgroundColor, diff --git a/lib/ui/login/verify_login_screen.dart b/lib/ui/login/verify_login_screen.dart index 26b978f..b28ad4d 100644 --- a/lib/ui/login/verify_login_screen.dart +++ b/lib/ui/login/verify_login_screen.dart @@ -624,21 +624,30 @@ class _VerifyLoginScreenState extends State { // isMoreOption = true; }); } else { + Utils.showLoading(context); 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 { - GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(false, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().username); - if (genericResponseModel?.errorMessage != null) { - Utils.showToast(genericResponseModel?.errorMessage ?? ""); - // Navigator.pop(context); + 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 route) => false); + } catch (ex) { + print(ex); + Utils.hideLoading(context); + Utils.handleException(ex, null); } - - Navigator.pushNamedAndRemoveUntil(context, AppRoutes.dashboard, (Route route) => false); - // this.checkActivationCode(value: value); }, () => { Navigator.pop(context),