From 59d6c94a5749a77de348057a85d5538a317f41fa Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Sep 2025 10:38:37 +0800 Subject: [PATCH] feat: Add Markdown direct link feature to DirectLinkModal (#28) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: DrizzleTime <169802108+DrizzleTime@users.noreply.github.com> Co-authored-by: 时雨 --- .../components/Modals/DirectLinkModal.tsx | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/web/src/pages/FileExplorerPage/components/Modals/DirectLinkModal.tsx b/web/src/pages/FileExplorerPage/components/Modals/DirectLinkModal.tsx index efbc397..b1413d1 100644 --- a/web/src/pages/FileExplorerPage/components/Modals/DirectLinkModal.tsx +++ b/web/src/pages/FileExplorerPage/components/Modals/DirectLinkModal.tsx @@ -1,6 +1,6 @@ import { memo, useState, useEffect } from 'react'; -import { Modal, Radio, message, Button, Typography, Input } from 'antd'; -import { CopyOutlined } from '@ant-design/icons'; +import { Modal, Radio, message, Button, Typography, Input, Space } from 'antd'; +import { CopyOutlined, FileMarkdownOutlined } from '@ant-design/icons'; import type { VfsEntry } from '../../../../api/client'; import { vfsApi } from '../../../../api/client'; @@ -11,6 +11,21 @@ interface DirectLinkModalProps { onCancel: () => void; } +// Helper function to check if a file is an image +const isImageFile = (fileName: string): boolean => { + const ext = fileName.split('.').pop()?.toLowerCase() || ''; + return ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'ico', 'tiff'].includes(ext); +}; + +// Helper function to generate Markdown formatted link +const generateMarkdownLink = (fileName: string, url: string): string => { + if (isImageFile(fileName)) { + return `![${fileName}](${url})`; + } else { + return `[${fileName}](${url})`; + } +}; + export const DirectLinkModal = memo(function DirectLinkModal({ entry, path, open, onCancel }: DirectLinkModalProps) { const [loading, setLoading] = useState(false); const [expiresIn, setExpiresIn] = useState(3600); @@ -41,6 +56,13 @@ export const DirectLinkModal = memo(function DirectLinkModal({ entry, path, open navigator.clipboard.writeText(text); message.success('已复制到剪贴板'); }; + + const handleCopyMarkdown = () => { + if (!entry || !link) return; + const markdownText = generateMarkdownLink(entry.name, link); + navigator.clipboard.writeText(markdownText); + message.success('Markdown 格式已复制到剪贴板'); + }; const handleExpiresChange = (e: any) => { setExpiresIn(e.target.value); @@ -69,9 +91,14 @@ export const DirectLinkModal = memo(function DirectLinkModal({ entry, path, open
- + + + +
);