diff --git a/lib/api/chat/chat_api_client.dart b/lib/api/chat/chat_api_client.dart index 43e9f6c..87e684e 100644 --- a/lib/api/chat/chat_api_client.dart +++ b/lib/api/chat/chat_api_client.dart @@ -46,15 +46,15 @@ class ChatApiClient { return userLoginResponse; } - Future?> getChatMemberFromSearch(String sName, int cUserId) async { - Response response = await ApiClient().getJsonForResponse( - "${ApiConsts.chatLoginTokenUrl}getUserWithStatusAndFavAsync/$sName/$cUserId", - token: AppState().chatDetails!.response!.token, - ); + Future getChatMemberFromSearch(String searchParam, int cUserId, int pageNo) async { + ChatUserModel chatUserModel; + Response response = await ApiClient().postJsonForResponse("${ApiConsts.chatLoginTokenUrl}getUserWithStatusAndFavAsync", {"employeeNumber": cUserId, "userName": searchParam, "pageNumber": pageNo}, + token: AppState().chatDetails!.response!.token); if (!kReleaseMode) { logger.i("res: " + response.body); } - return List.from(json.decode(response.body).map((x) => ChatUser.fromJson(x))); + chatUserModel = chatUserModelFromJson(response.body); + return chatUserModel; } //Get User Recent Chats diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index b354a43..f6f5ae9 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -165,4 +165,6 @@ class AppState { set setemployeeSubordinatesList(List employeeSubordinatesList) { _employeeSubordinatesList = employeeSubordinatesList; } + + bool cancelRequestTrancsection = true; } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 6679cbb..56b0008 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -3,8 +3,8 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA 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/"; diff --git a/lib/models/chat/get_search_user_chat_model.dart b/lib/models/chat/get_search_user_chat_model.dart index 3d023fd..e69fd3b 100644 --- a/lib/models/chat/get_search_user_chat_model.dart +++ b/lib/models/chat/get_search_user_chat_model.dart @@ -1,5 +1,10 @@ +import 'dart:convert'; import 'dart:io'; +ChatUserModel chatUserModelFromJson(String str) => ChatUserModel.fromJson(json.decode(str)); + +String chatUserModelToJson(ChatUserModel data) => json.encode(data.toJson()); + class ChatUserModel { ChatUserModel({ this.response, @@ -7,16 +12,40 @@ class ChatUserModel { }); List? response; - dynamic errorResponses; + List? errorResponses; factory ChatUserModel.fromJson(Map json) => ChatUserModel( response: json["response"] == null ? null : List.from(json["response"].map((x) => ChatUser.fromJson(x))), - errorResponses: json["errorResponses"], + errorResponses: json["errorResponses"] == null ? null : List.from(json["errorResponses"].map((x) => ErrorResponse.fromJson(x))), ); Map toJson() => { "response": response == null ? null : List.from(response!.map((x) => x.toJson())), - "errorResponses": errorResponses, + "errorResponses": errorResponses == null ? null : List.from(errorResponses!.map((x) => x.toJson())), + }; +} + +class ErrorResponse { + ErrorResponse({ + this.fieldName, + this.message, + }); + + dynamic? fieldName; + String? message; + + factory ErrorResponse.fromRawJson(String str) => ErrorResponse.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory ErrorResponse.fromJson(Map json) => ErrorResponse( + fieldName: json["fieldName"], + message: json["message"] == null ? null : json["message"], + ); + + Map toJson() => { + "fieldName": fieldName, + "message": message == null ? null : message, }; } @@ -34,6 +63,8 @@ class ChatUser { this.isPin, this.isFav, this.isAdmin, + this.rKey, + this.totalCount, this.isTyping, this.isImageLoaded, this.isImageLoading, @@ -44,7 +75,7 @@ class ChatUser { String? userName; String? email; dynamic? phone; - dynamic? title; + String? title; int? userStatus; dynamic? image; int? unreadMessageCount; @@ -52,17 +83,23 @@ class ChatUser { bool? isPin; bool? isFav; bool? isAdmin; + dynamic? rKey; + int? totalCount; bool? isTyping; bool? isImageLoaded; bool? isImageLoading; File? userLocalDownlaodedImage; + factory ChatUser.fromRawJson(String str) => ChatUser.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + factory ChatUser.fromJson(Map json) => ChatUser( id: json["id"] == null ? null : json["id"], userName: json["userName"] == null ? null : json["userName"], email: json["email"] == null ? null : json["email"], phone: json["phone"], - title: json["title"], + title: json["title"] == null ? null : json["title"], userStatus: json["userStatus"] == null ? null : json["userStatus"], image: json["image"], unreadMessageCount: json["unreadMessageCount"] == null ? null : json["unreadMessageCount"], @@ -70,6 +107,8 @@ class ChatUser { isPin: json["isPin"] == null ? null : json["isPin"], isFav: json["isFav"] == null ? null : json["isFav"], isAdmin: json["isAdmin"] == null ? null : json["isAdmin"], + rKey: json["rKey"], + totalCount: json["totalCount"] == null ? null : json["totalCount"], isTyping: false, isImageLoaded: false, isImageLoading: true, @@ -80,7 +119,7 @@ class ChatUser { "userName": userName == null ? null : userName, "email": email == null ? null : email, "phone": phone, - "title": title, + "title": title == null ? null : title, "userStatus": userStatus == null ? null : userStatus, "image": image, "unreadMessageCount": unreadMessageCount == null ? null : unreadMessageCount, @@ -88,5 +127,7 @@ class ChatUser { "isPin": isPin == null ? null : isPin, "isFav": isFav == null ? null : isFav, "isAdmin": isAdmin == null ? null : isAdmin, + "rKey": rKey, + "totalCount": totalCount == null ? null : totalCount, }; } diff --git a/lib/provider/chat_provider_model.dart b/lib/provider/chat_provider_model.dart index 57abd3a..0851392 100644 --- a/lib/provider/chat_provider_model.dart +++ b/lib/provider/chat_provider_model.dart @@ -69,6 +69,10 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { //Chat Home Page Counter int chatUConvCounter = 0; + /// Search Provider + List? chatUsersList = []; + int pageNo = 1; + Future getUserAutoLoginToken() async { userLoginToken.UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserLoginToken(); if (userLoginResponse.response != null) { @@ -171,9 +175,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { if (response.statusCode == 204) { if (isNewChat) { userChatHistory = []; - } else if (loadMore) { - Utils.showToast("No More Data To Load"); - } + } else if (loadMore) {} } else { if (loadMore) { List temp = getSingleUserChatModel(response.body).reversed.toList(); @@ -329,6 +331,16 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { user.userStatus = items.first["userStatus"]; } } + if (teamMembersList != null) { + if (teamMembersList.isNotEmpty) { + for (ChatUser user in teamMembersList!) { + if (user.id == items.first["id"]) { + user.userStatus = items.first["userStatus"]; + } + } + } + } + notifyListeners(); } @@ -919,7 +931,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { return f.format(data); } - Future favoriteUser({required int userID, required int targetUserID}) async { + Future favoriteUser({required int userID, required int targetUserID, required bool fromSearch}) async { fav.FavoriteChatUser favoriteChatUser = await ChatApiClient().favUser(userID: userID, targetUserID: targetUserID); if (favoriteChatUser.response != null) { for (ChatUser user in searchedChats!) { @@ -931,6 +943,25 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } } } + + for (ChatUser user in chatUsersList!) { + if (user.id == favoriteChatUser.response!.targetUserId!) { + user.isFav = favoriteChatUser.response!.isFav; + dynamic contain = favUsersList!.where((ChatUser element) => element.id == favoriteChatUser.response!.targetUserId!); + if (contain.isEmpty) { + favUsersList.add(user); + } + } + } + } + if (fromSearch) { + for (ChatUser user in favUsersList) { + if (user.id == targetUserID) { + user.userLocalDownlaodedImage = null; + user.isImageLoading = false; + user.isImageLoaded = false; + } + } } notifyListeners(); } @@ -949,6 +980,12 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { ); } + for (ChatUser user in chatUsersList!) { + if (user.id == favoriteChatUser.response!.targetUserId!) { + user.isFav = favoriteChatUser.response!.isFav; + } + } + notifyListeners(); } @@ -1264,7 +1301,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { await Directory(dirPath).create(); await File('$dirPath/.nomedia').create(); } - File file = File("$dirPath/${data.currentUserId}-${data.targetUserId}-${DateTime.now().microsecondsSinceEpoch}" + ext); + File file = File("$dirPath/${data.currentUserId}-${data.targetUserId}-${DateTime.now().microsecondsSinceEpoch}." + ext); await file.writeAsBytes(bytes); return file.path; } @@ -1288,50 +1325,64 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { teamMembersList = []; isLoading = true; if (AppState().getemployeeSubordinatesList.isNotEmpty) { - print("=============== In App State ====================="); getEmployeeSubordinatesList = AppState().getemployeeSubordinatesList; for (GetEmployeeSubordinatesList element in getEmployeeSubordinatesList) { - print(element.eMPLOYEEEMAILADDRESS); - teamMembersList.add( - ChatUser( - id: int.parse(element.eMPLOYEENUMBER!), - email: element.eMPLOYEEEMAILADDRESS, - userName: element.eMPLOYEENAME, - phone: element.eMPLOYEEMOBILENUMBER, - userStatus: 0, - unreadMessageCount: 0, - isFav: false, - isTyping: false, - isImageLoading: false, - image: element.eMPLOYEEIMAGE ?? "", - isImageLoaded: element.eMPLOYEEIMAGE == null ? false : true, - userLocalDownlaodedImage:element.eMPLOYEEIMAGE == null ? null : await downloadImageLocal(element.eMPLOYEEIMAGE ?? "", element.eMPLOYEENUMBER!), - ), - ); + if (element.eMPLOYEEEMAILADDRESS != null) { + if (element.eMPLOYEEEMAILADDRESS!.isNotEmpty) { + teamMembersList.add( + ChatUser( + id: int.parse(element.eMPLOYEENUMBER!), + email: element.eMPLOYEEEMAILADDRESS, + userName: element.eMPLOYEENAME, + phone: element.eMPLOYEEMOBILENUMBER, + userStatus: 0, + unreadMessageCount: 0, + isFav: false, + isTyping: false, + isImageLoading: false, + image: element.eMPLOYEEIMAGE ?? "", + isImageLoaded: element.eMPLOYEEIMAGE == null ? false : true, + userLocalDownlaodedImage: element.eMPLOYEEIMAGE == null ? null : await downloadImageLocal(element.eMPLOYEEIMAGE ?? "", element.eMPLOYEENUMBER!), + ), + ); + } + } } } else { getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates("", "", ""); AppState().setemployeeSubordinatesList = getEmployeeSubordinatesList; for (GetEmployeeSubordinatesList element in getEmployeeSubordinatesList) { - print(element.eMPLOYEEEMAILADDRESS); - teamMembersList.add( - ChatUser( - id: int.parse(element.eMPLOYEENUMBER!), - email: element.eMPLOYEEEMAILADDRESS, - userName: element.eMPLOYEENAME, - phone: element.eMPLOYEEMOBILENUMBER, - userStatus: 0, - unreadMessageCount: 0, - isFav: false, - isTyping: false, - isImageLoading: false, - image: element.eMPLOYEEIMAGE ?? "", - isImageLoaded: element.eMPLOYEEIMAGE == null ? false : true, - userLocalDownlaodedImage: element.eMPLOYEEIMAGE == null ? null : await downloadImageLocal(element.eMPLOYEEIMAGE ?? "", element.eMPLOYEENUMBER!), - ), - ); + if (element.eMPLOYEEEMAILADDRESS != null) { + if (element.eMPLOYEEEMAILADDRESS!.isNotEmpty) { + teamMembersList.add( + ChatUser( + id: int.parse(element.eMPLOYEENUMBER!), + email: element.eMPLOYEEEMAILADDRESS, + userName: element.eMPLOYEENAME, + phone: element.eMPLOYEEMOBILENUMBER, + userStatus: 0, + unreadMessageCount: 0, + isFav: false, + isTyping: false, + isImageLoading: false, + image: element.eMPLOYEEIMAGE ?? "", + isImageLoaded: element.eMPLOYEEIMAGE == null ? false : true, + userLocalDownlaodedImage: element.eMPLOYEEIMAGE == null ? null : await downloadImageLocal(element.eMPLOYEEIMAGE ?? "", element.eMPLOYEENUMBER!), + ), + ); + } + } } } + + for (ChatUser user in searchedChats!) { + for (ChatUser teamUser in teamMembersList!) { + if (user.id == teamUser.id) { + teamUser.userStatus = user.userStatus; + } + } + } + isLoading = false; notifyListeners(); } diff --git a/lib/ui/chat/chat_detailed_screen.dart b/lib/ui/chat/chat_detailed_screen.dart index dcbda22..595dc13 100644 --- a/lib/ui/chat/chat_detailed_screen.dart +++ b/lib/ui/chat/chat_detailed_screen.dart @@ -87,7 +87,6 @@ class _ChatDetailScreenState extends State { context, title: params!.chatUser!.userName.toString().replaceAll(".", " ").capitalizeFirstofEach, showHomeButton: false, - image: params!.chatUser!.image == null || params!.chatUser!.image.isEmpty ? null : params!.chatUser!.image, showTyping: true, chatUser: params!.chatUser, actions: [ diff --git a/lib/ui/chat/chat_home_screen.dart b/lib/ui/chat/chat_home_screen.dart index 395556a..aa47053 100644 --- a/lib/ui/chat/chat_home_screen.dart +++ b/lib/ui/chat/chat_home_screen.dart @@ -179,6 +179,7 @@ class _ChatHomeScreenState extends State { m.favoriteUser( userID: AppState().chatDetails!.response!.id!, targetUserID: m.searchedChats![index].id!, + fromSearch: false ); } else if (m.searchedChats![index].isFav == true) { m.unFavoriteUser( @@ -189,6 +190,7 @@ class _ChatHomeScreenState extends State { m.favoriteUser( userID: AppState().chatDetails!.response!.id!, targetUserID: m.searchedChats![index].id!, + fromSearch: false ); } }, @@ -238,6 +240,7 @@ class _ChatHomeScreenState extends State { ), ), onPressed: () async { + print(AppState().chatDetails!.response!.token); showMyBottomSheet( context, callBackFunc: () {}, diff --git a/lib/ui/chat/my_team_screen.dart b/lib/ui/chat/my_team_screen.dart index 1752295..5d36a68 100644 --- a/lib/ui/chat/my_team_screen.dart +++ b/lib/ui/chat/my_team_screen.dart @@ -84,24 +84,24 @@ class _MyTeamScreenState extends State { ), ), ), - // Positioned( - // right: 5, - // bottom: 1, - // child: Container( - // width: 10, - // height: 10, - // decoration: BoxDecoration( - // color: m.teamMembersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red, - // ), - // ).circle(10), - // ) + Positioned( + right: 5, + bottom: 1, + child: Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: m.teamMembersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red, + ), + ).circle(10), + ) ], ), Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - (m.teamMembersList![index].userName! ?? "").toText14(color: MyColors.darkTextColor).paddingOnly(left: 11, top: 13), + (m.teamMembersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(color: MyColors.darkTextColor).paddingOnly(left: 11, top: 13), ], ).expanded, // SizedBox( diff --git a/lib/ui/leave_balance/add_leave_balance_screen.dart b/lib/ui/leave_balance/add_leave_balance_screen.dart index 9eefc62..a16e81d 100644 --- a/lib/ui/leave_balance/add_leave_balance_screen.dart +++ b/lib/ui/leave_balance/add_leave_balance_screen.dart @@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; @@ -141,12 +142,13 @@ class _AddLeaveBalanceScreenState extends State { empID: selectedID); Utils.hideLoading(context); - - var res = await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance", selectedEmployeeID: selectedID)); - if (res != null && res == true) { - Utils.showLoading(context); + + if (!AppState().cancelRequestTrancsection) { + return; } + Utils.showLoading(context); await LeaveBalanceApiClient().cancelHrTransaction(submit.pTRANSACTIONID!); Utils.hideLoading(context); } catch (ex) { diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart index 50096c7..91cd2b1 100644 --- a/lib/ui/misc/request_submit_screen.dart +++ b/lib/ui/misc/request_submit_screen.dart @@ -1,8 +1,6 @@ -import 'dart:convert'; import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; -import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; @@ -58,6 +56,7 @@ class _RequestSubmitScreenState extends State { @override void initState() { super.initState(); + AppState().cancelRequestTrancsection = true; } void getApproverList() async { @@ -138,9 +137,9 @@ class _RequestSubmitScreenState extends State { params!.transactionId, ); } else {} - Utils.hideLoading(context); Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr(), longDuration: true); + AppState().cancelRequestTrancsection = false; Navigator.of(context).popUntil((route) => route.settings.name == AppRoutes.dashboard); Navigator.pushNamed(context, AppRoutes.workList); } catch (ex) { diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 1ec79a0..c79f929 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.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'; @@ -57,7 +58,7 @@ class _DynamicInputScreenState extends State { } void validateTransaction() async { - // try { + try { Utils.showLoading(context); List> values = getEitDffStructureList!.map((e) { String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; @@ -95,13 +96,16 @@ class _DynamicInputScreenState extends State { Utils.hideLoading(context); await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit')); + if (!AppState().cancelRequestTrancsection) { + return; + } Utils.showLoading(context); await LeaveBalanceApiClient().cancelHrTransaction(submitEITTransactionList.pTRANSACTIONID!); Utils.hideLoading(context); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } } String dESCFLEXCONTEXTCODE = ""; @@ -188,7 +192,8 @@ class _DynamicInputScreenState extends State { // Utils.hideLoading(context); } } else if (values.isNotEmpty) { - ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values, empID: dynamicParams!.selectedEmp); + ESERVICESDV defaultValue = + await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values, empID: dynamicParams!.selectedEmp); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); getEitDffStructureList![index].eSERVICESDV = defaultValue; } diff --git a/lib/ui/profile/add_update_family_member.dart b/lib/ui/profile/add_update_family_member.dart index 36a8394..6263b95 100644 --- a/lib/ui/profile/add_update_family_member.dart +++ b/lib/ui/profile/add_update_family_member.dart @@ -1,11 +1,16 @@ +import 'dart:io'; + 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:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/profile_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/dyanmic_forms/validate_eit_transaction_model.dart'; @@ -17,11 +22,16 @@ import 'package:mohem_flutter_app/models/profile/get_contact_details_list.dart'; import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart'; import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; -import 'dart:io'; -import 'package:flutter/cupertino.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; -import 'package:easy_localization/src/public_ext.dart'; + +class FamilyMemberScreenParams { + String? actionType; + int relationID; + int? flag; + + FamilyMemberScreenParams(this.relationID, {this.actionType, this.flag}); +} class AddUpdateFamilyMember extends StatefulWidget { const AddUpdateFamilyMember({Key? key}) : super(key: key); @@ -36,10 +46,12 @@ class _AddUpdateFamilyMemberState extends State { List getContactDffStructureList = []; List getContactDetailsList = []; SubmitContactTransactionList? submitContactTransactionList; - dynamic args; + + //dynamic args; + FamilyMemberScreenParams? params; String? date = "MM/DD/YYYY"; - var dateTime = DateTime.now().timeZoneOffset; - var dateTime1 = DateTime.now().timeZoneName; + Duration dateTime = DateTime.now().timeZoneOffset; + String dateTime1 = DateTime.now().timeZoneName; GetApprovesList? getApprovesList; @@ -52,9 +64,9 @@ class _AddUpdateFamilyMemberState extends State { try { Utils.showLoading(context); getBasicDetDffStructureList = await ProfileApiClient().getBasicDetDffStructure(); - getContactColsStructureList = await ProfileApiClient().getContactColsStructureList(args['actionType']); + getContactColsStructureList = await ProfileApiClient().getContactColsStructureList(params!.actionType.toString()); getContactDffStructureList = await ProfileApiClient().getContactDffStructureList(); - if (args['actionType'] == "ADD") { + if (params!.actionType == "ADD") { getBasicDetDffStructureList?.forEach((element) { element?.getContactDetailsList = new GetContactDetailsList(); }); @@ -64,8 +76,8 @@ class _AddUpdateFamilyMemberState extends State { getContactDffStructureList?.forEach((element) { element?.getContactDetailsList = new GetContactDetailsList(); }); - } else if (args['actionType'] == "UPDATE") { - getContactDetailsList = await ProfileApiClient().getContactDetailsList(args['relationID']); + } else if (params!.actionType == "UPDATE") { + getContactDetailsList = await ProfileApiClient().getContactDetailsList(params!.relationID); getBasicDetDffStructureList?.forEach((element) { element?.getContactDetailsList = getContactDetailsList?.singleWhere((userDetail) => userDetail?.aPPLICATIONCOLUMNNAME == element?.aPPLICATIONCOLUMNNAME); @@ -88,8 +100,8 @@ class _AddUpdateFamilyMemberState extends State { @override Widget build(BuildContext context) { - if (args == null) { - args = ModalRoute.of(context)!.settings.arguments; + if (params == null) { + params = ModalRoute.of(context)!.settings.arguments as FamilyMemberScreenParams; callAddAndUpdateFamilyMember(); } return Scaffold( @@ -98,45 +110,48 @@ class _AddUpdateFamilyMemberState extends State { title: LocaleKeys.profile_familyDetails.tr(), ), backgroundColor: MyColors.backgroundColor, - body: args['flag'] == 1 + body: params!.flag == 1 ? Column( children: [ - ListView(physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), children: [ - ListView.separated( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemBuilder: (BuildContext cxt, int parentIndex) { - return parseDynamicFormatTypeCols(getContactColsStructureList![parentIndex], parentIndex); - }, - separatorBuilder: (cxt, index) => 0.height, - itemCount: getContactColsStructureList!.length), - 12.height, - ListView.separated( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemBuilder: (BuildContext cxt, int parentIndex) { - return parseDynamicFormatTypeBasicDetDff(getBasicDetDffStructureList![parentIndex], parentIndex); - }, - separatorBuilder: (cxt, index) => 0.height, - itemCount: getBasicDetDffStructureList!.length), - ListView.separated( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemBuilder: (BuildContext cxt, int parentIndex) { - return parseDynamicFormatTypeContactDff(getContactDffStructureList![parentIndex], parentIndex); - }, - separatorBuilder: (cxt, index) => 0.height, - itemCount: getContactDffStructureList!.length), - ]).expanded, + ListView( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.all(21), + children: [ + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext cxt, int parentIndex) { + return parseDynamicFormatTypeCols(getContactColsStructureList![parentIndex], parentIndex); + }, + separatorBuilder: (BuildContext cxt, int index) => 0.height, + itemCount: getContactColsStructureList!.length), + 12.height, + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext cxt, int parentIndex) { + return parseDynamicFormatTypeBasicDetDff(getBasicDetDffStructureList![parentIndex], parentIndex); + }, + separatorBuilder: (BuildContext cxt, int index) => 0.height, + itemCount: getBasicDetDffStructureList!.length), + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext cxt, int parentIndex) { + return parseDynamicFormatTypeContactDff(getContactDffStructureList![parentIndex], parentIndex); + }, + separatorBuilder: (BuildContext cxt, int index) => 0.height, + itemCount: getContactDffStructureList!.length), + ], + ).expanded, DefaultButton(LocaleKeys.next.tr(), () async { submitUpdateForm(); }).insideContainer, ], ) - : args['flag'] == 2 + : params!.flag == 2 ? Column( children: [ - // getContactDetailsList!.isEmpty ListView(physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), children: [ ListView.separated( physics: const NeverScrollableScrollPhysics(), @@ -144,7 +159,7 @@ class _AddUpdateFamilyMemberState extends State { itemBuilder: (BuildContext cxt, int parentIndex) { return parseDynamicFormatTypeCols(getContactColsStructureList![parentIndex], parentIndex); }, - separatorBuilder: (cxt, index) => 0.height, + separatorBuilder: (BuildContext cxt, int index) => 0.height, itemCount: getContactColsStructureList!.length), 12.height, ListView.separated( @@ -153,7 +168,7 @@ class _AddUpdateFamilyMemberState extends State { itemBuilder: (BuildContext cxt, int parentIndex) { return parseDynamicFormatTypeBasicDetDff(getBasicDetDffStructureList![parentIndex], parentIndex); }, - separatorBuilder: (cxt, index) => 0.height, + separatorBuilder: (BuildContext cxt, int index) => 0.height, itemCount: getBasicDetDffStructureList!.length), ListView.separated( physics: const NeverScrollableScrollPhysics(), @@ -161,7 +176,7 @@ class _AddUpdateFamilyMemberState extends State { itemBuilder: (BuildContext cxt, int parentIndex) { return parseDynamicFormatTypeContactDff(getContactDffStructureList![parentIndex], parentIndex); }, - separatorBuilder: (cxt, index) => 0.height, + separatorBuilder: (BuildContext cxt, int index) => 0.height, itemCount: getContactDffStructureList!.length), ]).expanded, DefaultButton(LocaleKeys.next.tr(), () async { @@ -181,27 +196,27 @@ class _AddUpdateFamilyMemberState extends State { if (model.dATATYPE == "VARCHAR2") { if (model!.objectValuesList?.isNotEmpty ?? false) { return PopupMenuButton( - child: DynamicTextFieldWidget( - (model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : ""), - model!.getContactDetailsList!.sEGMENTVALUEDSP ?? "", - isEnable: false, - isPopup: true, - ).paddingOnly(bottom: 12), - itemBuilder: (_) => >[ - for (int i = 0; i < getContactColsStructureList[index]!.objectValuesList!.length; i++) - PopupMenuItem(child: Text(getContactColsStructureList[index]!.objectValuesList![i].mEANING.toString()), value: i), - ], - onSelected: (int popupIndex) { - model.getContactDetailsList!.sEGMENTVALUEDSP = getContactColsStructureList[index]!.objectValuesList![popupIndex].mEANING.toString(); - model.getContactDetailsList!.vARCHAR2VALUE = getContactColsStructureList[index]!.objectValuesList![popupIndex].cODE.toString(); - setState(() {}); - }); + child: DynamicTextFieldWidget( + (model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : ""), + model!.getContactDetailsList!.sEGMENTVALUEDSP ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getContactColsStructureList[index]!.objectValuesList!.length; i++) + PopupMenuItem(child: Text(getContactColsStructureList[index]!.objectValuesList![i].mEANING.toString()), value: i), + ], + onSelected: (int popupIndex) { + model.getContactDetailsList!.sEGMENTVALUEDSP = getContactColsStructureList[index]!.objectValuesList![popupIndex].mEANING.toString(); + model.getContactDetailsList!.vARCHAR2VALUE = getContactColsStructureList[index]!.objectValuesList![popupIndex].cODE.toString(); + setState(() {}); + }, + ); } else { return DynamicTextFieldWidget( (model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : ""), (model!.getContactDetailsList!.sEGMENTVALUEDSP ?? ""), - //isInputTypeNum: true, - onChange: (text) { + onChange: (String text) { model!.getContactDetailsList!.sEGMENTVALUEDSP = text; }, ).paddingOnly(bottom: 12); @@ -211,7 +226,7 @@ class _AddUpdateFamilyMemberState extends State { (model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : ""), (model!.getContactDetailsList!.sEGMENTVALUEDSP ?? ""), isInputTypeNum: true, - onChange: (text) { + onChange: (String text) { model!.getContactDetailsList!.sEGMENTVALUEDSP = text; }, ).paddingOnly(bottom: 12); @@ -223,13 +238,8 @@ class _AddUpdateFamilyMemberState extends State { isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); - //date = DateFormat('yyyy/MM/dd').format(dateValue); - //date = "2022-10-23T09:17:38.653+03:00"; date = (DateFormat('yyyy-MM-dd').format(dateValue)); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; - print(dateTime); - print(dateTime1); - print(date); setState(() {}); }, ).paddingOnly(bottom: 12); @@ -245,28 +255,28 @@ class _AddUpdateFamilyMemberState extends State { if (model!.fORMATTYPE == "C") { if (model!.eSERVICESVS?.isNotEmpty ?? false) { return PopupMenuButton( - child: DynamicTextFieldWidget( - (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.getContactDetailsList!.sEGMENTVALUEDSP ?? "", - isEnable: false, - isPopup: true, - ).paddingOnly(bottom: 12), - itemBuilder: (_) => >[ - for (int i = 0; i < getBasicDetDffStructureList[index]!.eSERVICESVS!.length; i++) - PopupMenuItem(child: Text(getBasicDetDffStructureList[index]!.eSERVICESVS![i].vALUECOLUMNNAME.toString()), value: i), - ], - onSelected: (int popupIndex) { - model.getContactDetailsList!.sEGMENTVALUEDSP = getBasicDetDffStructureList[index]!.eSERVICESVS![popupIndex].vALUECOLUMNNAME.toString(); - model.getContactDetailsList!.vARCHAR2VALUE = getBasicDetDffStructureList[index]!.eSERVICESVS![popupIndex].iDCOLUMNNAME.toString(); + child: DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.getContactDetailsList!.sEGMENTVALUEDSP ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getBasicDetDffStructureList[index]!.eSERVICESVS!.length; i++) + PopupMenuItem(child: Text(getBasicDetDffStructureList[index]!.eSERVICESVS![i].vALUECOLUMNNAME.toString()), value: i), + ], + onSelected: (int popupIndex) { + model.getContactDetailsList!.sEGMENTVALUEDSP = getBasicDetDffStructureList[index]!.eSERVICESVS![popupIndex].vALUECOLUMNNAME.toString(); + model.getContactDetailsList!.vARCHAR2VALUE = getBasicDetDffStructureList[index]!.eSERVICESVS![popupIndex].iDCOLUMNNAME.toString(); - setState(() {}); - }); + setState(() {}); + }, + ); } else { return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), model.getContactDetailsList!.sEGMENTVALUEDSP ?? "", - // isInputTypeNum: true, - onChange: (text) { + onChange: (String text) { model.getContactDetailsList!.sEGMENTVALUEDSP = text; }, ).paddingOnly(bottom: 12); @@ -276,7 +286,7 @@ class _AddUpdateFamilyMemberState extends State { (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), model.getContactDetailsList!.sEGMENTVALUEDSP ?? "", isInputTypeNum: true, - onChange: (text) { + onChange: (String text) { model.getContactDetailsList!.sEGMENTVALUEDSP = text; }, ).paddingOnly(bottom: 12); @@ -289,8 +299,6 @@ class _AddUpdateFamilyMemberState extends State { onTap: () async { DateTime dateValue = await _selectDate(context); date = (DateFormat('yyyy-MM-dd').format(dateValue)); - // date = (DateFormat('yyyy-MM-dd').format(dateValue) +"T"+ dateTime.toString() + dateTime1.toString()); - // date = DateFormat('yyyy/MM/dd').format(dateValue); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; setState(() {}); }, @@ -307,27 +315,27 @@ class _AddUpdateFamilyMemberState extends State { if (model!.fORMATTYPE == "C") { if (model.eSERVICESVS?.isNotEmpty ?? false) { return PopupMenuButton( - child: DynamicTextFieldWidget( - (model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : ""), - model!.getContactDetailsList!.sEGMENTVALUEDSP ?? "", - isEnable: false, - isPopup: true, - ).paddingOnly(bottom: 12), - itemBuilder: (_) => >[ - for (int i = 0; i < getContactDffStructureList[index]!.eSERVICESVS!.length; i++) - PopupMenuItem(child: Text(getContactDffStructureList[index]!.eSERVICESVS![i].vALUECOLUMNNAME.toString()), value: i), - ], - onSelected: (int popupIndex) { - model.getContactDetailsList!.sEGMENTVALUEDSP = getContactDffStructureList[index]!.eSERVICESVS![popupIndex].vALUECOLUMNNAME.toString(); - model.getContactDetailsList!.vARCHAR2VALUE = getContactDffStructureList[index]!.eSERVICESVS![popupIndex].iDCOLUMNNAME.toString(); - setState(() {}); - }); + child: DynamicTextFieldWidget( + (model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : ""), + model!.getContactDetailsList!.sEGMENTVALUEDSP ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getContactDffStructureList[index]!.eSERVICESVS!.length; i++) + PopupMenuItem(child: Text(getContactDffStructureList[index]!.eSERVICESVS![i].vALUECOLUMNNAME.toString()), value: i), + ], + onSelected: (int popupIndex) { + model.getContactDetailsList!.sEGMENTVALUEDSP = getContactDffStructureList[index]!.eSERVICESVS![popupIndex].vALUECOLUMNNAME.toString(); + model.getContactDetailsList!.vARCHAR2VALUE = getContactDffStructureList[index]!.eSERVICESVS![popupIndex].iDCOLUMNNAME.toString(); + setState(() {}); + }, + ); } else { return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), model.getContactDetailsList!.sEGMENTVALUEDSP ?? "", - // isInputTypeNum: true, - onChange: (text) { + onChange: (String text) { model.getContactDetailsList!.sEGMENTVALUEDSP = text; }, ).paddingOnly(bottom: 12); @@ -337,7 +345,7 @@ class _AddUpdateFamilyMemberState extends State { (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), model.getContactDetailsList!.sEGMENTVALUEDSP ?? "", isInputTypeNum: true, - onChange: (text) { + onChange: (String text) { model.getContactDetailsList!.sEGMENTVALUEDSP = text; }, ).paddingOnly(bottom: 12); @@ -349,9 +357,7 @@ class _AddUpdateFamilyMemberState extends State { isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); - // date = "2022-10-23T09:17:38.653+03:00"; date = (DateFormat('yyyy-MM-dd').format(dateValue)); - // date = DateFormat('yyyy/MM/dd').format(dateValue); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; setState(() {}); }, @@ -367,13 +373,13 @@ class _AddUpdateFamilyMemberState extends State { if (!Platform.isIOS) { await showCupertinoModalPopup( context: context, - builder: (cxt) => Container( + builder: (BuildContext cxt) => Container( height: 250, color: Colors.white, child: CupertinoDatePicker( backgroundColor: Colors.white, mode: CupertinoDatePickerMode.date, - onDateTimeChanged: (value) { + onDateTimeChanged: (DateTime value) { if (value != null && value != selectedDate) { time = value; } @@ -392,7 +398,6 @@ class _AddUpdateFamilyMemberState extends State { } void submitUpdateForm() async { - print("submit"); try { List> values1 = getBasicDetDffStructureList!.map((e) { String? dateVal = ''; @@ -441,12 +446,10 @@ class _AddUpdateFamilyMemberState extends State { return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: varChar).toJson(); }).toList(); List> values3 = getContactColsStructureList!.map((e) { - // String tempVar = e!.getContactDetailsList!.sEGMENTVALUEDSP ?? ""; String? dateVal = ''; - dynamic? varChar1 = ''; + String? varChar1 = ''; int? numberVal; - print("e.dATATYPE:${e?.dATATYPE}"); if (e!.dATATYPE == 'VARCHAR2') { dateVal = null; numberVal = null; @@ -468,15 +471,18 @@ class _AddUpdateFamilyMemberState extends State { }).toList(); List> valuesFinal = [...values1, ...values2, ...values3]; Utils.showLoading(context); - submitContactTransactionList = await ProfileApiClient().submitContactTransactionAddAndUpdate(args['actionType'], args['relationID'] ?? null, valuesFinal); - var transactionId = submitContactTransactionList!.pTRANSACTIONID; - var itemKey = submitContactTransactionList!.pITEMKEY; + submitContactTransactionList = await ProfileApiClient().submitContactTransactionAddAndUpdate(params!.actionType!, params!.relationID, valuesFinal); + Utils.hideLoading(context); + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), submitContactTransactionList!.pTRANSACTIONID!, submitContactTransactionList!.pITEMKEY!, 'family_member')); + if (!AppState().cancelRequestTrancsection) { + return; + } + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(submitContactTransactionList!.pTRANSACTIONID!); Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, - arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), transactionId!.toInt(), itemKey.toString(), 'family_member')); setState(() {}); } catch (ex) { - print(ex); Utils.hideLoading(context); Utils.handleException(ex, context, null); } diff --git a/lib/ui/profile/delete_family_member.dart b/lib/ui/profile/delete_family_member.dart index 16052f8..d42c129 100644 --- a/lib/ui/profile/delete_family_member.dart +++ b/lib/ui/profile/delete_family_member.dart @@ -1,6 +1,11 @@ +import 'dart:io'; + import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/profile_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'; @@ -10,13 +15,12 @@ import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart'; import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; -import 'dart:io'; -import 'package:flutter/cupertino.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; class DeleteFamilyMember extends StatefulWidget { int relationId; + DeleteFamilyMember(@required this.relationId, {Key? key}) : super(key: key); @override @@ -26,9 +30,11 @@ class DeleteFamilyMember extends StatefulWidget { class _DeleteFamilyMemberState extends State { String pFunctionName = "HR_PERINFO_SS"; String actionType = "DELETE"; + // int? contactRelationId; String? date = "MM/DD/YYYY"; String? datePar; + // String? itemKey; SubmitContactTransactionList? submitContactTransactionList; @@ -44,12 +50,16 @@ class _DeleteFamilyMemberState extends State { try { Utils.showLoading(context); submitContactTransactionList = await ProfileApiClient().submetConatctTransaction(pFunctionName.toString(), actionType.toString(), widget.relationId!.toInt(), datePar.toString()); - var transactionId = submitContactTransactionList!.pTRANSACTIONID; - var itemKey = submitContactTransactionList!.pITEMKEY; Utils.hideLoading(context); - // getApprovesList = await ProfileApiClient().getApproves(transactionId!.toInt(), itemKey.toString() ); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, - arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), transactionId!.toInt(), itemKey.toString(), 'family_member')); + + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), submitContactTransactionList!.pTRANSACTIONID!, submitContactTransactionList!.pITEMKEY!, 'family_member')); + if (!AppState().cancelRequestTrancsection) { + return; + } + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(submitContactTransactionList!.pTRANSACTIONID!); + Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -73,7 +83,8 @@ class _DeleteFamilyMemberState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ DynamicTextFieldWidget( - LocaleKeys.endDate.tr(), date.toString(), + LocaleKeys.endDate.tr(), + date.toString(), isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); @@ -85,10 +96,9 @@ class _DeleteFamilyMemberState extends State { ], ), ), - DefaultButton( - LocaleKeys.next.tr(), () async { - deleteFamilyMember(datePar);} - ).insideContainer, + DefaultButton(LocaleKeys.next.tr(), () async { + deleteFamilyMember(datePar); + }).insideContainer, ], )); } @@ -145,8 +155,7 @@ class _DeleteFamilyMemberState extends State { ), ); } else { - DateTime? picked = - await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); + DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); if (picked != null && picked != selectedDate) { time = picked; } diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart index 77b2abd..42f0758 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart @@ -3,8 +3,10 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.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'; @@ -296,8 +298,16 @@ class _DynamicInputScreenState extends State { ); Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(dynamicParams!.title, submitPhoneNumbers.pTRANSACTIONID!, submitPhoneNumbers.pITEMKEY!, 'address')); + + if (!AppState().cancelRequestTrancsection) { + return; + } + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(submitPhoneNumbers.pTRANSACTIONID!); + Utils.hideLoading(context); + } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_basic_details_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_basic_details_screen.dart index 749599c..93a8eb3 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_basic_details_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_basic_details_screen.dart @@ -3,8 +3,10 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.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'; @@ -378,7 +380,6 @@ class _DynamicInputScreenState extends State { values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson()); values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); - //values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); List> valuesCols = getBasicDetColsStructureList!.map((e) { if (e.dATATYPE == 'NUMBER') { numberValue = e.userBasicDetail!.nUMBERVALUE ?? 0; @@ -392,11 +393,18 @@ class _DynamicInputScreenState extends State { SubmitBasicDetailsTransactionList submitBasicDetails = await ProfileApiClient().submitBasicDetailsTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, transactionValues, dynamicParams!.correctOrNew); - print(submitBasicDetails); + Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(dynamicParams!.title, submitBasicDetails.pTRANSACTIONID!, submitBasicDetails.pITEMKEY!, 'basicDetails')); + + if (!AppState().cancelRequestTrancsection) { + return; + } + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(submitBasicDetails.pTRANSACTIONID!); + Utils.hideLoading(context); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); diff --git a/lib/ui/profile/family_members.dart b/lib/ui/profile/family_members.dart index 6c564e3..ffded0b 100644 --- a/lib/ui/profile/family_members.dart +++ b/lib/ui/profile/family_members.dart @@ -12,6 +12,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/ui/profile/add_update_family_member.dart'; import 'package:mohem_flutter_app/ui/profile/profile_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -140,7 +141,7 @@ class _FamilyMembersState extends State { LocaleKeys.addNewFamilyMember.tr(), menuEntries.updateButton == 'Y' ? () async { - Navigator.pushNamed(context, AppRoutes.addUpdateFamilyMember, arguments: {"relationID": relationId, "flag": 1, "actionType": "ADD"}); + Navigator.pushNamed(context, AppRoutes.addUpdateFamilyMember, arguments: FamilyMemberScreenParams( relationId, flag: 1, actionType: "ADD")); // ProfileScreen(); } : null) @@ -166,7 +167,7 @@ class _FamilyMembersState extends State { Navigator.pushNamed( context, AppRoutes.addUpdateFamilyMember, - arguments: {"relationID": relationId, "flag": 2, "actionType": "UPDATE"}, + arguments:FamilyMemberScreenParams(relationId, flag: 2, actionType: "UPDATE"), ); }, ); @@ -202,7 +203,7 @@ class _FamilyMembersState extends State { LocaleKeys.ok.tr(), ), onPressed: () { - Navigator.pushNamed(context, AppRoutes.deleteFamilyMember, arguments: relationId); + Navigator.pushNamed(context, AppRoutes.deleteFamilyMember, arguments: FamilyMemberScreenParams(relationId)); // continueDynamicForms(); }, ); diff --git a/lib/ui/profile/phone_numbers.dart b/lib/ui/profile/phone_numbers.dart index f4be007..666a029 100644 --- a/lib/ui/profile/phone_numbers.dart +++ b/lib/ui/profile/phone_numbers.dart @@ -1,6 +1,8 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/profile_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'; @@ -117,8 +119,14 @@ class _PhoneNumbersState extends State { setUpdateStatus(); submitPhoneNumbers = await ProfileApiClient().submitPhoneNumbers(widget.getEmployeePhonesList); Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.profile_contactDetails.tr(), submitPhoneNumbers.pTRANSACTIONID!, submitPhoneNumbers.pITEMKEY!, 'phone_numbers')); + if (!AppState().cancelRequestTrancsection) { + return; + } + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(submitPhoneNumbers.pTRANSACTIONID!); + Utils.hideLoading(context); } void setUpdateStatus() { diff --git a/lib/ui/termination/end_employement.dart b/lib/ui/termination/end_employement.dart index 73e8f79..cdfa46d 100644 --- a/lib/ui/termination/end_employement.dart +++ b/lib/ui/termination/end_employement.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/api/termination_dff_api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.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'; @@ -135,6 +136,9 @@ class _EndEmploymentScreenState extends State { Utils.hideLoading(context); await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitTermTransaction.pTRANSACTIONID!, submitTermTransaction.pITEMKEY!, "endEmployment")); + if (!AppState().cancelRequestTrancsection) { + return; + } Utils.showLoading(context); await LeaveBalanceApiClient().cancelHrTransaction(submitTermTransaction.pTRANSACTIONID!); Utils.hideLoading(context); diff --git a/lib/ui/work_list/sheets/update_continue_sheet.dart b/lib/ui/work_list/sheets/update_continue_sheet.dart index 1e4e5f3..1240de2 100644 --- a/lib/ui/work_list/sheets/update_continue_sheet.dart +++ b/lib/ui/work_list/sheets/update_continue_sheet.dart @@ -1,6 +1,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.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'; @@ -30,6 +32,7 @@ class _UpdateContinueSheetState extends State { double itemHeight = 0; double itemWidth = 0; List> validatedValues = []; + @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; @@ -57,11 +60,7 @@ class _UpdateContinueSheetState extends State { index, dataList[index].segmentPrompt, dataList[index].segmentValueDsp, - isNeedToShowEmptyDivider: (dataList.length == index + 1) - ? isOdd - ? true - : false - : false, + isNeedToShowEmptyDivider: (dataList.length == index + 1) ? (isOdd ? true : false) : false, ), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, @@ -95,7 +94,6 @@ class _UpdateContinueSheetState extends State { } void performNextAction() async { - //Resubmit EIT Transaction try { Utils.showLoading(context); List> values = []; @@ -114,7 +112,6 @@ class _UpdateContinueSheetState extends State { } } } - ResubmitEITRequestResponse resubmitEITRequestResponse = await MyAttendanceApiClient().reSubmitEitTransaction(widget.workListData!.iTEMKEY!, widget.workListData!.nOTIFICATIONID, values); Utils.hideLoading(context); await Navigator.pushNamed( @@ -122,6 +119,12 @@ class _UpdateContinueSheetState extends State { AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), resubmitEITRequestResponse.pTRANSACTIONID!, widget.workListData!.iTEMKEY!, 'eit'), ); + if (!AppState().cancelRequestTrancsection) { + return; + } + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(resubmitEITRequestResponse.pTRANSACTIONID!); + Utils.hideLoading(context); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); diff --git a/lib/ui/work_list/work_list_screen.dart b/lib/ui/work_list/work_list_screen.dart index 9b7fbe5..485921d 100644 --- a/lib/ui/work_list/work_list_screen.dart +++ b/lib/ui/work_list/work_list_screen.dart @@ -115,9 +115,9 @@ class _WorkListScreenState extends State { } } }); - workListItemTypes.removeWhere((element) => element.value == 0); + workListItemTypes.removeWhere((element) => element.value < 1); if (workListItemTypes.isNotEmpty) { - workListItemIndex = 0; + workListItemIndex = workListItemIndex ?? 0; } else { workListItemIndex = null; } @@ -147,17 +147,6 @@ class _WorkListScreenState extends State { } } }); - - // var tempList = providerData.getOpenNotificationsList?.where((notificationElement) { - // return (notificationElement.itemType == workListItemTypes[workListItemIndex].key) && notificationElement.itemType == workListElement.key; - // }).toList(); - // if (tempList!.isNotEmpty) { - // if ((AppState().workList?.length ?? 0) != (tempList.first.openNtfNumber ?? 0)) { - // workListElement.value = AppState().workList?.length ?? 0; - // providerData.workListCounter = providerData.workListCounter - ((tempList.first.openNtfNumber ?? 0) - (AppState().workList?.length ?? 0)); - // providerData.notify(); - // } - // } } }); } @@ -357,28 +346,15 @@ class _WorkListScreenState extends State { if (shouldReloadData != null) { if (shouldReloadData.toString() == "delegate_reload") { providerData.itgFormsModel!.totalCount = providerData.itgFormsModel!.totalCount! - 1; + workListItemIndex = null; calculateCounter(); - setState(() {}); if (workListItemIndex != null) { getWorkList(); + } else { + setState(() {}); } } - // workList!.remove(data); - // AppState().setWorkList = workList; - // if (data.iTEMTYPE == "ITG") { - // - // - // } else { - // providerData.getOpenNotificationsList?.forEach((element) { - // if (element.itemType == data.iTEMTYPE) { - // element.openNtfNumber = element.openNtfNumber! - 1; - // } - // }); - // providerData.workListCounter = providerData.workListCounter - 1; - // providerData.notify(); - // } - // calculateCounter(); - // if (mounted) setState(() {}); + } else { verifyWorkListCounter(); if (mounted) setState(() {}); @@ -477,7 +453,13 @@ class _WorkListScreenState extends State { if (shouldReloadData != null) { if (shouldReloadData.toString() == "delegate_reload") { verifyWorkListCounter(); - getWorkList(); + workListItemIndex = null; + calculateCounter(); + if (workListItemIndex != null) { + getWorkList(); + } else { + setState(() {}); + } } else { workList!.remove(data); AppState().setWorkList = workList; diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 1f62d4e..9bc0222 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -81,7 +81,6 @@ class _WorkListDetailScreenState extends State { GetContactNotificationBodyList? getContactNotificationBodyList; List? getAddressNotificationBodyList = []; - GenericResponseModel? getBasicNTFBody; GenericResponseModel? getICBody; GenericResponseModel? subordinatesLeavesModel; @@ -93,6 +92,9 @@ class _WorkListDetailScreenState extends State { bool isApproveAvailable = false; bool isRejectAvailable = false; + String approveAction = ""; + String rejectAction = ""; + bool isAttachmentLoaded = false; bool isActionHistoryLoaded = false; @@ -169,29 +171,6 @@ class _WorkListDetailScreenState extends State { if (controller.hasClients) { controller.jumpToPage(0); } - - // List dataToFetch = await Future.wait([ - // - // WorkListApiClient().getActionHistory(workListData!.nOTIFICATIONID!), - // WorkListApiClient().getAttachments(workListData!.nOTIFICATIONID!), - // ]); - // - // notificationButtonsList = dataToFetch[0]; - // actionHistoryList = dataToFetch[1]; - // getAttachmentList = dataToFetch[2]; - - // if (notificationButtonsList.isNotEmpty) { - // isCloseAvailable = notificationButtonsList.any((element) => element.bUTTONACTION == "CLOSE"); - // isApproveAvailable = notificationButtonsList.any((element) => element.bUTTONACTION == "APPROVED"); - // isRejectAvailable = notificationButtonsList.any((element) => element.bUTTONACTION == "REJECTED"); - // } - // Utils.hideLoading(context); - // setState(() {}); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // setState(() {}); - // } } List futureRequest = []; @@ -320,14 +299,14 @@ class _WorkListDetailScreenState extends State { if (isRejectAvailable) DefaultButton( LocaleKeys.reject.tr(), - () => performAction("REJECTED"), + () => performAction(rejectAction), colors: const [Color(0xffE47A7E), Color(0xffDE6D71)], ).expanded, if (isApproveAvailable && isRejectAvailable) 8.width, if (isApproveAvailable) DefaultButton( LocaleKeys.approve.tr(), - () => performAction("APPROVED"), + () => performAction(approveAction), colors: const [Color(0xff28C884), Color(0xff1BB271)], ).expanded, if (isCloseAvailable) @@ -417,7 +396,11 @@ class _WorkListDetailScreenState extends State { List viewApiButtonsList(List notificationButtonsList) { List fabs = []; for (int i = 0; i < notificationButtonsList.length; i++) { - if (notificationButtonsList[i].bUTTONACTION! == "REJECTED" || notificationButtonsList[i].bUTTONACTION! == "APPROVED" || notificationButtonsList[i].bUTTONACTION! == "CLOSE") { + if (notificationButtonsList[i].bUTTONACTION! == "REJECTED" || + notificationButtonsList[i].bUTTONACTION! == "REJECT" || + notificationButtonsList[i].bUTTONACTION! == "APPROVED" || + notificationButtonsList[i].bUTTONACTION! == "APPROVE" || + notificationButtonsList[i].bUTTONACTION! == "CLOSE") { continue; } fabs.add(myFab( @@ -989,8 +972,20 @@ class _WorkListDetailScreenState extends State { notificationButtonsList = await WorkListApiClient().getNotificationButtons(workListData!.nOTIFICATIONID!); if (notificationButtonsList.isNotEmpty) { isCloseAvailable = notificationButtonsList.any((element) => element.bUTTONACTION == "CLOSE"); - isApproveAvailable = notificationButtonsList.any((element) => element.bUTTONACTION == "APPROVED"); - isRejectAvailable = notificationButtonsList.any((element) => element.bUTTONACTION == "REJECTED"); + isApproveAvailable = notificationButtonsList.any((element) { + if (element.bUTTONACTION == "APPROVED" || element.bUTTONACTION == "APPROVE") { + approveAction = element.bUTTONACTION!; + return true; + } + return false; + }); + isRejectAvailable = notificationButtonsList.any((element) { + if (element.bUTTONACTION == "REJECTED" || element.bUTTONACTION == "REJECT") { + rejectAction = element.bUTTONACTION!; + return true; + } + return false; + }); } apiCallCount--; if (apiCallCount == 0) { diff --git a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart index 488b50f..d06bfdc 100644 --- a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart +++ b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart @@ -20,10 +20,13 @@ import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; +import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/ui/chat/chat_detailed_screen.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; +import 'package:provider/provider.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; class SearchEmployeeBottomSheet extends StatefulWidget { int? notificationID; @@ -47,6 +50,8 @@ class SearchEmployeeBottomSheet extends StatefulWidget { class _SearchEmployeeBottomSheetState extends State { TextEditingController username = TextEditingController(); + ScrollController sc = ScrollController(); + String searchText = ""; List? optionsList = [ @@ -61,7 +66,7 @@ class _SearchEmployeeBottomSheetState extends State { List? nonFavouriteUserList; // Chat Items - List? chatUsersList = []; + late ChatProviderModel provider; int _selectedSearchIndex = 0; @@ -88,25 +93,55 @@ class _SearchEmployeeBottomSheetState extends State { } void fetchChatUser({bool isNeedLoading = true}) async { + if (provider.pageNo == 1) provider.chatUsersList!.clear(); try { Utils.showLoading(context); - chatUsersList = await ChatApiClient().getChatMemberFromSearch( - searchText, - int.parse(AppState().chatDetails!.response!.id.toString()), - ); - chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id); + await ChatApiClient().getChatMemberFromSearch(searchText, AppState().chatDetails!.response!.id!, provider.pageNo).then((ChatUserModel value) { + if (value.response != null) { + if (provider.pageNo == 1) { + provider.chatUsersList = value.response; + } else { + print("--------------------------Added More----------------------"); + provider.chatUsersList!.addAll(value.response!); + } + } + }); + provider.chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id); Utils.hideLoading(context); setState(() {}); } catch (e) { Utils.hideLoading(context); Utils.handleException(e, context, null); } - if (isNeedLoading) Utils.hideLoading(context); setState(() {}); return null; } + void scrollListener() async { + if (sc.position.pixels == sc.position.maxScrollExtent) { + provider.pageNo++; + logger.w(provider.chatUsersList!.length); + logger.w(provider.pageNo); + fetchChatUser(); + } + } + + @override + void initState() { + super.initState(); + sc.addListener(scrollListener); + provider = Provider.of(context, listen: false); + } + + @override + void dispose() { + print("// TODO: implement dispose"); + super.dispose(); + provider.chatUsersList = []; + provider.pageNo = 1; + } + @override Widget build(BuildContext context) { return SizedBox( @@ -123,7 +158,7 @@ class _SearchEmployeeBottomSheetState extends State { 11.height, Row( children: [ - radioOption("Name", 0, _selectedSearchIndex), + radioOption(widget.fromChat ? "UserId" : "Name", 0, _selectedSearchIndex), radioOption("User Name", 1, _selectedSearchIndex), radioOption("Email", 2, _selectedSearchIndex), ], @@ -188,73 +223,137 @@ class _SearchEmployeeBottomSheetState extends State { ], ).expanded, if (widget.fromChat) - if (chatUsersList != null && widget.fromChat) - chatUsersList!.isEmpty + if (provider.chatUsersList != null && widget.fromChat) + provider.chatUsersList!.isEmpty ? Column( children: [ 20.height, Utils.getNoDataWidget(context), ], ) - : ListView( - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.only( - top: 15, - ), - children: [ - ListView.separated( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemBuilder: (BuildContext cxt, int index) { - return SizedBox( - height: 55, - child: ListTile( - leading: Stack( - children: [ - SvgPicture.asset( + : ListView.separated( + itemCount: provider.chatUsersList!.length, + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + controller: sc, + padding: const EdgeInsets.only(bottom: 80.0, top: 20), + itemBuilder: (BuildContext context, int index) { + return SizedBox( + height: 55, + child: Row( + children: [ + Stack( + children: [ + SvgPicture.asset( "assets/images/user.svg", height: 48, width: 48, ), - Positioned( - right: 5, - bottom: 1, - child: Container( - width: 10, - height: 10, - decoration: BoxDecoration( - color: chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red, - borderRadius: const BorderRadius.all( - Radius.circular(10), + Positioned( + right: 5, + bottom: 1, + child: Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: provider.chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red, + ), + ).circle(10), + ) + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (provider.chatUsersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "") + .toText14(color: MyColors.darkTextColor) + .paddingOnly(left: 11, top: 13), + provider.chatUsersList![index].isTyping! + ? 'Typing...' + .toText10( + color: MyColors.textMixColor, + ) + .paddingOnly(left: 11.0) + : const SizedBox() + ], + ).expanded, + SizedBox( + width: 60, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.end, + mainAxisSize: MainAxisSize.max, + children: [ + if (provider.chatUsersList![index].unreadMessageCount! > 0) + Container( + alignment: Alignment.center, + width: 18, + height: 18, + decoration: const BoxDecoration( + color: MyColors.redColor, + borderRadius: BorderRadius.all( + Radius.circular(20), ), ), - ), - ) + child: (provider.chatUsersList![index].unreadMessageCount!.toString()) + .toText10( + color: MyColors.white, + ) + .center, + ).paddingOnly(right: 10).center, + Icon( + provider.chatUsersList![index].isFav != null && provider.chatUsersList![index].isFav == false ? Icons.star_sharp : Icons.star_sharp, + color: provider.chatUsersList![index].isFav != null && provider.chatUsersList![index].isFav == true ? MyColors.yellowColor : MyColors.grey35Color, + ).onPress( + () { + if (provider.chatUsersList![index].isFav == null || provider.chatUsersList![index].isFav == false) { + provider + .favoriteUser( + userID: AppState().chatDetails!.response!.id!, + targetUserID: provider.chatUsersList![index].id!, + fromSearch: true + ) + .then((value) { + setState(() {}); + }); + } else if (provider.chatUsersList![index].isFav == true) { + provider + .unFavoriteUser( + userID: AppState().chatDetails!.response!.id!, + targetUserID: provider.chatUsersList![index].id!, + ) + .then((value) { + setState(() {}); + }); + } else { + provider + .favoriteUser( + userID: AppState().chatDetails!.response!.id!, + targetUserID: provider.chatUsersList![index].id!, + fromSearch: true + ) + .then((value) { + setState(() {}); + }); + } + }, + ).center ], ), - title: (chatUsersList![index].userName ?? "").toText14(color: MyColors.darkTextColor), - minVerticalPadding: 0, - onTap: () { - Navigator.pop(context); - Navigator.pushNamed( - context, - AppRoutes.chatDetailed, - arguments: ChatDetailedScreenParams(chatUsersList![index], true), - ); - }, ), - ); - }, - separatorBuilder: (BuildContext context, int index) => const Padding( - padding: EdgeInsets.only(right: 10, left: 70, bottom: 0, top: 0), - child: Divider( - color: Color(0xFFE5E5E5), - ), + ], ), - itemCount: chatUsersList?.length ?? 0, - ), - 12.height, - ], + ).onPress(() { + Navigator.pop(context); + Navigator.pushNamed( + context, + AppRoutes.chatDetailed, + arguments: ChatDetailedScreenParams(provider.chatUsersList![index], true), + ); + }); + }, + separatorBuilder: (BuildContext context, int index) => const Divider(color: MyColors.lightGreyE5Color).paddingOnly(left: 59), ).expanded, ], ).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded, @@ -263,6 +362,8 @@ class _SearchEmployeeBottomSheetState extends State { LocaleKeys.cancel.tr(), () { Navigator.pop(context); + provider.chatUsersList = []; + provider.pageNo = 1; }, textColor: MyColors.grey3AColor, colors: const [ diff --git a/lib/widgets/chat_app_bar_widge.dart b/lib/widgets/chat_app_bar_widge.dart index a67ae7d..790840c 100644 --- a/lib/widgets/chat_app_bar_widge.dart +++ b/lib/widgets/chat_app_bar_widge.dart @@ -11,56 +11,75 @@ import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:provider/provider.dart'; AppBar ChatAppBarWidget(BuildContext context, - {required String title, - bool showHomeButton = true, - String? image, - ChatUser? chatUser, - bool showTyping = false, - List? actions, - void Function()? onHomeTapped, - void Function()? onBackTapped}) { + {required String title, bool showHomeButton = true, ChatUser? chatUser, bool showTyping = false, List? actions, void Function()? onHomeTapped, void Function()? onBackTapped}) { return AppBar( leadingWidth: 0, - title: Row( - children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: Feedback.wrapForTap(() { - (onBackTapped == null ? Navigator.maybePop(context) : onBackTapped()); - }, context), - child: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), - ), - 4.width, - if (image != null) - CircularAvatar( - url: image, - height: 40, - width: 40, - isImageBase64: true, + title: Consumer(builder: (BuildContext cxt, ChatProviderModel data, Widget? child) { + return Row( + children: [ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: Feedback.wrapForTap(() { + (onBackTapped == null ? Navigator.maybePop(context) : onBackTapped()); + }, context), + child: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), ), - if (image != null) 14.width, - SizedBox( - height: 40, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - title.toText20(color: MyColors.darkTextColor, isBold: true).expanded, - if (showTyping) - Consumer( - builder: (BuildContext cxt, ChatProviderModel data, Widget? child) { - if (chatUser!.isTyping!) { - return ("Typing ...").toText10(color: MyColors.textMixColor); - } else { - return const SizedBox(); - } - }, - ), - ], - ), - ) - ], - ), + 4.width, + if (chatUser != null) + Stack( + children: [ + if (chatUser.isImageLoading!) + const SizedBox( + height: 48, + width: 48, + ).toShimmer().circle(30), + if (!chatUser.isImageLoading! && chatUser.userLocalDownlaodedImage == null) + SvgPicture.asset( + "assets/images/user.svg", + height: 48, + width: 48, + ), + if (!chatUser.isImageLoading! && chatUser.userLocalDownlaodedImage != null) + Container( + width: 48.0, + height: 48.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.cover, + image: FileImage(chatUser.userLocalDownlaodedImage!), + ), + ), + ), + Positioned( + right: 5, + bottom: 1, + child: Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: chatUser.userStatus == 1 ? MyColors.green2DColor : Colors.red, + ), + ).circle(10), + ) + ], + ), + if (chatUser != null) 14.width, + SizedBox( + height: 40, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + title.toText20(color: MyColors.darkTextColor, isBold: true).expanded, + if (showTyping) + if (chatUser!.isTyping!) ("Typing ...").toText10(color: MyColors.textMixColor) else const SizedBox(), + ], + ), + ) + ], + ); + }), centerTitle: false, elevation: 0, backgroundColor: Colors.white, diff --git a/lib/widgets/shimmer/dashboard_shimmer_widget.dart b/lib/widgets/shimmer/dashboard_shimmer_widget.dart index d023898..c11cf16 100644 --- a/lib/widgets/shimmer/dashboard_shimmer_widget.dart +++ b/lib/widgets/shimmer/dashboard_shimmer_widget.dart @@ -273,7 +273,7 @@ class ChatHomeShimmer extends StatelessWidget { children: [ Container( width: double.infinity, - height: 8.0, + height: 20.0, color: Colors.white, ), const Padding( @@ -281,7 +281,7 @@ class ChatHomeShimmer extends StatelessWidget { ), Container( width: double.infinity, - height: 8.0, + height: 15.0, color: Colors.white, ), const Padding( @@ -289,7 +289,7 @@ class ChatHomeShimmer extends StatelessWidget { ), Container( width: 40.0, - height: 8.0, + height: 10.0, color: Colors.white, ), ],