diff --git a/components/canvas/RealtimeCanvasDialog.tsx b/components/canvas/RealtimeCanvasDialog.tsx index 532c84d0a..0aa1b5795 100644 --- a/components/canvas/RealtimeCanvasDialog.tsx +++ b/components/canvas/RealtimeCanvasDialog.tsx @@ -703,6 +703,8 @@ export function RealtimeCanvasDialog({ defaultRealtimeConfig.transport.throttleInterval ); const [refreshToken, setRefreshToken] = useState(0); + const [siteName, setSiteName] = useState("AI Chatbot"); + const [siteLogo, setSiteLogo] = useState(null); const statusBadge = useMemo(() => { if (status === "live") return { label: "实时中", className: "bg-emerald-50 text-emerald-700" }; @@ -723,6 +725,31 @@ export function RealtimeCanvasDialog({ return selectedImageLayer.width / baseWidth; }, [selectedImageLayer]); + useEffect(() => { + let cancelled = false; + + fetch(`/api/site-settings?t=${Date.now()}`, { cache: "no-store" }) + .then((res) => (res.ok ? res.json() : null)) + .then((data) => { + if (!data || cancelled) return; + if (typeof data.siteName === "string" && data.siteName.trim()) { + setSiteName(data.siteName.trim()); + } + if (typeof data.siteLogo === "string" && data.siteLogo.trim()) { + setSiteLogo(data.siteLogo.trim()); + } else if (typeof data.siteLogoDark === "string" && data.siteLogoDark.trim()) { + setSiteLogo(data.siteLogoDark.trim()); + } + }) + .catch((error) => { + console.warn("[RealtimeCanvas] Failed to load site settings:", error); + }); + + return () => { + cancelled = true; + }; + }, []); + const pushMetric = useCallback((event: any) => { metricsQueueRef.current.push(event); if (metricsQueueRef.current.length > 120) { @@ -2257,7 +2284,22 @@ export function RealtimeCanvasDialog({
- Realtime Canvas +
+ {siteLogo ? ( + {siteName} + ) : ( +
+ +
+ )} + + {siteName} + +
{standalone ? (
-
-
-
+
+
+
- 图层
- + {imageLayers.length} 张
-
+
{imageLayers.length === 0 ? ( -
- 暂无图片图层 +
+ 暂无图层
) : ( [...imageLayers].reverse().map((layer, displayIndex) => { @@ -2692,60 +2728,64 @@ export function RealtimeCanvasDialog({
-
+ -
- {isTopMost ? "当前最上层" : isBottomMost ? "当前底层" : "中间图层"} -
-
-
+ +
+ +
@@ -2754,17 +2794,16 @@ export function RealtimeCanvasDialog({ )}
{selectedImageLayer ? ( -
-
- 图层缩放 - {Math.round(selectedImageLayerScale * 100)}% +
+
+ {Math.round(selectedImageLayerScale * 100)}%
-
+
- { - scaleImageLayer(selectedImageLayer.id, value / 100); - }} - onValueCommit={([value]) => { - const nextLayers = scaleImageLayer(selectedImageLayer.id, value / 100); - if (nextLayers) { - saveHistory(nextLayers); - markCanvasDirty(null); - scheduleFlush(true); - } - }} - className="flex-1" - trackClassName="h-2.5 bg-zinc-200 shadow-inner" - rangeClassName="bg-sky-500" - thumbClassName="h-5 w-5 border border-zinc-300 bg-white shadow-sm" - />
@@ -2825,11 +2843,11 @@ export function RealtimeCanvasDialog({