import { useState, useEffect, useCallback } from 'react' import { Modal, Select, Slider, InputNumber, Button, message, Typography, Space, QRCode, Divider, } from 'antd' import { DownloadOutlined, SettingOutlined } from '@ant-design/icons' import { useEditorStore } from '@/stores/editorStore' import { exportAndSave, formatFileSize } from '@/utils/imageExporter' const { Text } = Typography interface ExportDialogProps { open: boolean onClose: () => void } export default function ExportDialog({ open, onClose }: ExportDialogProps) { const canvas = useEditorStore((s) => s.canvas) const exportConfig = useEditorStore((s) => s.exportConfig) const setExportConfig = useEditorStore((s) => s.setExportConfig) const [estimatedSize, setEstimatedSize] = useState('') const [exporting, setExporting] = useState(false) // Update size estimate when config changes useEffect(() => { if (!canvas || !open) return // Estimate from canvas dimensions const w = canvas.width || 800 const h = canvas.height || 600 const exportW = Math.round(w * exportConfig.scaleFactor) const exportH = Math.round(h * exportConfig.scaleFactor) // Rough size estimation let bytes = exportW * exportH * 4 // RGBA if (exportConfig.format === 'jpeg' || exportConfig.format === 'webp') { bytes = Math.round(bytes * (exportConfig.quality / 100) * 0.3) } else { bytes = Math.round(bytes * 0.5) } setEstimatedSize(formatFileSize(bytes)) }, [canvas, open, exportConfig]) const handleExport = useCallback(async () => { if (!canvas) return setExporting(true) try { const success = await exportAndSave(canvas, exportConfig) if (success) { message.success('图片导出成功!') onClose() } } catch (err) { message.error('导出失败,请重试') console.error(err) } finally { setExporting(false) } }, [canvas, exportConfig, onClose]) const canvasW = canvas?.width || 800 const canvasH = canvas?.height || 600 const exportW = Math.round(canvasW * exportConfig.scaleFactor) const exportH = Math.round(canvasH * exportConfig.scaleFactor) return ( 导出图片 } open={open} onCancel={onClose} width={520} footer={null} destroyOnClose centered >
{/* Format */}
图片格式