diff --git a/web/components/kefu/chat-shell.tsx b/web/components/kefu/chat-shell.tsx index 8949455..bee6d8d 100644 --- a/web/components/kefu/chat-shell.tsx +++ b/web/components/kefu/chat-shell.tsx @@ -1,6 +1,7 @@ "use client" import { + CheckCircle2Icon, Maximize2Icon, Minimize2Icon, MinusIcon, @@ -68,13 +69,27 @@ function useKefuSystemTheme() { }, []) } +function isEmbeddedInHost() { + if (typeof window === "undefined") { + return false + } + + try { + return window.parent !== window + } catch { + return false + } +} + export function KefuChatShell() { useKefuSystemTheme() const messageListRef = useRef(null) + const [isEmbedded] = useState(() => isEmbeddedInHost()) const [isMaximized, setIsMaximized] = useState(false) const [isCloseDialogOpen, setIsCloseDialogOpen] = useState(false) const [isClosingConversation, setIsClosingConversation] = useState(false) + const [isConversationClosed, setIsConversationClosed] = useState(false) const { title, @@ -200,6 +215,10 @@ export function KefuChatShell() { requestKefuHostToggleMaximize() } + function handleRestartConversation() { + window.location.reload() + } + async function confirmCloseConversation() { if (isClosingConversation) { return @@ -210,7 +229,11 @@ export function KefuChatShell() { await closeConversation() } setIsCloseDialogOpen(false) - requestKefuHostClose() + if (isEmbedded) { + requestKefuHostClose() + } else { + setIsConversationClosed(true) + } } catch (closeError) { window.alert(closeError instanceof Error ? closeError.message : "关闭会话失败") } finally { @@ -231,6 +254,47 @@ export function KefuChatShell() { return () => window.removeEventListener("keydown", handleKeyDown) }, [isCloseDialogOpen, isClosingConversation]) + if (isConversationClosed) { + return ( +
+
+
+
+
+ {title} +
+ {subtitle ? ( +
+ {subtitle} +
+ ) : null} +
+
+ +
+
+
+ +
+
+
会话已结束
+

+ 当前客服会话已关闭,如需继续咨询可以重新发起对话。 +

+
+ +
+
+
+
+ ) + } + return (
- - + {isEmbedded ? ( + <> + + + + ) : null}