diff --git a/pages/QrCode/QrCodeToUrlSection.tsx b/pages/QrCode/QrCodeToUrlSection.tsx index 1bc99ed..24f70cb 100644 --- a/pages/QrCode/QrCodeToUrlSection.tsx +++ b/pages/QrCode/QrCodeToUrlSection.tsx @@ -20,8 +20,9 @@ import ClearIcon from '@mui/icons-material/Clear'; import CopyButton from '@/components/CopyButton'; import { qrCodePageStyles } from '@/config/pageTheme'; import { useSnackbar } from '@/components/GlobalSnackbar'; -import { parseQrCodeFromFile } from '@/utils/qrCodeParser'; +import { parseQrCodeFromFile, parseQrCodeFromUrl } from '@/utils/qrCodeParser'; import { useTranslation } from 'react-i18next'; +import { useContextMenuData } from '@/utils/useContextMenuData'; interface QrCodeToUrlSectionProps { expanded: boolean; @@ -46,6 +47,39 @@ const QrCodeToUrlSection = ({ const fileInputRef = useRef(null); + // 处理右键菜单传递的图片 URL + const handleContextMenuData = useCallback( + async (imageUrl: string) => { + try { + setParsing(true); + setParseError(''); + setParsedUrl(''); + setPreviewUrl(imageUrl); + + const result = await parseQrCodeFromUrl(imageUrl); + + if (result.success && result.data) { + setParsedUrl(result.data); + showMessage(t('qrCode:parseSuccess'), { severity: 'success', autoHideDuration: 1000 }); + } else { + setParseError(result.error || t('qrCode:noQrDetected')); + showMessage(result.error || t('qrCode:noQrDetected'), { + severity: 'error', + autoHideDuration: 1000, + }); + } + } catch (error) { + console.error('解析二维码失败:', error); + showMessage(t('qrCode:parseError'), { severity: 'error', autoHideDuration: 300 }); + } finally { + setParsing(false); + } + }, + [showMessage, t], + ); + + useContextMenuData({ featureKey: 'qrCode', onData: handleContextMenuData }); + // 清理预览 URL,防止内存泄漏 useEffect(() => { return () => { diff --git a/utils/qrCodeParser.ts b/utils/qrCodeParser.ts index 0148c99..5727c28 100644 --- a/utils/qrCodeParser.ts +++ b/utils/qrCodeParser.ts @@ -35,3 +35,24 @@ export async function parseQrCodeFromFile(file: File): Promise { + try { + const response = await fetch(imageUrl); + if (!response.ok) { + return { success: false, error: '无法下载图片' }; + } + + const blob = await response.blob(); + const file = new File([blob], 'qrcode.jpg', { type: blob.type || 'image/jpeg' }); + + return await parseQrCodeFromFile(file); + } catch (err) { + const errorMsg = err instanceof Error ? err.message : String(err); + return { success: false, error: `下载图片失败: ${errorMsg}` }; + } +}