From ba50ed580931f4556c32970ddf5c4a409ab14eff Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Tue, 24 Dec 2024 15:13:57 +0300 Subject: [PATCH] add swipe and forget password apis --- lib/controllers/api_routes/urls.dart | 13 +- .../providers/api/user_provider.dart | 90 ++++ lib/dashboard_latest/dashboard_provider.dart | 86 +++- lib/extensions/enum_extensions.dart | 14 + lib/models/enums/swipe_type.dart | 5 + .../new_models/general_response_model.dart | 32 ++ lib/models/new_models/swipe_model.dart | 66 +++ lib/models/new_models/update_password.dart | 31 ++ .../land_page/mark_attendance_widget.dart | 475 ++++++++++++------ lib/new_views/pages/login_page.dart | 18 +- lib/nfc/nfc_reader_sheet.dart | 8 +- 11 files changed, 663 insertions(+), 175 deletions(-) create mode 100644 lib/models/enums/swipe_type.dart create mode 100644 lib/models/new_models/general_response_model.dart create mode 100644 lib/models/new_models/swipe_model.dart create mode 100644 lib/models/new_models/update_password.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 16961141..2062185b 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -5,7 +5,8 @@ class URLs { static const host1 = "https://atomsmdev.hmg.com"; // local UAT url // static String _baseUrl = "$_host/mobile"; - static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis + // static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis + static final String _baseUrl = "$_host/v3/mobile"; // new V3 apis static String _host = host1; @@ -18,6 +19,11 @@ class URLs { // API Routes static get login => "$_baseUrl/MobileAuth/Login"; // web login static get checkLoginValidation => "$_baseUrl/Account/Authenticate"; // web login + //Reset Password Apis... + static get sendForgetPasswordOtp => "$_baseUrl/Account/SendForgotPasswordOtp"; // send OTP. + static get sendForgetPasswordValidateOtp => "$_baseUrl/Account/SendForgotPasswordValidateOtp"; // validate OTP. + static get updateNewPassword => "$_baseUrl/Account/UpdatenewPassword"; // validate OTP. + // static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // mobile login static get register => "$_baseUrl/handle/create/user"; // post static get updateProfile => "$_baseUrl/update/user/profile"; // post @@ -70,6 +76,11 @@ class URLs { static get sendOtpUrl=> '$_baseUrl/SmsNotification/SendOTP/'; static get verifyOtpUrl=> '$_baseUrl/SmsNotification/VerifyOTP/'; // 08051 + //Swipe module Apis need to ask backend why base url changed for this api.. + static get swipeUrl=> '$_baseUrl/Swipe/Swipe'; + static get getSwipeLastTransactionUrl=> '$_baseUrl/Swipe/GetLastTransaction'; + + //service request..... static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get static get getServiceRequestById => "$_baseUrl/CallRequest/GetCallRequestById"; // get static get getServiceRequestThrough => "$_baseUrl/Lookups/GetLookup?lookupEnum=603"; // get diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 6db0fdc1..eacef64d 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/new_models/general_response_model.dart'; import 'package:test_sa/models/user.dart'; import '../../../new_views/common_widgets/app_lazy_loading.dart'; @@ -116,7 +117,96 @@ class UserProvider extends ChangeNotifier { // } // return response.statusCode; // } + Future sendForgetPasswordOtp({required BuildContext context, required String employeeId}) async { + GeneralResponseModel responseModel= GeneralResponseModel(responseCode: -1) ; + if (_loading == true) return responseModel; + _loading = true; + notifyListeners(); + Response response; + try { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + response = await ApiManager.instance.postWithOutBody( + URLs.sendOtpUrl + '?$employeeId', + ); + responseModel = GeneralResponseModel.fromJson(json.decode(response.body)); + _loading = false; + if (response.statusCode >= 200 && response.statusCode < 300) { + notifyListeners(); + Navigator.pop(context); + return responseModel; + } + notifyListeners(); + Navigator.pop(context); + return responseModel; + } catch (error) { + // debugPrint(error); + Navigator.pop(context); + _loading = false; + notifyListeners(); + return responseModel; + } + } + + Future forgetPasswordValidateOtp({required BuildContext context, required String employeeId, required String otp}) async { + GeneralResponseModel responseModel= GeneralResponseModel(responseCode: -1) ; + if (_loading == true) return responseModel; + _loading = true; + notifyListeners(); + Response response; + try { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + response = await ApiManager.instance.postWithOutBody( + URLs.sendOtpUrl + '?employeeId=$employeeId&otp=$otp', + ); + responseModel = GeneralResponseModel.fromJson(json.decode(response.body)); + _loading = false; + if (response.statusCode >= 200 && response.statusCode < 300) { + notifyListeners(); + Navigator.pop(context); + return responseModel; + } + notifyListeners(); + Navigator.pop(context); + return responseModel; + } catch (error) { + // debugPrint(error); + Navigator.pop(context); + _loading = false; + notifyListeners(); + return responseModel; + } + } + + Future updateNewPassword({required BuildContext context, required String userId}) async { + GeneralResponseModel responseModel= GeneralResponseModel(responseCode: -1) ; + if (_loading == true) return responseModel; + _loading = true; + notifyListeners(); + Response response; + try { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + response = await ApiManager.instance.postWithOutBody( + URLs.sendOtpUrl + userId, + ); + responseModel = GeneralResponseModel.fromJson(json.decode(response.body)); + _loading = false; + if (response.statusCode >= 200 && response.statusCode < 300) { + notifyListeners(); + Navigator.pop(context); + return responseModel; + } + notifyListeners(); + Navigator.pop(context); + return responseModel; + } catch (error) { + // debugPrint(error); + Navigator.pop(context); + _loading = false; + notifyListeners(); + return responseModel; + } + } Future uploadProfileImage(String userId, File image) async { if (_loading == true) return -2; _loading = true; diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index f44a0071..0e24590d 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -8,6 +8,7 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/dashboard_count.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD; +import 'package:test_sa/models/new_models/swipe_model.dart'; import '../controllers/providers/api/user_provider.dart'; @@ -85,7 +86,7 @@ class DashBoardProvider extends ChangeNotifier { setTabs(userType: userType, context: context); getDashBoardCount(usersType: userType); resetRequestDataList(); - getRequestDetail(usersType: userType, status: tabs[currentListIndex].tag,tabId:tabs[currentListIndex].id); + getRequestDetail(usersType: userType, status: tabs[currentListIndex].tag, tabId: tabs[currentListIndex].id); // notifyListeners(); } @@ -184,7 +185,55 @@ class DashBoardProvider extends ChangeNotifier { getRequestDetail(showLoader: showLoader, usersType: usersType, status: 4); } - Future getRequestDetail({bool showLoader = true, required UsersTypes usersType, int? status, bool isHighPriority = false, bool isOverdue = false, String? date,int? tabId}) async { + Future makeSwipe({required Swipe model}) async { + isLoading = true; + SwipeModel swipeResponse = SwipeModel(data: false, message: '', responseCode: 0, isSuccess: false); + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.post(URLs.swipeUrl, body: model.toJson()); + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + swipeResponse = SwipeModel.fromJson(json.decode(response.body)); + } + + isAllCountLoading = false; + notifyListeners(); + return swipeResponse; + } catch (error) { + isAllCountLoading = false; + stateCode = -1; + notifyListeners(); + return swipeResponse; + } + } + + Future getSwipeLastTransaction({required String userId}) async { + isLoading = true; + notifyListeners(); + Response response; + var body = { + "userId": userId, + }; + try { + response = await ApiManager.instance.post(URLs.getSwipeLastTransactionUrl, body: body); + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) {} + + isAllCountLoading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + isAllCountLoading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } + + Future getRequestDetail({bool showLoader = true, required UsersTypes usersType, int? status, bool isHighPriority = false, bool isOverdue = false, String? date, int? tabId}) async { if (showLoader) { isDetailLoading = showLoader; notifyListeners(); @@ -200,14 +249,11 @@ class DashBoardProvider extends ChangeNotifier { //these checks are to call different apis for dashboard for engineer... if (status == 0) { url = URLs.engineerDashboardUpcoming; - } - else if (status == 1&&tabId==1) { + } else if (status == 1 && tabId == 1) { url = URLs.engineerDashboardNotAssignDetails; - } - else if (status == 1&&tabId==2) { + } else if (status == 1 && tabId == 2) { url = URLs.engineerDashboardDetailsUrl; - } - else { + } else { url = URLs.engineerDashboardDetailsUrl; } } else { @@ -217,7 +263,7 @@ class DashBoardProvider extends ChangeNotifier { Map body = {"pageNumber": pageNum, "pageSize": pageItemNumber}; if (status != null && status == 0) { - body["date"] = date ??upcomingFilterSelectedDate.toIso8601String(); + body["date"] = date ?? upcomingFilterSelectedDate.toIso8601String(); } else { body["statusValue"] = status; } @@ -311,26 +357,26 @@ class CategoryTabs { int id; CategoryTabs({ - required this.label, + required this.label, required this.tag, - required this.id, + required this.id, }); static List getTabs({required UsersTypes userType, required BuildContext context}) { List tabs = []; if (userType == UsersTypes.engineer) { - tabs.add(CategoryTabs(label: 'Upcoming',tag: 0,id: 0)); + tabs.add(CategoryTabs(label: 'Upcoming', tag: 0, id: 0)); // tabs.add(CategoryTabs('Open', 1)); - tabs.add(CategoryTabs(label: 'UnAssigned Open',tag: 1,id: 1)); - tabs.add(CategoryTabs(label: 'Assigned Open',tag: 1,id: 2)); - tabs.add(CategoryTabs(label: 'In Progress',tag: 2,id: 3)); - tabs.add(CategoryTabs(label: 'Completed',tag: 3,id: 4)); + tabs.add(CategoryTabs(label: 'UnAssigned Open', tag: 1, id: 1)); + tabs.add(CategoryTabs(label: 'Assigned Open', tag: 1, id: 2)); + tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3)); + tabs.add(CategoryTabs(label: 'Completed', tag: 3, id: 4)); return tabs; } - tabs.add(CategoryTabs(label: 'Upcoming',tag: 3,id: 1)); - tabs.add(CategoryTabs(label: 'Open Request',tag: 1,id: 2)); - tabs.add(CategoryTabs(label: 'In Progress',tag: 2,id: 3)); - tabs.add(CategoryTabs(label: 'Canceled',tag: 6,id: 4)); + tabs.add(CategoryTabs(label: 'Upcoming', tag: 3, id: 1)); + tabs.add(CategoryTabs(label: 'Open Request', tag: 1, id: 2)); + tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3)); + tabs.add(CategoryTabs(label: 'Canceled', tag: 6, id: 4)); return tabs; } } diff --git a/lib/extensions/enum_extensions.dart b/lib/extensions/enum_extensions.dart index 9e634cb6..ced51f78 100644 --- a/lib/extensions/enum_extensions.dart +++ b/lib/extensions/enum_extensions.dart @@ -1,4 +1,5 @@ import 'package:test_sa/app_strings/app_asset.dart'; +import 'package:test_sa/models/enums/swipe_type.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart'; extension EnumExtensionsWorkOrder on WorkOrderNextStepEnum { @@ -92,3 +93,16 @@ extension IntExtensionsWorkOrder on int { } } } + +extension EnumExtensionsSwipeType on SwipeTypeEnum { + int getIntFromSwipeTypeEnum() { + switch (this) { + case SwipeTypeEnum.NFC: + return 1; + case SwipeTypeEnum.QR: + return 2; + case SwipeTypeEnum.Wifi: + return 3; + } + } +} diff --git a/lib/models/enums/swipe_type.dart b/lib/models/enums/swipe_type.dart new file mode 100644 index 00000000..265aed42 --- /dev/null +++ b/lib/models/enums/swipe_type.dart @@ -0,0 +1,5 @@ +enum SwipeTypeEnum { + NFC, // 1 + QR, // 2 + Wifi, // 3 +} diff --git a/lib/models/new_models/general_response_model.dart b/lib/models/new_models/general_response_model.dart new file mode 100644 index 00000000..64c7d031 --- /dev/null +++ b/lib/models/new_models/general_response_model.dart @@ -0,0 +1,32 @@ +class GeneralResponseModel { + bool? data; + String? message; + String? title; + String? innerMessage; + int? responseCode; + bool? isSuccess; + + GeneralResponseModel({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess}); + + factory GeneralResponseModel.fromJson(Map json) { + return GeneralResponseModel( + data: json['data'], + message: json['message'] ?? '', + title: json['title'], + innerMessage: json['innerMessage'], + responseCode: json['responseCode'], + isSuccess: json['isSuccess'], + ); + } + + Map toJson() { + return { + 'data': data, + 'message': message, + 'title': title, + 'innerMessage': innerMessage, + 'responseCode': responseCode, + 'isSuccess': isSuccess, + }; + } +} \ No newline at end of file diff --git a/lib/models/new_models/swipe_model.dart b/lib/models/new_models/swipe_model.dart new file mode 100644 index 00000000..54868703 --- /dev/null +++ b/lib/models/new_models/swipe_model.dart @@ -0,0 +1,66 @@ + +class SwipeModel { + final bool data; + final String message; + final String? title; + final String? innerMessage; + final int responseCode; + final bool isSuccess; + + SwipeModel({ + required this.data, + required this.message, + this.title, + this.innerMessage, + required this.responseCode, + required this.isSuccess, + }); + + factory SwipeModel.fromJson(Map json) { + return SwipeModel( + data: json['data'] as bool, + message: json['message'] as String, + title: json['title'] as String?, + innerMessage: json['innerMessage'] as String?, + responseCode: json['responseCode'] as int, + isSuccess: json['isSuccess'] as bool, + ); + } + + Map toJson() { + return { + 'data': data, + 'message': message, + 'title': title, + 'innerMessage': innerMessage, + 'responseCode': responseCode, + 'isSuccess': isSuccess, + }; + } + + +} + +class Swipe { + final int swipeTypeValue; + final String value; + final double ?latitude; + final double ?longitude; + + Swipe({ + required this.swipeTypeValue, + required this.value, + required this.latitude, + required this.longitude, + }); + + Map toJson() { + return { + 'swipeTypeValue': swipeTypeValue, + 'value': value, + 'latitude': latitude, + 'longitude': longitude, + }; + } +} + diff --git a/lib/models/new_models/update_password.dart b/lib/models/new_models/update_password.dart new file mode 100644 index 00000000..34d7ec52 --- /dev/null +++ b/lib/models/new_models/update_password.dart @@ -0,0 +1,31 @@ +class UpdatePassword { + final String password; + final String confirmPassword; + final String email; + final String token; + + UpdatePassword({ + required this.password, + required this.confirmPassword, + required this.email, + required this.token, + }); + + factory UpdatePassword.fromJson(Map json) { + return UpdatePassword( + password: json['password'] as String, + confirmPassword: json['confirmPassword'] as String, + email: json['email'] as String, + token: json['token'] as String, + ); + } + + Map toJson() { + return { + 'password': password, + 'confirmPassword': confirmPassword, + 'email': email, + 'token': token, + }; + } +} diff --git a/lib/new_views/pages/land_page/mark_attendance_widget.dart b/lib/new_views/pages/land_page/mark_attendance_widget.dart index 77385429..ab5769b1 100644 --- a/lib/new_views/pages/land_page/mark_attendance_widget.dart +++ b/lib/new_views/pages/land_page/mark_attendance_widget.dart @@ -1,34 +1,25 @@ import 'dart:async'; +import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geolocator/geolocator.dart'; import 'package:huawei_location/huawei_location.dart'; -// import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; -// import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; // import 'package:platform_device_id/platform_device_id.dart'; import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart'; +import 'package:test_sa/extensions/enum_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/helper/utils.dart'; +import 'package:test_sa/models/enums/swipe_type.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/new_models/swipe_model.dart'; import 'package:test_sa/nfc/nfc_reader_sheet.dart'; -// import 'package:mohem_flutter_app/api/dashboard_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/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/generic_response_model.dart'; -// import 'package:mohem_flutter_app/models/privilege_list_model.dart'; -// import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; -// import 'package:mohem_flutter_app/ui/dialogs/success_dialog.dart'; -// import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; -// import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';im - import 'package:test_sa/utilities/Location.dart' as location; import 'package:test_sa/views/widgets/dialogs/confirm_dialog.dart'; import 'package:test_sa/views/widgets/dialogs/success_dialog.dart'; @@ -174,7 +165,10 @@ class _MarkAttendanceWidgetState extends State { gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8), children: [ - attendanceMethod("NFC", Icons.nfc, isNfcEnabled, () { + attendanceMethod(SwipeTypeEnum.NFC.name, Icons.nfc, true, () { + log('i am here...nfc'); + handleSwipe(swipeType: SwipeTypeEnum.NFC, isEnable: true); + return; // if (AppState().getIsHuawei) { if (false) { checkHuaweiLocationPermission("NFC"); @@ -284,7 +278,9 @@ class _MarkAttendanceWidgetState extends State { } }), // if (isQrEnabled) //todo - attendanceMethod("QR", Icons.qr_code_2, isQrEnabled, () async { + attendanceMethod(SwipeTypeEnum.QR.name, Icons.qr_code_2, true, () async { + handleSwipe(swipeType: SwipeTypeEnum.QR, isEnable: true); + return; // if (AppState().getIsHuawei) { if (false) { checkHuaweiLocationPermission("QR"); @@ -345,6 +341,77 @@ class _MarkAttendanceWidgetState extends State { ); } + void handleSwipe({required SwipeTypeEnum swipeType,required bool isEnable,}){ + log('handle swipe value is ${swipeType.name}'); + // if (AppState().getIsHuawei) { + if (false) { + checkHuaweiLocationPermission("NFC"); + } else { + location.Location.isEnabled((bool isEnabled) { + if (isEnabled) { + location.Location.havePermission((bool permission) { + if (permission) { + Utils.showLoading(context); + location.Location.getCurrentLocation( + (Position position, bool isMocked) { + if (isMocked) { + Utils.hideLoading(context); + markFakeAttendance(swipeType.name, position.latitude.toString() ?? "", position.longitude.toString() ?? ""); + } else { + Utils.hideLoading(context); + //todo performNfcAttendance(widget.model, lat: position.latitude.toString() ?? "", lng: position.longitude.toString() ?? ""); + handleSwipeOperation(swipeType: swipeType,lat: position.latitude,lang: position.longitude); + } + }, + () { + Utils.hideLoading(context); + Utils.confirmDialog(context, "Unable to determine your location, Please make sure that your location services are turned on & working."); + }, + context, + ); + } else { + showDialog( + context: context, + builder: (BuildContext cxt) => ConfirmDialog( + message: "You need to give location permission to mark attendance", + onTap: () async { + Navigator.pop(context); + await Geolocator.openAppSettings(); + }, + ), + ); + } + }); + } else { + showDialog( + context: context, + builder: (BuildContext cxt) => ConfirmDialog( + message: "You need to enable location services to mark attendance", + onTap: () async { + Navigator.pop(context); + await Geolocator.openLocationSettings(); + }, + ), + ); + } + }); + } + } + + void handleSwipeOperation({required SwipeTypeEnum swipeType,double ?lat, double ?lang}){ + switch(swipeType){ + case SwipeTypeEnum.NFC: + handleNfcAttendance(latitude: lat,longitude: lang); + return; + case SwipeTypeEnum.QR: + performQrCodeAttendance(latitude: lat,longitude: lang); + return; + case SwipeTypeEnum.Wifi: + return; + + } + } + void getHuaweiCurrentLocation(String attendanceType) async { try { Utils.showLoading(context); @@ -399,93 +466,198 @@ class _MarkAttendanceWidgetState extends State { // } // } // }).catchError((error) { - // print("HUAWEI LOCATION getLastLocation ERROR!!!!!"); - // print(error); + // log("HUAWEI LOCATION getLastLocation ERROR!!!!!"); + // log(error); // }); // }).catchError((error) { - // print("HUAWEI LOCATION checkLocationSettings ERROR!!!!!"); - // print(error); + // log("HUAWEI LOCATION checkLocationSettings ERROR!!!!!"); + // log(error); // if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") { // // Location service not enabled. // } // }); } catch (error) { - print("HUAWEI LOCATION ERROR!!!!!"); - print(error); + log("HUAWEI LOCATION ERROR!!!!!"); + log('$error'); Utils.hideLoading(context); // Utils.handleException(error, context, null); } } - // - // Future performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { - // if (Platform.isIOS) { - // Utils.readNFc(onRead: (String nfcId) async { - // Utils.showLoading(context); - // try { - // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId, isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); - // if (g?.messageStatus != 1) { - // Utils.hideLoading(context); - // showDialog( - // context: context, - // builder: (BuildContext cxt) => ConfirmDialog( - // message: g?.errorEndUserMessage ?? "Unexpected error occurred", - // onTap: () { - // Navigator.pop(context); - // }, - // ), - // ); - // } else { - // bool status = await model.fetchAttendanceTracking(context); - // if (Platform.isIOS) await Future.delayed(const Duration(seconds: 3)); - // Utils.hideLoading(context); - // showMDialog( - // context, - // backgroundColor: Colors.transparent, - // isDismissable: true, - // child: SuccessDialog(widget.isFromDashboard), - // ); - // } - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } - // }); - // } else { - // showNfcReader(context, onNcfScan: (String? nfcId) async { - // Utils.showLoading(context); - // try { - // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); - // if (g?.messageStatus != 1) { - // Utils.hideLoading(context); - // showDialog( - // context: context, - // builder: (BuildContext cxt) => ConfirmDialog( - // message: g?.errorEndUserMessage ?? "Unexpected error occurred", - // onTap: () { - // Navigator.pop(context); - // }, - // ), - // ); - // } else { - // bool status = await model.fetchAttendanceTracking(context); - // Utils.hideLoading(context); - // showMDialog( - // context, - // backgroundColor: Colors.transparent, - // isDismissable: false, - // child: SuccessDialog(widget.isFromDashboard), - // ); - // } - // } catch (ex) { - // print(ex); - // Utils.hideLoading(context); - // // Utils.handleException(ex, context, (String msg) { - // // Utils.confirmDialog(context, msg); - // // }); - // } - // }); - // } - // } + + Future handleNfcAttendance({double? latitude = 0, double? longitude = 0}) async { + final dashBoardProvider = Provider.of(context, listen: false); + + if (Platform.isIOS) { + Utils.readNFc(onRead: (String nfcId) async { + await _processNfcAttendance(dashBoardProvider, nfcId, latitude, longitude); + }); + } else { + showNfcReader(context, onNcfScan: (String? nfcId) async { + await _processNfcAttendance(dashBoardProvider, nfcId ?? '', latitude, longitude); + }); + } + } + + + Future _processNfcAttendance( + DashBoardProvider dashBoardProvider, + String nfcId, + double? latitude, + double? longitude, + ) async { + Utils.showLoading(context); + try { + final swipeModel = Swipe( + swipeTypeValue: SwipeTypeEnum.NFC.getIntFromSwipeTypeEnum(), + value: nfcId, + latitude: latitude, + longitude: longitude, + ); + + final swipeResponse = await dashBoardProvider.makeSwipe(model: swipeModel); + log('swipe response i got is ${swipeResponse.toJson()}'); + + if (swipeResponse.responseCode != 1) { + Utils.hideLoading(context); + _showErrorDialog(swipeResponse.message ?? "Unexpected error occurred"); + } else { + final isSuccess = swipeResponse.data; + log('nfc swipe response is ${isSuccess}'); + if (Platform.isIOS) await Future.delayed(const Duration(seconds: 3)); + Utils.hideLoading(context); + _showSuccessDialog(); + } + } catch (error) { + Utils.hideLoading(context); + // Uncomment below line for error handling if needed + // Utils.handleException(error, context, null); + } + } + + + void _showErrorDialog(String message) { + showDialog( + context: context, + builder: (context) => ConfirmDialog( + message: message, + onTap: () => Navigator.pop(context), + ), + ); + } + + void _showSuccessDialog() { + showMDialog( + context, + backgroundColor: Colors.transparent, + isDismissable: true, + child: SuccessDialog(widget.isFromDashboard), + ); + } + + + //older code.... + Future performNfcAttendance({double? lat = 0, double ?lng = 0}) async { + DashBoardProvider dashBoardProvider = Provider.of(context,listen:false); + if (Platform.isIOS) { + Utils.readNFc(onRead: (String nfcId) async { + Utils.showLoading(context); + try { + SwipeModel? swipeResponse = await dashBoardProvider.makeSwipe(model: Swipe(swipeTypeValue: SwipeTypeEnum.NFC.getIntFromSwipeTypeEnum(), value: '', latitude: lat, longitude: lng)); + if (swipeResponse.responseCode != 1) { + Utils.hideLoading(context); + showDialog( + context: context, + builder: (BuildContext cxt) => ConfirmDialog( + message: swipeResponse.message ?? "Unexpected error occurred", + onTap: () { + Navigator.pop(context); + }, + ), + ); + } else { + bool status = swipeResponse.data; + if (Platform.isIOS) await Future.delayed(const Duration(seconds: 3)); + Utils.hideLoading(context); + showMDialog( + context, + backgroundColor: Colors.transparent, + isDismissable: true, + child: SuccessDialog(widget.isFromDashboard), + ); + } + } catch (ex) { + Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + } + }); + } else { + showNfcReader(context, onNcfScan: (String? nfcId) async { + Utils.showLoading(context); + try { + SwipeModel? swipeResponse = await dashBoardProvider.makeSwipe(model: Swipe(swipeTypeValue: SwipeTypeEnum.NFC.getIntFromSwipeTypeEnum(), value: nfcId??'', latitude: lat, longitude: lng)); + log('api response i got is ${swipeResponse.toJson()}'); + if (swipeResponse.responseCode != 1) { + Utils.hideLoading(context); + showDialog( + context: context, + builder: (BuildContext cxt) => ConfirmDialog( + message: swipeResponse.message ?? "Unexpected error occurred", + onTap: () { + Navigator.pop(context); + }, + ), + ); + } else { + bool status = swipeResponse.data; //use this status to get transactions. + if (Platform.isIOS) await Future.delayed(const Duration(seconds: 3)); + Utils.hideLoading(context); + showMDialog( + context, + backgroundColor: Colors.transparent, + isDismissable: true, + child: SuccessDialog(widget.isFromDashboard), + ); + } + } catch (ex) { + Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + } + // Utils.showLoading(context); + // try { + // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); + // if (g?.messageStatus != 1) { + // Utils.hideLoading(context); + // showDialog( + // context: context, + // builder: (BuildContext cxt) => ConfirmDialog( + // message: g?.errorEndUserMessage ?? "Unexpected error occurred", + // onTap: () { + // Navigator.pop(context); + // }, + // ), + // ); + // } else { + // bool status = await model.fetchAttendanceTracking(context); + // Utils.hideLoading(context); + // showMDialog( + // context, + // backgroundColor: Colors.transparent, + // isDismissable: false, + // child: SuccessDialog(widget.isFromDashboard), + // ); + // } + // } catch (ex) { + // log(ex); + // Utils.hideLoading(context); + // // Utils.handleException(ex, context, (String msg) { + // // Utils.confirmDialog(context, msg); + // // }); + // } + }); + } + } + + void showMDialog(context, {Widget? child, Color? backgroundColor, bool isDismissable = true, bool isBusniessCard = false}) async { return showDialog( @@ -520,12 +692,14 @@ class _MarkAttendanceWidgetState extends State { // } // } - // Future performWifiAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { - // if (Platform.isAndroid) { - // if (!(await checkSession())) { - // return; - // } - // } + + //TODO need to confirm .... + // Future performWifiAttendance({double? latitude, double? lng}) async { + // // if (Platform.isAndroid) { + // // if (!(await checkSession())) { + // // return; + // // } + // // } // Utils.showLoading(context); // bool isConnected = await WiFiForIoTPlugin.connect(AppState().getMohemmWifiSSID ?? "", // password: AppState().getMohemmWifiPassword ?? "", joinOnce: Platform.isIOS ? false : true, security: NetworkSecurity.WPA, withInternet: false); @@ -588,54 +762,65 @@ class _MarkAttendanceWidgetState extends State { return await WiFiForIoTPlugin.disconnect(); } - // Future performQrCodeAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { - // var qrCodeValue = await Navigator.of(context).push( - // MaterialPageRoute( - // builder: (BuildContext context) => QrScannerDialog(), - // ), - // ); - // if (qrCodeValue != null) { - // Utils.showLoading(context); - // try { - // GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue); - // bool status = await model.fetchAttendanceTracking(context); - // Utils.hideLoading(context); - // if (g?.messageStatus == 2) { - // showDialog( - // barrierDismissible: true, - // context: context, - // builder: (cxt) => ConfirmDialog( - // message: g?.errorEndUserMessage ?? "", - // onTap: () { - // Navigator.pop(context); - // }, - // onCloseTap: () {}, - // ), - // ); - // } else { - // showMDialog( - // context, - // backgroundColor: Colors.transparent, - // isDismissable: true, - // child: SuccessDialog(widget.isFromDashboard), - // ); - // } - // } catch (ex) { - // print(ex); - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } - // } - // } + Future performQrCodeAttendance( {double ? latitude , double ?longitude}) async { + DashBoardProvider dashBoardProvider = Provider.of(context,listen: false); + var qrCodeValue = await Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) => QrScannerDialog(), + ), + ); + if (qrCodeValue != null) { + Utils.showLoading(context); + try { + final swipeModel = Swipe( + swipeTypeValue: SwipeTypeEnum.QR.getIntFromSwipeTypeEnum(), + value: qrCodeValue, + latitude: latitude, + longitude: longitude, + ); + log('model i got to scan qr is ${swipeModel.toJson()}'); + final swipeResponse = await dashBoardProvider.makeSwipe(model: swipeModel); + log('response of swipe is ${swipeResponse.toJson()}'); + + bool status = await swipeResponse.data; + Utils.hideLoading(context); + if (swipeResponse.responseCode == 2) { + showDialog( + barrierDismissible: true, + context: context, + builder: (cxt) => ConfirmDialog( + message: swipeResponse.message ?? "", + onTap: () { + Navigator.pop(context); + }, + onCloseTap: () {}, + ), + ); + } else { + showMDialog( + context, + backgroundColor: Colors.transparent, + isDismissable: true, + child: SuccessDialog(widget.isFromDashboard), + ); + } + } catch (ex) { + log('$ex'); + Utils.hideLoading(context); + //this need to confirm where it comes.. + // Utils.handleException(ex, context, null); + } + } + } - void markFakeAttendance(String sourceName, String lat, String long) async { + void markFakeAttendance(dynamic sourceName, String lat, String long) async { Utils.showLoading(context); try { // await DashboardApiClient().markFakeLocation(sourceName: sourceName, lat: lat, long: long); Utils.hideLoading(context); Utils.confirmDialog(context, "LocaleKeys.fakeLocation.tr()"); } catch (ex) { - print(ex); + log('$ex'); Utils.hideLoading(context); //Utils.handleException(ex, context, null); } @@ -651,8 +836,11 @@ class _MarkAttendanceWidgetState extends State { begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ - //MyColors.gradiantEndColor, - // MyColors.gradiantStartColor, + //ToDo set Colors according to design provided by designer... + Colors.blue, + Colors.green, + // AppColor.gradiantEndColor, + // MyColors.gradiantStartColor, ], ) : null, @@ -670,6 +858,7 @@ class _MarkAttendanceWidgetState extends State { ), ).onPress( () { + log('isEnabled is ${!isEnabled}'); if (!isEnabled) return; onPress(); }, diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index b2a0bd2a..7b0de848 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -271,15 +271,15 @@ class _LoginPageState extends State { }, ), 8.height, - // Align( - // alignment: AlignmentDirectional.centerEnd, - // child: InkWell( - // onTap: () { - // /// TODO [zaid] : push to another screen - // }, - // child: context.translation.forgotPassword.bodyText(context).custom(color: AppColor.primary10, fontWeight: FontWeight.w500), - // ), - // ), + Align( + alignment: AlignmentDirectional.centerEnd, + child: InkWell( + onTap: () { + print('i am here...'); + }, + child: context.translation.forgotPassword.bodyText(context).custom(color: AppColor.primary10, fontWeight: FontWeight.w500), + ), + ), Row( children: [ Checkbox( diff --git a/lib/nfc/nfc_reader_sheet.dart b/lib/nfc/nfc_reader_sheet.dart index b7b97a77..b4e2f7a4 100644 --- a/lib/nfc/nfc_reader_sheet.dart +++ b/lib/nfc/nfc_reader_sheet.dart @@ -96,9 +96,11 @@ class _NfcLayoutState extends State { SizedBox( height: 30, ), + Image.asset( - "assets/icons/nfc/ic_nfc.png", + "assets/images/nfc_dummy.png", height: MediaQuery.of(context).size.width / 3, + width: double.infinity, ), SizedBox( height: 30, @@ -156,8 +158,10 @@ class _NfcLayoutState extends State { height: 30, ), Image.asset( - "assets/icons/nfc/ic_done.png", + // "assets/icons/nfc/ic_done.png", + "assets/images/done_dummy.jpeg", height: MediaQuery.of(context).size.width / 3, + width: double.infinity, ), SizedBox( height: 30,