如何程序化触发LiveChatWidget聊天及预聊天表单提交问题
问题1:程序化触发@microsoft/omnichannel-chat-widget中LiveChatWidget的聊天初始化
要程序化触发聊天初始化,核心是结合OmnichannelChatSDK的API与组件状态控制:
- 先保存
chatSDK实例到ref中,方便后续调用 - 调用
chatSDK.startChat()发起聊天初始化,同时通过visible属性控制聊天窗口的显示
修改后的示例代码:
import { OmnichannelChatSDK } from "@microsoft/omnichannel-chat-sdk"; import { LiveChatWidget } from "@microsoft/omnichannel-chat-widget"; import { InputValidationPane, ChatButton, PreChatSurveyPane } from "@microsoft/omnichannel-chat-components"; import React, { useEffect, useState, useRef } from "react"; const getOmnichannelChatConfig = () => { const omnichannelConfig = { orgId: "xxx", orgUrl: "https://example.com", widgetId: "xxx", }; return omnichannelConfig; }; const ChatWidgetV1 = () => { const [liveChatWidgetProps, setLiveChatWidgetProps] = useState(null); const [isChatVisible, setIsChatVisible] = useState(false); const chatSDKRef = useRef(null); const init = async () => { const omnichannelConfig = getOmnichannelChatConfig(); const chatSDK = new OmnichannelChatSDK(omnichannelConfig); await chatSDK.initialize(); const chatConfig = await chatSDK.getLiveChatConfig(); chatSDKRef.current = chatSDK; const liveChatWidgetProps = { styleProps: { generalStyles: { width: "400px", height: "600px", bottom: "30px", right: "30px" }, }, chatSDK, chatConfig, webChatContainerProps: { disableMarkdownMessageFormatting: false }, visible: isChatVisible }; setLiveChatWidgetProps(liveChatWidgetProps); }; // 程序化触发聊天的函数,可绑定到按钮点击或自动触发 const triggerChatInit = async () => { if (!chatSDKRef.current) return; try { await chatSDKRef.current.startChat(); setIsChatVisible(true); } catch (error) { console.error("触发聊天失败:", error); } }; useEffect(() => { init(); // 如需页面加载自动触发,可取消下一行注释 // triggerChatInit(); }, []); return ( <div> <button onClick={triggerChatInit}>开启聊天</button> {liveChatWidgetProps && ( <LiveChatWidget {...liveChatWidgetProps} visible={isChatVisible} ></LiveChatWidget> )} </div> ); }; export default ChatWidgetV1;
问题2:自定义预聊天表单提交验证并正常发起聊天
自定义onSubmit会覆盖组件默认的提交逻辑,导致点击提交后无法触发聊天。解决思路是:在自定义验证通过后,手动调用chatSDK.startChat()并传入预聊天数据。
修改后的核心代码:
const ChatWidgetV1 = () => { const [liveChatWidgetProps, setLiveChatWidgetProps] = useState(null); const chatSDKRef = useRef(null); const init = async () => { const omnichannelConfig = getOmnichannelChatConfig(); const chatSDK = new OmnichannelChatSDK(omnichannelConfig); await chatSDK.initialize(); const chatConfig = await chatSDK.getLiveChatConfig(); chatSDKRef.current = chatSDK; const liveChatWidgetProps = { styleProps: { generalStyles: { width: "400px", height: "600px", bottom: "30px", right: "30px" }, }, chatSDK, chatConfig, webChatContainerProps: { disableMarkdownMessageFormatting: false }, }; setLiveChatWidgetProps(liveChatWidgetProps); }; useEffect(() => { init(); }, []); return ( <div> {liveChatWidgetProps && ( <LiveChatWidget {...liveChatWidgetProps} preChatSurveyPaneProps={{ controlProps: { onSubmit: async (values) => { try { // 自定义验证逻辑示例 if (!values.email?.includes('@')) { throw new Error("请输入有效的邮箱地址"); } if (!values.name?.trim()) { throw new Error("请填写您的姓名"); } // 验证通过后,调用SDK发起聊天并传入预聊天数据 await chatSDKRef.current.startChat({ preChatSurveyResponse: values }); } catch (error) { console.error("表单验证失败:", error.message); // 此处可添加用户提示逻辑,比如弹出错误提示框 } }, }, }} ></LiveChatWidget> )} </div> ); };
内容的提问来源于stack exchange,提问作者Shakeel Shakeel
相关产品推荐
相关产品推荐

