diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dfb1636..64713f50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Fixed +- Fix `ChatSDK.onNewMessages()` calling `createOmnichannelMessages()` twice during polling + ## [1.10.7] - 2025-01-30 ### Added diff --git a/src/OmnichannelChatSDK.ts b/src/OmnichannelChatSDK.ts index be593f43..536a13b8 100644 --- a/src/OmnichannelChatSDK.ts +++ b/src/OmnichannelChatSDK.ts @@ -1157,7 +1157,7 @@ class OmnichannelChatSDK { ChatId: this.chatToken.chatId as string }); - return messages; + return messages as GetMessagesResponse; } catch { this.scenarioMarker.failScenario(TelemetryEvent.GetMessages, { RequestId: this.requestId, diff --git a/src/core/messaging/ACSClient.ts b/src/core/messaging/ACSClient.ts index bccf8b24..cefa9d57 100644 --- a/src/core/messaging/ACSClient.ts +++ b/src/core/messaging/ACSClient.ts @@ -13,6 +13,7 @@ import LiveChatVersion from "../LiveChatVersion"; import OmnichannelMessage from "./OmnichannelMessage"; import createOmnichannelMessage from "../../utils/createOmnichannelMessage"; import { defaultMessageTags } from "./MessageTags"; +import ACSGetMessagesOptionalParams from "./ACSClientGetMessagesOptionParams"; enum ACSClientEvent { InitializeACSClient = 'InitializeACSClient', @@ -89,10 +90,10 @@ export class ACSConversation { this.logger?.completeScenario(ACSClientEvent.InitializeACSConversation); } - public async getMessages(): Promise { + public async getMessages(optionsParams: ACSGetMessagesOptionalParams = {}): Promise { this.logger?.startScenario(ACSClientEvent.GetMessages); - const messages: OmnichannelMessage[] = []; + const messages = []; try { const pagedAsyncIterableIterator = await (this.chatThreadClient as ChatThreadClient).listMessages(); @@ -106,11 +107,13 @@ export class ACSConversation { continue; } - const omnichannelMessage = createOmnichannelMessage(chatMessage as ChatMessage, { - liveChatVersion: LiveChatVersion.V2 - }); - - messages.push(omnichannelMessage); + if (optionsParams?.skipConversion === true) { + messages.push(chatMessage as ChatMessage) + } else { + messages.push(createOmnichannelMessage(chatMessage as ChatMessage, { + liveChatVersion: LiveChatVersion.V2 + })); + } nextMessage = await pagedAsyncIterableIterator.next(); } @@ -128,7 +131,7 @@ export class ACSConversation { throw new Error(ACSClientEvent.GetMessages); } - return messages; + return (optionsParams?.skipConversion === true) ? messages as ChatMessage[] : messages as OmnichannelMessage[]; } public async getParticipants(): Promise { @@ -174,12 +177,11 @@ export class ACSConversation { } try { - const messages = await this.getMessages(); + const messages = await this.getMessages({skipConversion: true}); for (const message of messages.reverse()) { try { - const { id, sender } = message; - const customerMessageCondition = sender.displayName === ACSParticipantDisplayName.Customer; - + const { id, senderDisplayName } = message as ChatMessage; + const customerMessageCondition = senderDisplayName === ACSParticipantDisplayName.Customer; // Filter out customer messages if (customerMessageCondition) { continue; diff --git a/src/core/messaging/ACSClientGetMessagesOptionParams.ts b/src/core/messaging/ACSClientGetMessagesOptionParams.ts new file mode 100644 index 00000000..fa9d26bf --- /dev/null +++ b/src/core/messaging/ACSClientGetMessagesOptionParams.ts @@ -0,0 +1,3 @@ +export default interface ACSGetMessagesOptionalParams { + skipConversion?: boolean; // Skip conversion to OmnichanneMessage +} \ No newline at end of file