diff --git a/copilot-widget/lib/contexts/messageHandler.tsx b/copilot-widget/lib/contexts/messageHandler.tsx index 7f92d898a..c9493ea66 100644 --- a/copilot-widget/lib/contexts/messageHandler.tsx +++ b/copilot-widget/lib/contexts/messageHandler.tsx @@ -11,8 +11,40 @@ export type UserMessageType = { headers: Record; bot_token: string; query_params: Record; + language?: string; }; +function unsafe__decodeJSON>( + jsonString: string +): T | null { + try { + const parsed = JSON.parse(jsonString); + if (typeof parsed === "object" && parsed !== null) { + // Recursively parse nested JSON strings or arrays + Object.keys(parsed).forEach((key) => { + const value = parsed[key]; + if (typeof value === "string") { + if ( + typeof value === "string" && + ((value.startsWith("{") && value.endsWith("}")) || + (value.startsWith("[") && value.endsWith("]"))) + ) { + try { + parsed[key] = JSON.parse(value); + } catch (e) { + // Ignore errors for invalid JSON strings + } + } + } + }); + return parsed as T; + } + return null; + } catch (e) { + return null; + } +} + export type BotMessageType> = { from: "bot"; type: string; @@ -351,7 +383,7 @@ export class ChatController { name: string; }; const handle = (msg: string) => { - const parsedResponse = JSON.parse(msg) as ResponseObject; + const parsedResponse = unsafe__decodeJSON(msg) as ResponseObject; this.setValueImmer((draft) => { let message: BotMessageType | null = null; if (parsedResponse.type === "ui_form") { diff --git a/copilot-widget/lib/contexts/statefulMessageHandler.tsx b/copilot-widget/lib/contexts/statefulMessageHandler.tsx index 93d3c0edf..31310e59d 100644 --- a/copilot-widget/lib/contexts/statefulMessageHandler.tsx +++ b/copilot-widget/lib/contexts/statefulMessageHandler.tsx @@ -6,6 +6,7 @@ import { useSessionId } from "@lib/hooks/useSessionId"; import { useConfigData } from "./ConfigData"; import { useSocket } from "./SocketProvider"; import { ComponentRegistery } from "./componentRegistery"; +import { useLang } from ".."; const [useMessageHandler, MessageHandlerSafeProvider] = createSafeContext<{ __handler: ChatController; @@ -68,6 +69,7 @@ function useChatLoading() { function useSendMessage() { const { __handler } = useMessageHandler(); const { headers, token, queryParams } = useConfigData(); + const { lang } = useLang(); const socket = useSocket(); function send(content: string) { @@ -77,6 +79,7 @@ function useSendMessage() { query_params: queryParams ?? {}, content, bot_token: token, + language: lang, }, socket.__socket ); diff --git a/copilot-widget/lib/utils/createSocket.ts b/copilot-widget/lib/utils/createSocket.ts index a0f8d9de2..9eac61c12 100644 --- a/copilot-widget/lib/utils/createSocket.ts +++ b/copilot-widget/lib/utils/createSocket.ts @@ -1,4 +1,4 @@ -import { Socket, io } from "socket.io-client"; +import { io } from "socket.io-client"; interface ConfigType { socketUrl: string; @@ -6,18 +6,12 @@ interface ConfigType { sessionId: string; } -const sockets = new Map(); - export function createSocketClient({ socketUrl, token, sessionId, }: ConfigType) { - const socket = sockets.get(sessionId + token); - if (socket) { - return socket; - } - const newSocket = io(socketUrl, { + return io(socketUrl, { autoConnect: false, transports: ["websocket"], extraHeaders: { @@ -25,6 +19,4 @@ export function createSocketClient({ "X-Session-Id": sessionId, }, }); - sockets.set(sessionId + token, newSocket); - return newSocket; } diff --git a/copilot-widget/package.json b/copilot-widget/package.json index 44ac909cc..990e156b5 100644 --- a/copilot-widget/package.json +++ b/copilot-widget/package.json @@ -1,7 +1,7 @@ { "name": "@openchatai/copilot-widget", "private": false, - "version": "2.8.7", + "version": "2.8.8", "type": "module", "scripts": { "dev": "vite", diff --git a/dashboard/package.json b/dashboard/package.json index c263bb0a4..9f4f7a8b7 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -13,7 +13,7 @@ "dependencies": { "@hookform/resolvers": "^3.3.1", "@kbox-labs/react-echarts": "^1.0.3", - "@openchatai/copilot-widget": "^2.8.7", + "@openchatai/copilot-widget": "^2.8.8", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-avatar": "^1.0.4", diff --git a/dashboard/pnpm-lock.yaml b/dashboard/pnpm-lock.yaml index 16c0e4c81..0229fba05 100644 --- a/dashboard/pnpm-lock.yaml +++ b/dashboard/pnpm-lock.yaml @@ -12,8 +12,8 @@ dependencies: specifier: ^1.0.3 version: 1.0.3(echarts@5.4.3)(react@18.2.0) '@openchatai/copilot-widget': - specifier: ^2.8.7 - version: 2.8.7(react@18.2.0) + specifier: ^2.8.8 + version: 2.8.8(react@18.2.0) '@radix-ui/react-accordion': specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.2.13)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) @@ -706,8 +706,8 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@openchatai/copilot-widget@2.8.7(react@18.2.0): - resolution: {integrity: sha512-1g6JwP3ASbASIs3agqHIygaugvpqSWhKn9GCVUTFp6xvqGly1s+fsofaCetzBoNBZ6CkfueuqcWRB0/uD8pbUw==} + /@openchatai/copilot-widget@2.8.8(react@18.2.0): + resolution: {integrity: sha512-MaFwp3PPcxKqiYnF/X77DYvUCbOdJSIux/RTDcceBm1UVYPqQsSt01BQxjZj6IQhaIQRfszRjol8zoc2H3vEkQ==} peerDependencies: react: ^18.x dependencies: