feat(canvas): 媒体地址 - 图片和视频右键支持复制私有 OSS 签名地址

This commit is contained in:
ddCat
2026-07-23 20:10:58 +08:00
parent b832668813
commit fca7c95b64
6 changed files with 60 additions and 2 deletions

View File

@@ -28,6 +28,7 @@ type CanvasProjectContextMenuProps = {
onEditText: (node: CanvasNodeData) => void;
onGenerateImage: (node: CanvasNodeData) => void;
onCopyContent: (node: CanvasNodeData | null) => void;
onCopyOssUrl: (node: CanvasNodeData | null) => void;
onToggleFrame: (node: CanvasNodeData) => void;
};
@@ -81,6 +82,7 @@ export function CanvasProjectContextMenu({ menu, node, screenToCanvas, ...props
if (node) props.onGenerateImage(node);
}}
onCopyContent={() => props.onCopyContent(node)}
onCopyOssUrl={() => props.onCopyOssUrl(node)}
onToggleFrame={() => {
if (node?.type === CanvasNodeType.Frame) props.onToggleFrame(node);
}}

View File

@@ -3,6 +3,8 @@ import type { MouseEvent as ReactMouseEvent } from "react";
import { useParams, useSearchParams } from "react-router";
import { useConfigStore, useEffectiveConfig } from "@/stores/use-config-store";
import { uploadMediaFile } from "@/services/file-storage";
import { getResourceOSSUrl } from "@/services/api/resources";
import copyToClipboard from "copy-to-clipboard";
import { nanoid } from "nanoid";
import { canvasThemes, type CanvasBackgroundMode } from "@/lib/canvas-theme";
import { persistCanvasMediaPerformanceMode, readCanvasMediaPerformanceMode } from "@/lib/canvas/canvas-performance-mode";
@@ -914,6 +916,20 @@ function InfiniteCanvasPage() {
[message],
);
const copyNodeOssUrlToClipboard = useCallback(
async (node: CanvasNodeData | null) => {
try {
const ossURL = await getResourceOSSUrl(node?.metadata?.storageKey);
if (navigator.clipboard?.writeText) await navigator.clipboard.writeText(ossURL);
else if (!copyToClipboard(ossURL)) throw new Error("当前浏览器不支持写入剪贴板");
message.success("临时 OSS 地址已复制");
} catch (error) {
message.error(error instanceof Error ? error.message : "复制 OSS 地址失败");
}
},
[message],
);
const handleCanvasContextMenu = useCallback(
(event: ReactMouseEvent) => {
const target = event.target instanceof Element ? event.target : null;
@@ -1439,6 +1455,7 @@ function InfiniteCanvasPage() {
onEditText={openTextEditor}
onGenerateImage={generateImageFromTextNode}
onCopyContent={(node) => { void copyNodeContentToClipboard(node); }}
onCopyOssUrl={(node) => { void copyNodeOssUrlToClipboard(node); }}
onToggleFrame={(node) => toggleFrameCollapsed(node.id)}
/>