import { 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 qrcode from 'qrcode'; import { qrCodePageStyles } from '@/config/pageTheme'; import type { SnackbarOptions } from '@/components/GlobalSnackbar'; 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; } const dataUrl = await qrcode.toDataURL(url, { width: 200, margin: 2, color: { dark: qrCodePageStyles.black, light: qrCodePageStyles.white, }, }); setQrCodeDataUrl(dataUrl); 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', autoHideDuration: 300 }); }; const copyQrCode = async () => { if (!qrCodeDataUrl) return; try { const response = await fetch(qrCodeDataUrl); const blob = await response.blob(); await navigator.clipboard.write([ new ClipboardItem({ 'image/png': blob, }), ]); showMessage('二维码已复制到剪贴板', { severity: 'success', autoHideDuration: 1000 }); } catch (error) { console.error('复制二维码失败:', error); showMessage('复制二维码失败,请重试', { severity: 'error', autoHideDuration: 300 }); } }; 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;