From 7592203f776251a54a17d1d9f03a01f719e465b6 Mon Sep 17 00:00:00 2001 From: mlogclub Date: Tue, 28 Apr 2026 23:13:49 +0800 Subject: [PATCH] feat(widget-demo): add copy functionality for widget snippet with visual feedback --- web/components/kefu/widget-demo.tsx | 32 ++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/web/components/kefu/widget-demo.tsx b/web/components/kefu/widget-demo.tsx index 9345cf9..ce6465e 100644 --- a/web/components/kefu/widget-demo.tsx +++ b/web/components/kefu/widget-demo.tsx @@ -1,6 +1,7 @@ "use client" import { SignJWT } from "jose" +import { CheckIcon, CopyIcon } from "lucide-react" import { useEffect, useMemo, useState } from "react" import type { KefuWidgetHostConfig } from "@/lib/kefu-widget-config" @@ -134,6 +135,7 @@ export function KefuWidgetDemo() { const [origin, setOrigin] = useState("") const [generatedToken, setGeneratedToken] = useState("") const [copied, setCopied] = useState(false) + const [snippetCopied, setSnippetCopied] = useState(false) async function mountWidget(configToMount: WidgetDemoConfig) { let userToken = "" @@ -241,6 +243,15 @@ ${configLines.join(",\n")} window.setTimeout(() => setCopied(false), 1600) } + async function handleCopySnippet() { + if (typeof navigator === "undefined") { + return + } + await navigator.clipboard.writeText(snippet) + setSnippetCopied(true) + window.setTimeout(() => setSnippetCopied(false), 1600) + } + return (
@@ -319,9 +330,24 @@ ${configLines.join(",\n")} 当前页面仅用于本地模拟。正式接入时,userToken 应由业务系统后端签发。
) : null} -
-            {snippet}
-          
+
+ +
+              {snippet}
+            
+
直接访问客户对话