From 42510259bc77da342f5824bbb9660cf53c8eca85 Mon Sep 17 00:00:00 2001 From: devmirza121 Date: Sun, 19 Jun 2022 11:31:49 +0300 Subject: [PATCH] Worklist & Wifi attendance --- lib/api/dashboard_api_client.dart | 2 +- lib/api/worklist/worklist_api_client.dart | 5 +- lib/app_state/app_state.dart | 13 +++++ lib/classes/consts.dart | 6 ++- lib/main.dart | 2 +- lib/ui/landing/today_attendance_screen.dart | 47 ++++++++++++++++++- lib/ui/login/login_screen.dart | 13 +++-- lib/ui/login/verify_login_screen.dart | 8 +++- .../approval_level_fragment.dart | 2 +- lib/ui/work_list/sheets/delegate_sheet.dart | 8 +++- .../sheets/request_more_info_sheet.dart | 2 +- .../work_list/sheets/selected_item_sheet.dart | 27 +++++++---- lib/ui/work_list/worklist_detail_screen.dart | 44 ++++++++++++++++- .../worklist_fragments/actions_fragment.dart | 4 +- pubspec.yaml | 1 + 15 files changed, 154 insertions(+), 30 deletions(-) diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index f4c583d..444eb21 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -104,7 +104,7 @@ class DashboardApiClient { "QRValue": "", "PointType": pointType, // NFC=2, Wifi = 3, QR= 1, "NFCValue": nfcValue, - "WifiValue": "", + "WifiValue": pointType == 3 ? "100" : "", "IsGpsRequired": isGpsRequired }; postParams.addAll(AppState().postParamsJson); diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index 23594a9..2cb4a5c 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -362,7 +362,6 @@ class WorkListApiClient { }, url, postParams); } - Future getContactNotificationBodyList(int? notificationId) async { String url = "${ApiConsts.erpRest}GET_CONTACT_NOTIFICATION_BODY"; Map postParams = { @@ -432,11 +431,11 @@ class WorkListApiClient { }, url, postParams); } - Future submitComment({String? comment, String? email, String? userId, int? notificationId}) async { + Future submitComment({String? comment, String? email, String? userId, int? notificationId, required String apiMode}) async { String url = "${ApiConsts.erpRest}NOTIFICATION_ACTIONS"; Map postParams = { "P_COMMENTS": comment, - "P_ACTION_MODE": "DELEGATE", + "P_ACTION_MODE": apiMode, "P_EMAIL_ADDRESS": email, "P_FORWARD_TO_USER_NAME": userId, "P_NOTIFICATION_ID": notificationId, diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 1b0e66d..c61fcff 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -29,6 +29,19 @@ class AppState { String? get getForgetPasswordTokenID => forgetPasswordTokenID; + //Wifi info + String? mohemmWifiSSID; + + set setMohemmWifiSSID(v) => mohemmWifiSSID = mohemmWifiSSID; + + String? get getMohemmWifiSSID => mohemmWifiSSID; + + String? mohemmWifiPassword; + + set setMohemmWifiPassword(v) => mohemmWifiPassword = v; + + String? get getMohemmWifiPassword => mohemmWifiPassword; + PostParamsModel? _postParams; PostParamsModel? get postParamsObject => _postParams; diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index a95e5b4..e0ce17f 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - // static String baseUrl = "https://hmgwebservices.com"; // Live server + // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; @@ -20,4 +20,6 @@ class SharedPrefsConsts { static String memberInformation = "memberInformation"; static String welcomeVideoUrl = "welcomeVideoUrl"; static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; + static String mohemmWifiSSID = "mohemmWifiSSID"; + static String mohemmWifiPassword = "mohemmWifiPassword"; } diff --git a/lib/main.dart b/lib/main.dart index 29a8e17..af233ab 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,7 +29,7 @@ Future main() async { await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(); AppState().setPostParamsModel( - PostParamsModel(channel: 31, versionID: 3.4, mobileType: Platform.isAndroid ? "android" : "ios"), + PostParamsModel(channel: 31, versionID: 3.6, mobileType: Platform.isAndroid ? "android" : "ios"), ); runApp( EasyLocalization( diff --git a/lib/ui/landing/today_attendance_screen.dart b/lib/ui/landing/today_attendance_screen.dart index 6268425..821b01c 100644 --- a/lib/ui/landing/today_attendance_screen.dart +++ b/lib/ui/landing/today_attendance_screen.dart @@ -17,6 +17,7 @@ import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart'; import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:provider/provider.dart'; +import 'package:wifi_iot/wifi_iot.dart'; import '../../provider/dashboard_provider_model.dart'; import '../../widgets/location/Location.dart'; @@ -198,7 +199,16 @@ class _TodayAttendanceScreenState extends State { performNfcAttendance(model); } }), - attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () {}), + attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () { + if (isWifiLocationEnabled) { + Location.getCurrentLocation((LatLng? latlng) { + performWifiAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? ""); + }); + } else { + performWifiAttendance(model); + } + // connectWifi(); + }), ], ) ], @@ -257,6 +267,41 @@ class _TodayAttendanceScreenState extends State { }); } + Future performWifiAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { + if (isWifiLocationEnabled) { + print("wifi location enabled"); + } else { + print("wifi not location enabled"); + } + bool v = await WiFiForIoTPlugin.connect(AppState().mohemmWifiSSID ?? "", password: AppState().mohemmWifiPassword ?? "", joinOnce: true, security: NetworkSecurity.WPA, withInternet: false); + if (v) { + await WiFiForIoTPlugin.forceWifiUsage(true); + print("connected"); + Utils.showLoading(context); + try { + GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 3, nfcValue: "", isGpsRequired: isWifiLocationEnabled, lat: lat, long: lng); + bool status = await model.fetchAttendanceTracking(context); + Utils.hideLoading(context); + await closeWifiRequest(); + } catch (ex) { + print(ex); + await closeWifiRequest(); + Utils.hideLoading(context); + Utils.handleException(ex, context, (msg) { + Utils.confirmDialog(context, msg); + }); + } + } else { + Utils.confirmDialog(context, "Please come near to HMG wifi"); + } + } + + Future closeWifiRequest() async { + await WiFiForIoTPlugin.forceWifiUsage(false); + bool v = await WiFiForIoTPlugin.disconnect(); + return v; + } + Widget attendanceMethod(String title, String image, bool isEnabled, VoidCallback onPress) => Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index 2a9e0cb..b20ec58 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -23,6 +23,7 @@ import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:mohem_flutter_app/models/privilege_list_model.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class LoginScreen extends StatefulWidget { LoginScreen({Key? key}) : super(key: key); @@ -70,6 +71,7 @@ class _LoginScreenState extends State { String? firebaseToken; GetMobileLoginInfoListModel? loginInfo; + Future checkFirebaseToken() async { try { Utils.showLoading(context); @@ -108,6 +110,10 @@ class _LoginScreenState extends State { if (_autoLogin) { AppState().setMemberInformationListModel = (await MemberInformationListModel.getFromPrefs()).first; AppState().setPrivilegeListModel = await PrivilegeListModel.getFromPrefs(); + String mohemmWifiSSID = await Utils.getStringFromPrefs(SharedPrefsConsts.mohemmWifiSSID); + String mohemmWifiPassword = await Utils.getStringFromPrefs(SharedPrefsConsts.mohemmWifiPassword); + AppState().mohemmWifiSSID = mohemmWifiSSID; + AppState().mohemmWifiPassword = mohemmWifiPassword; } Utils.hideLoading(context); if (_autoLogin) { @@ -126,12 +132,11 @@ class _LoginScreenState extends State { @override Widget build(BuildContext context) { - username.text = "15153"; + // username.text = "15153"; password.text = "Abcd@1234"; - // username.text = "15444"; + username.text = "15444"; + - // username.text = "287742"; - // password.text = "509@Shafiq"; return Scaffold( body: Column( children: [ diff --git a/lib/ui/login/verify_login_screen.dart b/lib/ui/login/verify_login_screen.dart index b3babb3..4a3249b 100644 --- a/lib/ui/login/verify_login_screen.dart +++ b/lib/ui/login/verify_login_screen.dart @@ -686,8 +686,12 @@ class _VerifyLoginScreenState extends State { print(element.serviceName.toString() + " " + element.previlege.toString()); // Check availability }); PrivilegeListModel.saveToPrefs(genericResponseModel.privilegeList ?? []); + AppState().mohemmWifiSSID = genericResponseModel.mohemmWifiSSID; + AppState().mohemmWifiPassword = genericResponseModel.mohemmWifiPassword; Utils.saveStringFromPrefs(SharedPrefsConsts.username, AppState().getUserName!); Utils.saveStringFromPrefs(SharedPrefsConsts.password, AppState().password!); + Utils.saveStringFromPrefs(SharedPrefsConsts.mohemmWifiSSID, genericResponseModel.mohemmWifiSSID!); + Utils.saveStringFromPrefs(SharedPrefsConsts.mohemmWifiPassword, genericResponseModel.mohemmWifiPassword!); } Utils.hideLoading(context); Navigator.pop(context); @@ -695,7 +699,7 @@ class _VerifyLoginScreenState extends State { } catch (ex) { print(ex); Utils.hideLoading(context); - Utils.handleException(ex, context, null); + Utils.handleException(ex, context, null); } }, () => { @@ -705,7 +709,7 @@ class _VerifyLoginScreenState extends State { } catch (ex) { print(ex); Utils.hideLoading(context); - Utils.handleException(ex, context, null); + Utils.handleException(ex, context, null); } } }, diff --git a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart index 5a6be84..c09b62e 100644 --- a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart +++ b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart @@ -101,7 +101,7 @@ class ApprovalLevelfragment extends StatelessWidget { }).expanded, Container(width: 1, height: 30, color: MyColors.lightGreyEFColor), LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() { - showMyBottomSheet(context, child: DelegateSheet()); + // showMyBottomSheet(context, child: DelegateSheet()); }).expanded, ], ), diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart index a57ce81..4ce032c 100644 --- a/lib/ui/work_list/sheets/delegate_sheet.dart +++ b/lib/ui/work_list/sheets/delegate_sheet.dart @@ -23,9 +23,10 @@ import '../../../models/worklist/get_favorite_replacements_model.dart'; class DelegateSheet extends StatefulWidget { int? notificationID; + String title,apiMode; List? actionHistoryList; - DelegateSheet({this.notificationID, this.actionHistoryList}); + DelegateSheet({required this.title,required this.apiMode,this.notificationID, this.actionHistoryList}); @override State createState() => _DelegateSheetState(); @@ -114,7 +115,7 @@ class _DelegateSheetState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Delegate".toText24(), + widget.title.toText24(), 24.height, "Search".toText16(), 20.height, @@ -359,6 +360,7 @@ class _DelegateSheetState extends State { showMyBottomSheet(context, child: SelectedItemSheet( "Comment", + apiMode: widget.apiMode, actionHistoryList: actionHistory, notificationID: widget.notificationID, )); @@ -403,6 +405,7 @@ class _DelegateSheetState extends State { showMyBottomSheet(context, child: SelectedItemSheet( "Comment", + apiMode: widget.apiMode, favoriteReplacements: actionHistory, notificationID: widget.notificationID, )); @@ -447,6 +450,7 @@ class _DelegateSheetState extends State { showMyBottomSheet(context, child: SelectedItemSheet( "Comment", + apiMode: widget.apiMode, replacementList: actionHistory, notificationID: widget.notificationID, )); diff --git a/lib/ui/work_list/sheets/request_more_info_sheet.dart b/lib/ui/work_list/sheets/request_more_info_sheet.dart index e2840ca..5c0a76b 100644 --- a/lib/ui/work_list/sheets/request_more_info_sheet.dart +++ b/lib/ui/work_list/sheets/request_more_info_sheet.dart @@ -141,7 +141,7 @@ class RequestMoreInfoSheet extends StatelessWidget { Widget showItem(BuildContext context, String name, {bool isEnabled = false}) { return InkWell( onTap: () { - showMyBottomSheet(context, child: SelectedItemSheet("Request more info")); + // showMyBottomSheet(context, child: SelectedItemSheet("Request more info")); }, child: Row( children: [ diff --git a/lib/ui/work_list/sheets/selected_item_sheet.dart b/lib/ui/work_list/sheets/selected_item_sheet.dart index 1e065f0..3c9af9b 100644 --- a/lib/ui/work_list/sheets/selected_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_item_sheet.dart @@ -16,13 +16,13 @@ import '../../../models/worklist/get_favorite_replacements_model.dart'; import '../../../models/worklist/replacement_list_model.dart'; class SelectedItemSheet extends StatelessWidget { - String title; + String title, apiMode; int? notificationID; GetActionHistoryList? actionHistoryList; GetFavoriteReplacements? favoriteReplacements; ReplacementList? replacementList; - SelectedItemSheet(this.title, {this.notificationID, this.actionHistoryList, this.favoriteReplacements, this.replacementList}); + SelectedItemSheet(this.title, {required this.apiMode, this.notificationID, this.actionHistoryList, this.favoriteReplacements, this.replacementList}); TextEditingController username = TextEditingController(); String comment = ""; @@ -86,7 +86,7 @@ class SelectedItemSheet extends StatelessWidget { Expanded( child: DefaultButton( "Submit", - () async { + () { String? email = "", userId = ""; if (actionHistoryList != null) { email = actionHistoryList!.eMAILADDRESS; @@ -98,12 +98,7 @@ class SelectedItemSheet extends StatelessWidget { email = replacementList!.emailAddress; userId = replacementList!.userName; } - Utils.showLoading(context); - await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID); - Utils.hideLoading(context); - Navigator.pop(context); - Navigator.pop(context); - Navigator.pop(context, "delegate_reload"); + performNetworkCall(context, email: email ?? "", userId: userId ?? ""); }, colors: [ Color(0xff32D892), @@ -118,6 +113,20 @@ class SelectedItemSheet extends StatelessWidget { ); } + Future performNetworkCall(BuildContext context, {String? email, String? userId}) async { + Utils.showLoading(context); + try{ + await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode); + Utils.hideLoading(context); + Navigator.pop(context); + Navigator.pop(context); + Navigator.pop(context, "delegate_reload"); + }catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + Widget showItem(String? name, bool? isFav) { return Container( decoration: BoxDecoration( diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 62dcdd7..176cb41 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -24,6 +24,7 @@ import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_mod import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; +import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/actions_fragment.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/attachments_fragment.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/detail_fragment.dart'; @@ -37,6 +38,8 @@ import '../../models/worklist/hr/eit_otification_body_model.dart'; import '../../models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; import '../../models/worklist/hr/get_contact_notification_body_list_model.dart'; import '../../models/worklist/hr/get_phones_notification_body_list_model.dart'; +import '../../widgets/bottom_sheet.dart'; +import '../../widgets/dialogs/confirm_dialog.dart'; class WorkListDetailScreen extends StatefulWidget { WorkListDetailScreen({Key? key}) : super(key: key); @@ -107,7 +110,6 @@ class _WorkListDetailScreenState extends State { getAbsenceCollectionNotificationBodyList = await WorkListApiClient().getAbsenceNotificationBody(workListData!.nOTIFICATIONID); } else if (workListData!.rEQUESTTYPE == "CONTACT") { getContactNotificationBodyList = await WorkListApiClient().getContactNotificationBodyList(workListData!.nOTIFICATIONID); - } // getBasicNTFBody = await WorkListApiClient().getBasicDetNTFBody(workListData!.nOTIFICATIONID!, -999); @@ -359,19 +361,59 @@ class _WorkListDetailScreenState extends State { switch (notificationButton.bUTTONACTION) { case "DELEGATE": // do something + showMyBottomSheet(context, child: DelegateSheet(title: "Delegate", apiMode: "DELEGATE", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); break; case "REQUEST_INFO": // do something else + showMyBottomSheet(context, child: DelegateSheet(title: "Request Info", apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); break; case "RFC": // do something else break; case "UPDATE_ACTION": + // do something else + case "APPROVE_AND_FORWARD": + // do something else + showMyBottomSheet(context, + child: DelegateSheet(title: "Approve and Forward", apiMode: "APPROVE_AND_FORWARD", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + break; + case "FORWARD": + // do something else + showMyBottomSheet(context, child: DelegateSheet(title: "Forward", apiMode: "FORWARD", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + break; + case "REJECT": + // do something else + performNetworkCall(context, email: "", userId: ""); + break; + case "RETURNED": // do something else + Navigator.pop(context); break; } } + Future performNetworkCall(BuildContext context, {String? email, String? userId}) async { + showDialog( + context: context, + builder: (cxt) => ConfirmDialog( + message: "Are you sure want to reject?", + okTitle: "Reject", + onTap: () async { + Navigator.pop(cxt); + Utils.showLoading(context); + try { + await WorkListApiClient().submitComment(comment: "", email: email, userId: userId, notificationId: workListData!.nOTIFICATIONID, apiMode: "REJECT"); + Utils.hideLoading(context); + Navigator.pop(context, "delegate_reload"); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + }, + ), + ); + } + Widget myTab(String title, int index) { bool isSelected = (index == tabIndex); return Column( diff --git a/lib/ui/work_list/worklist_fragments/actions_fragment.dart b/lib/ui/work_list/worklist_fragments/actions_fragment.dart index 066ef6d..056ca1f 100644 --- a/lib/ui/work_list/worklist_fragments/actions_fragment.dart +++ b/lib/ui/work_list/worklist_fragments/actions_fragment.dart @@ -97,11 +97,11 @@ class ActionsFragment extends StatelessWidget { Row( children: [ LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() { - showMyBottomSheet(context, child: RequestMoreInfoSheet()); + showMyBottomSheet(context, child: DelegateSheet(title: "Request Info", apiMode: "REQUEST_INFO", notificationID: notificationID, actionHistoryList: actionHistoryList)); }).expanded, Container(width: 1, height: 30, color: MyColors.lightGreyEFColor), LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() { - showMyBottomSheet(context, child: DelegateSheet(notificationID:notificationID,actionHistoryList: actionHistoryList)); + showMyBottomSheet(context, child: DelegateSheet(title: "Delegate", apiMode: "DELEGATE", notificationID: notificationID, actionHistoryList: actionHistoryList)); }).expanded, ], ), diff --git a/pubspec.yaml b/pubspec.yaml index 53f8d1b..aa987da 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,6 +63,7 @@ dependencies: flutter_calendar_carousel: ^2.1.0 pie_chart: ^5.1.0 open_file: ^3.2.1 + wifi_iot: ^0.3.16