From e303b4e099485e6dc60e553f87c9c3e7d7812642 Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Tue, 30 Dec 2025 13:56:00 +0300 Subject: [PATCH] chat bug fixes --- lib/controllers/api_routes/urls.dart | 1 + .../cx_module/chat/chat_api_client.dart | 44 +++++++++++++++++++ lib/modules/cx_module/chat/chat_page.dart | 6 ++- lib/modules/cx_module/chat/chat_provider.dart | 31 ++++++++++++- lib/modules/cx_module/chat/chat_widget.dart | 6 ++- .../chat/helper/chat_file_picker.dart | 1 + .../chat/model/chat_participant_model.dart | 6 +-- 7 files changed, 88 insertions(+), 7 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index bd3e73e6..2897df0d 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -17,6 +17,7 @@ class URLs { static const String chatHubUrlApi = "$chatHubUrl/api"; // new V2 apis static const String chatHubUrlChat = "$chatHubUrl/hubs/chat"; // new V2 apis + static const String resetMessageCount = "$chatHubUrlApi/userChatHistory/AckMessages"; // new V2 apis static const String chatApiKey = "f53a98286f82798d588f67a7f0db19f7aebc839e"; // new V2 apis static String _host = host1; diff --git a/lib/modules/cx_module/chat/chat_api_client.dart b/lib/modules/cx_module/chat/chat_api_client.dart index 29d9239a..77770e83 100644 --- a/lib/modules/cx_module/chat/chat_api_client.dart +++ b/lib/modules/cx_module/chat/chat_api_client.dart @@ -95,6 +95,50 @@ class ChatApiClient { } } + Future resetCountApi(int moduleCode, int referenceNumber, String? employeeNumber) async { + final Map payload = { + 'moduleCode': moduleCode, + 'ReferenceNumber': referenceNumber, + }; + + // final headers = chatAckHeaders( + // apiKey: URLs.chatApiKey, + // employeeNumber: employeeNumber.toString(), + // origin: 'http://localhost:4400', + // referer: 'http://localhost:4400/', + // userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', + // ); + + final Response response = await ApiClient().postJsonForResponse( + URLs.resetMessageCount, + payload, + token: chatLoginResponse!.token, + // headers: headers, + ); + // Response response = await ApiClient().postJsonForResponse( + // "${URLs.resetMessageCount}?moduleCode=$moduleCode&ReferenceNumber=$referenceNumber", {"moduleCode": moduleCode.toString(), "ReferenceNumber": referenceNumber.toString()}, + // token: chatLoginResponse!.token); + + + return response.statusCode == 200; + } + + Map chatAckHeaders({ + required String apiKey, + required String employeeNumber, + required String origin, + required String referer, + required String userAgent, + String acceptLanguage = 'en-US,en;q=0.9', + }) { + return { + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': 'application/json', + // 'X-API-Key': apiKey, + // 'X-Employee-Number': employeeNumber, + }; + } + Future> viewAllDocuments(int moduleId, int referenceId) async { Response response = await ApiClient().getJsonForResponse("${URLs.chatHubUrlApi}/attachments/conversation?referenceId=$referenceId&moduleCode=$moduleId", token: chatLoginResponse!.token); diff --git a/lib/modules/cx_module/chat/chat_page.dart b/lib/modules/cx_module/chat/chat_page.dart index f84b4e23..d4b44721 100644 --- a/lib/modules/cx_module/chat/chat_page.dart +++ b/lib/modules/cx_module/chat/chat_page.dart @@ -75,7 +75,7 @@ class _ChatPageState extends State { }); } - void loadChatHistory() { + void loadChatHistory() async { // // String assigneeEmployeeNumber = Provider.of(context, listen: false).currentWorkOrder?.data?.assignedEmployee?.employeeId ?? ""; // // String myEmployeeId = context.userProvider.user!.username!; // // @@ -99,7 +99,9 @@ class _ChatPageState extends State { ? Provider.of(context, listen: false).currentWorkOrder!.data!.workOrderCreatedBy!.employeeId! : Provider.of(context, listen: false).currentWorkOrder!.data!.workOrderContactPerson.first.employeeId!)) : ""); - Provider.of(context, listen: false).connectToHub(widget.moduleId, widget.requestId, myEmployeeId, receiver, widget.readOnly, isMounted: mounted); + ChatProvider chatProvider = Provider.of(context, listen: false); + chatProvider.connectToHub(widget.moduleId, widget.requestId, myEmployeeId, receiver, widget.readOnly, isMounted: mounted); + } @override diff --git a/lib/modules/cx_module/chat/chat_provider.dart b/lib/modules/cx_module/chat/chat_provider.dart index 136dd28b..84282a64 100644 --- a/lib/modules/cx_module/chat/chat_provider.dart +++ b/lib/modules/cx_module/chat/chat_provider.dart @@ -40,6 +40,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:signalr_netcore/hub_connection.dart'; import 'package:signalr_netcore/signalr_client.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/modules/cx_module/chat/model/chat_login_response_model.dart'; @@ -370,9 +371,37 @@ class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin { // } } } - // notifyListeners(); } + Future resetCount({ + required int moduleId, + required int referenceNo, + String ?userId , + }) async { + try { + return await ChatApiClient().resetCountApi(moduleId, referenceNo,userId); + } catch (e, stack) { + debugPrint('resetCount error: $e'); + rethrow; + } + } + + // Future resetCount({ required int moduleId, + // required int referenceNo}) async { + // Response response; + // try { + // response = await ApiManager.instance.post("${URLs.resetMessageCount}?moduleCode=$moduleId&ReferenceNumber=$referenceNo", body: {}); + // notifyListeners(); + // if (response.statusCode == 200) { + // return true; + // } + // return false; + // } catch (error) { + // notifyListeners(); + // return false; + // } + // } + void updateUserChatHistoryStatusAsync(List data) { try { chatHubConnection!.invoke("UpdateUserChatHistoryStatusAsync", args: [data]); diff --git a/lib/modules/cx_module/chat/chat_widget.dart b/lib/modules/cx_module/chat/chat_widget.dart index f84c7032..788f470b 100644 --- a/lib/modules/cx_module/chat/chat_widget.dart +++ b/lib/modules/cx_module/chat/chat_widget.dart @@ -86,7 +86,11 @@ class _ChatWidgetState extends State { minSize: 18, child: IconButton( icon: const Icon(Icons.chat_bubble), - onPressed: () { + onPressed: () async { + bool readStatus = await chatProvider.resetCount(moduleId: widget.moduleId, referenceNo: widget.requestId, userId: context.userProvider.user?.id); + if (readStatus) { + chatProvider.chatParticipantModel?.unreadCount = 0; + } Navigator.push( context, CupertinoPageRoute( diff --git a/lib/modules/cx_module/chat/helper/chat_file_picker.dart b/lib/modules/cx_module/chat/helper/chat_file_picker.dart index 1070e3db..f080cd20 100644 --- a/lib/modules/cx_module/chat/helper/chat_file_picker.dart +++ b/lib/modules/cx_module/chat/helper/chat_file_picker.dart @@ -46,6 +46,7 @@ class ChatFilePicker extends StatelessWidget { fromMediaPicker(BuildContext context, ImageSource imageSource) async { XFile? pickedFile = await ImagePicker().pickImage(source: imageSource, imageQuality: 70, maxWidth: 800, maxHeight: 800); if (pickedFile != null) { + //Has UI issues here top buttons not clickable smoothly CroppedFile? croppedFile = await ImageCropper().cropImage( sourcePath: pickedFile.path, // aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1), diff --git a/lib/modules/cx_module/chat/model/chat_participant_model.dart b/lib/modules/cx_module/chat/model/chat_participant_model.dart index 671bc4c4..80c6bfc4 100644 --- a/lib/modules/cx_module/chat/model/chat_participant_model.dart +++ b/lib/modules/cx_module/chat/model/chat_participant_model.dart @@ -5,7 +5,7 @@ class ChatParticipantModel { String? title; String? conversationType; List? participants; - // String? lastMessage; + dynamic lastMessage; String? createdAt; int? unreadCount; @@ -21,7 +21,7 @@ class ChatParticipantModel { participants!.add(new Participants.fromJson(v)); }); } - // lastMessage = json['lastMessage']; + lastMessage = json['lastMessage']; createdAt = json['createdAt']; unreadCount = json['unreadCount']; } @@ -34,7 +34,7 @@ class ChatParticipantModel { if (participants != null) { data['participants'] = participants!.map((v) => v.toJson()).toList(); } - // data['lastMessage'] = lastMessage; + data['lastMessage'] = lastMessage; data['createdAt'] = createdAt; data['unreadCount'] = unreadCount; return data;