From 1f074b33e561c51742ce9d056ac569b88e9a9f94 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 18 Nov 2025 16:06:37 +0300 Subject: [PATCH] chat finalized. --- .../service_request_detail_main_view.dart | 59 +++++++------- .../cx_module/chat/chat_api_client.dart | 7 +- lib/modules/cx_module/chat/chat_provider.dart | 60 ++------------ .../chat/helper/chat_file_picker.dart | 2 +- .../chat/model/chat_login_response_model.dart | 79 ++++++++++++++++++- 5 files changed, 116 insertions(+), 91 deletions(-) diff --git a/lib/modules/cm_module/views/service_request_detail_main_view.dart b/lib/modules/cm_module/views/service_request_detail_main_view.dart index 93a8aaa9..7f9ad154 100644 --- a/lib/modules/cm_module/views/service_request_detail_main_view.dart +++ b/lib/modules/cm_module/views/service_request_detail_main_view.dart @@ -88,36 +88,37 @@ class _ServiceRequestDetailMainState extends State { Navigator.pop(context); }, actions: [ - Selector( - selector: (_, myModel) => myModel.isLoading, // Selects only the userName - builder: (_, isLoading, __) { - if (isLoading) { - return const SizedBox(); - } else { - ServiceRequestDetailProvider provider = Provider.of(context, listen: false); - int? statusValue = provider.currentWorkOrder?.data?.status?.value; - if (statusValue == 2 || statusValue == 3 || statusValue == 5 || statusValue == 6) { - getChatToken(moduleId, provider.currentWorkOrder?.data?.workOrderNo ?? ""); - return Consumer(builder: (pContext, requestProvider, _) { - return IconButton( - icon: const Icon(Icons.chat_bubble), - onPressed: () { - Navigator.push( - context, - CupertinoPageRoute( - builder: (context) => ChatPage( - moduleId: 3, - requestId: widget.requestId, - title: _requestProvider.currentWorkOrder?.data?.workOrderNo ?? "", - readOnly: _requestProvider.isReadOnlyRequest, - ))); - }, - ).toShimmer(context: context, isShow: requestProvider.chatLoginTokenLoading, radius: 30, height: 30, width: 30); - }); + if (context.userProvider.isEngineer || context.userProvider.isNurse) + Selector( + selector: (_, myModel) => myModel.isLoading, // Selects only the userName + builder: (_, isLoading, __) { + if (isLoading) { + return const SizedBox(); + } else { + ServiceRequestDetailProvider provider = Provider.of(context, listen: false); + int? statusValue = provider.currentWorkOrder?.data?.status?.value; + if (statusValue == 2 || statusValue == 3 || statusValue == 5 || statusValue == 6) { + getChatToken(moduleId, provider.currentWorkOrder?.data?.workOrderNo ?? ""); + return Consumer(builder: (pContext, requestProvider, _) { + return IconButton( + icon: const Icon(Icons.chat_bubble), + onPressed: () { + Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => ChatPage( + moduleId: moduleId, + requestId: widget.requestId, + title: _requestProvider.currentWorkOrder?.data?.workOrderNo ?? "", + readOnly: _requestProvider.isReadOnlyRequest, + ))); + }, + ).toShimmer(context: context, isShow: requestProvider.chatLoginTokenLoading, radius: 30, height: 30, width: 30); + }); + } + return const SizedBox(); } - return const SizedBox(); - } - }), + }), isNurse ? IconButton( icon: 'qr'.toSvgAsset( diff --git a/lib/modules/cx_module/chat/chat_api_client.dart b/lib/modules/cx_module/chat/chat_api_client.dart index d7f42e9a..8466a596 100644 --- a/lib/modules/cx_module/chat/chat_api_client.dart +++ b/lib/modules/cx_module/chat/chat_api_client.dart @@ -43,15 +43,16 @@ class ChatApiClient { ChatLoginResponse? chatLoginResponse; - Future getChatLoginToken(int moduleId, int requestId, String title, String employeeNumber) async { + Future getChatLoginToken(int moduleId, int requestId, String title, String employeeNumber, String assigneeEmployeeNumber) async { Response response = await ApiClient().postJsonForResponse(URLs.chatSdkToken, { "apiKey": URLs.chatApiKey, "employeeNumber": employeeNumber, + "assigneeEmployeeNumber": assigneeEmployeeNumber, "userDetails": {"userName": ApiManager.instance.user?.username, "email": ApiManager.instance.user?.email}, "contextEnabled": true, "moduleCode": moduleId.toString(), "referenceId": requestId.toString(), - "referenceType": "ticket", + // "referenceType": "ticket", "title": title }); @@ -65,7 +66,7 @@ class ChatApiClient { } Future loadParticipants(int moduleId, int referenceId, String? assigneeEmployeeNumber) async { - Response response = await ApiClient().getJsonForResponse("${URLs.chatHubUrlApi}/chat/context/$moduleId/$referenceId", token: chatLoginResponse!.token); + Response response = await ApiClient().getJsonForResponse("${URLs.chatHubUrlApi}/chat/context/$moduleId/$referenceId?assigneeEmployeeNumber=$assigneeEmployeeNumber", token: chatLoginResponse!.token); if (!kReleaseMode) { // logger.i("login-res: " + response.body); diff --git a/lib/modules/cx_module/chat/chat_provider.dart b/lib/modules/cx_module/chat/chat_provider.dart index 043369d7..6aadcc44 100644 --- a/lib/modules/cx_module/chat/chat_provider.dart +++ b/lib/modules/cx_module/chat/chat_provider.dart @@ -57,56 +57,6 @@ import 'model/user_chat_history_model.dart'; late HubConnection chatHubConnection; class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin { - // ScrollController scrollController = ScrollController(); - // - // TextEditingController message = TextEditingController(); - // TextEditingController search = TextEditingController(); - // TextEditingController searchGroup = TextEditingController(); - // - // List? pChatHistory, searchedChats; - // String chatCID = ''; - // bool isLoading = true; - // bool isChatScreenActive = false; - // int receiverID = 0; - // late File selectedFile; - // String sFileType = ""; - // - // List favUsersList = []; - // int paginationVal = 0; - // int? cTypingUserId = 0; - // bool isTextMsg = false, isReplyMsg = false, isAttachmentMsg = false, isVoiceMsg = false; - // - // // Audio Recoding Work - // Timer? _timer; - // int _recodeDuration = 0; - // bool isRecoding = false; - // bool isPause = false; - // bool isPlaying = false; - // String? path; - // String? musicFile; - // late Directory appDirectory; - // late RecorderController recorderController; - // late PlayerController playerController; - // - // // List getEmployeeSubordinatesList = []; - // List teamMembersList = []; - // - // // groups.GetUserGroups userGroups = groups.GetUserGroups(); - // Material.TextDirection textDirection = Material.TextDirection.ltr; - // bool isRTL = false; - // String msgText = ""; - // - // //Chat Home Page Counter - // int chatUConvCounter = 0; - // - // // late List groupChatHistory, groupChatReplyData; - // - // /// Search Provider - // List? chatUsersList = []; - // int pageNo = 1; - // - // bool disbaleChatForThisUser = false; - bool isTyping = false; bool chatLoginTokenLoading = false; @@ -164,11 +114,13 @@ class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin { chatLoginTokenLoading = true; notifyListeners(); try { - chatLoginResponse = await ChatApiClient().getChatLoginToken(moduleId, requestId, title, myId); + chatLoginResponse = await ChatApiClient().getChatLoginToken(moduleId, requestId, title, myId, assigneeEmployeeNumber); chatParticipantModel = await ChatApiClient().loadParticipants(moduleId, requestId, assigneeEmployeeNumber); - sender = chatParticipantModel?.participants?.singleWhere((participant) => participant.employeeNumber == myId); - recipient = chatParticipantModel?.participants?.singleWhere((participant) => participant.employeeNumber == assigneeEmployeeNumber); - } catch (ex) {} + sender = chatParticipantModel?.participants?.firstWhere((participant) => participant.employeeNumber == myId); + recipient = chatParticipantModel?.participants?.firstWhere((participant) => participant.employeeNumber == assigneeEmployeeNumber); + } catch (ex) { + print(ex); + } chatLoginTokenLoading = false; notifyListeners(); } 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 63e19d71..9d928521 100644 --- a/lib/modules/cx_module/chat/helper/chat_file_picker.dart +++ b/lib/modules/cx_module/chat/helper/chat_file_picker.dart @@ -71,7 +71,7 @@ class ChatFilePicker extends StatelessWidget { fromFilePicker(BuildContext context) async { FilePickerResult? result = await FilePicker.platform.pickFiles( type: FileType.custom, - allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], + allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx', 'txt'], ); if ((result?.paths ?? []).isNotEmpty) { Navigator.pop(context, File(result!.paths.first!)); diff --git a/lib/modules/cx_module/chat/model/chat_login_response_model.dart b/lib/modules/cx_module/chat/model/chat_login_response_model.dart index 3fde6c54..a8612818 100644 --- a/lib/modules/cx_module/chat/model/chat_login_response_model.dart +++ b/lib/modules/cx_module/chat/model/chat_login_response_model.dart @@ -4,9 +4,15 @@ class ChatLoginResponse { String? userName; int? applicationId; int? expiresIn; - String? context; + Context? context; - ChatLoginResponse({this.token, this.userId, this.userName, this.applicationId, this.expiresIn, this.context}); + ChatLoginResponse( + {this.token, + this.userId, + this.userName, + this.applicationId, + this.expiresIn, + this.context}); ChatLoginResponse.fromJson(Map json) { token = json['token']; @@ -14,7 +20,8 @@ class ChatLoginResponse { userName = json['userName']; applicationId = json['applicationId']; expiresIn = json['expiresIn']; - context = json['context']; + context = + json['context'] != null ? new Context.fromJson(json['context']) : null; } Map toJson() { @@ -24,7 +31,71 @@ class ChatLoginResponse { data['userName'] = this.userName; data['applicationId'] = this.applicationId; data['expiresIn'] = this.expiresIn; - data['context'] = this.context; + if (this.context != null) { + data['context'] = this.context!.toJson(); + } + return data; + } +} + +class Context { + String? conversationId; + String? moduleCode; + String? referenceId; + String? title; + List? deepLinks; + + Context( + {this.conversationId, + this.moduleCode, + this.referenceId, + this.title, + this.deepLinks}); + + Context.fromJson(Map json) { + conversationId = json['conversationId']; + moduleCode = json['moduleCode']; + referenceId = json['referenceId']; + title = json['title']; + if (json['deepLinks'] != null) { + deepLinks = []; + json['deepLinks'].forEach((v) { + deepLinks!.add(new DeepLinks.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['conversationId'] = this.conversationId; + data['moduleCode'] = this.moduleCode; + data['referenceId'] = this.referenceId; + data['title'] = this.title; + if (this.deepLinks != null) { + data['deepLinks'] = this.deepLinks!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class DeepLinks { + String? employeeNumber; + int? userId; + String? userName; + + DeepLinks({this.employeeNumber, this.userId, this.userName}); + + DeepLinks.fromJson(Map json) { + employeeNumber = json['employeeNumber']; + userId = json['userId']; + userName = json['userName']; + } + + Map toJson() { + final Map data = new Map(); + data['employeeNumber'] = this.employeeNumber; + data['userId'] = this.userId; + data['userName'] = this.userName; return data; } }