import React, { useState } from 'react'; import { Box, Typography, TextField, Button, Stack, Accordion, AccordionSummary, AccordionDetails, CircularProgress, } from '@mui/material'; import QrCodeIcon from '@mui/icons-material/QrCode'; import DownloadIcon from '@mui/icons-material/Download'; import ContentCopyIcon from '@mui/icons-material/ContentCopy'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import QRious from 'qrious'; import { qrCodePageStyles } from '@/config/pageTheme'; import type { SnackbarOptions } from '@/components/GlobalSnackbar'; import { copyImageToClipboard } from '@/utils/clipboard'; interface UrlToQrCodeSectionProps { expanded: boolean; onExpandedChange: (expanded: boolean) => void; showMessage: (message: string, options?: SnackbarOptions) => void; } const UrlToQrCodeSection = ({ expanded, onExpandedChange, showMessage, }: UrlToQrCodeSectionProps) => { const [urlInput, setUrlInput] = useState(''); const [urlError, setUrlError] = useState(''); const [qrCodeDataUrl, setQrCodeDataUrl] = useState(''); const [generating, setGenerating] = useState(false); const handleUrlInputChange = (e: React.ChangeEvent) => { setUrlInput(e.target.value); setUrlError(''); }; const generateQrCode = async () => { if (!urlInput) { setUrlError('请输入 URL'); return; } try { setGenerating(true); setUrlError(''); let url = urlInput; if (!url.startsWith('http://') && !url.startsWith('https://')) { url = 'https://' + url; } // 使用 QRious 替代 qrcode 库,体积更小 const qr = new QRious({ value: url, size: 250, level: 'H', foreground: qrCodePageStyles.black, background: qrCodePageStyles.white, }); setQrCodeDataUrl(qr.toDataURL()); showMessage('二维码生成成功', { severity: 'success', autoHideDuration: 1000 }); } catch (error) { console.error('生成二维码失败:', error); showMessage('生成二维码失败,请重试', { severity: 'error', autoHideDuration: 300 }); } finally { setGenerating(false); } }; const downloadQrCode = () => { if (!qrCodeDataUrl) return; const link = document.createElement('a'); link.href = qrCodeDataUrl; link.download = 'qrcode.png'; link.click(); showMessage('二维码下载成功', { severity: 'success' }); }; const copyQrCode = async () => { if (!qrCodeDataUrl) return; const response = await fetch(qrCodeDataUrl); const blob = await response.blob(); await copyImageToClipboard(blob) .then(() => { showMessage('二维码已复制到剪贴板', { severity: 'success' }); }) .catch(() => { showMessage('复制二维码失败,请重试', { severity: 'error' }); }); }; return ( onExpandedChange(isExpanded)} sx={{ borderRadius: 4, boxShadow: '0 2px 8px rgba(0, 0, 0, 0.08)', '&:before': { display: 'none' }, }} > } sx={{ borderBottom: 'none' }}> URL 转二维码 {qrCodeDataUrl ? ( QR Code ) : ( 二维码将显示在这里 )} ); }; export default UrlToQrCodeSection;