diff --git a/packages/chat-core/src/index.ts b/packages/chat-core/src/index.ts index 265a4521..f1dacb51 100644 --- a/packages/chat-core/src/index.ts +++ b/packages/chat-core/src/index.ts @@ -1,6 +1,6 @@ import fetch from "isomorphic-fetch"; import ReconnectingWebSocket from "reconnecting-websocket"; -import { equals, adjust, omit } from "ramda"; +import { equals, adjust, omit, findLast } from "ramda"; import { v4 as uuid } from "uuid"; // Bot response @@ -208,6 +208,20 @@ export const shouldReinitialize = ( ); }; +const getLastExpirationTimestamp = ( + responses: Response[], +): number | undefined => { + const lastExpirationResponse = findLast( + (response) => + response.type === "bot" && + typeof response.payload.expirationTimestamp === "number", + responses, + ); + return lastExpirationResponse?.type === "bot" + ? lastExpirationResponse.payload.expirationTimestamp + : undefined; +}; + export const createConversation = (config: Config): ConversationHandler => { let socket: ReconnectingWebSocket | undefined; @@ -303,6 +317,15 @@ export const createConversation = (config: Config): ConversationHandler => { null; const sendToBot = async (body: BotRequest): Promise => { + const lastExpirationTimestamp = getLastExpirationTimestamp(state.responses); + if ( + typeof lastExpirationTimestamp === "number" && + new Date().getTime() > lastExpirationTimestamp + ) { + setState({ + conversationId: uuid(), + }); + } const bodyWithContext = { userId: state.userId, conversationId: state.conversationId, diff --git a/packages/chat-widget/src/index.tsx b/packages/chat-widget/src/index.tsx index ee13aee2..3872aca6 100644 --- a/packages/chat-widget/src/index.tsx +++ b/packages/chat-widget/src/index.tsx @@ -258,29 +258,11 @@ export const retrieveSession = (storeIn: StorageType): SessionData | null => { try { const storage = storeIn === "sessionStorage" ? sessionStorage : localStorage; - // initial eslint integration - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions, @typescript-eslint/prefer-nullish-coalescing - const data = JSON.parse(storage.getItem(storageKey) || ""); + const data = JSON.parse(storage.getItem(storageKey) ?? ""); const responses: Response[] | undefined = data?.responses; const conversationId: string | undefined = data?.conversationId; - // initial eslint integration - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (responses) { - let expirationTimestamp: number | undefined; - responses.forEach((response) => { - // initial eslint integration - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (response.type === "bot" && response.payload.expirationTimestamp) { - expirationTimestamp = response.payload.expirationTimestamp; - } - }); - // initial eslint integration - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (!expirationTimestamp || new Date().getTime() < expirationTimestamp) { - return { responses, conversationId }; - } else { - return { responses }; - } + if (responses != null) { + return { responses, conversationId }; } return null; } catch (err) {