import { useState } from 'react'; import { useQrState } from '../store/qrContext'; import { invoke } from '@tauri-apps/api/core'; import { writeText } from '@tauri-apps/plugin-clipboard-manager'; import { save } from '@tauri-apps/plugin-dialog'; import { writeFile } from '@tauri-apps/plugin-fs'; import type { QrConfig } from '../types'; import { buildEncodedText } from '../utils/qrText'; export default function ExportPanel() { const { state, dispatch } = useQrState(); const [exporting, setExporting] = useState(false); const [errorMsg, setErrorMsg] = useState(null); const handleCopySvg = async () => { if (!state.preview?.svg) return; try { await writeText(state.preview.svg); } catch (e) { setErrorMsg(`复制失败: ${e}`); } }; const handleExportPng = async () => { if (!state.preview?.svg) return; setExporting(true); setErrorMsg(null); try { const filePath = await save({ filters: [{ name: 'PNG 图片', extensions: ['png'] }], defaultPath: 'qrcode.png', }); if (!filePath) { setExporting(false); return; } const bytes: number[] = await invoke('export_png', { text: buildEncodedText(state.mode, state.formData), level: state.config.level, margin: state.config.margin, moduleSize: state.config.moduleSize, }); await writeFile(filePath, new Uint8Array(bytes)); } catch (e) { setErrorMsg(`导出 PNG 失败: ${e}`); } setExporting(false); }; const handleExportSvg = async () => { if (!state.preview?.svg) return; setErrorMsg(null); try { const filePath = await save({ filters: [{ name: 'SVG 图片', extensions: ['svg'] }], defaultPath: 'qrcode.svg', }); if (!filePath) return; await writeFile(filePath, new TextEncoder().encode(state.preview.svg)); } catch (e) { setErrorMsg(`导出 SVG 失败: ${e}`); } }; return (
导出选项
{errorMsg && (
{errorMsg}
)}
); }