import { useCallback } from 'react'; import { Accordion, AccordionDetails, AccordionSummary, Alert, Box, Button, CircularProgress, InputAdornment, Stack, TextField, Typography, } from '@mui/material'; import LinkIcon from '@mui/icons-material/Link'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import CopyButton from '@/components/CopyButton'; import ImageUploader from '@/components/ImageUploader'; import { qrCodePageStyles } from '@/config/pageTheme'; import { useSnackbar } from '@/components/GlobalSnackbar'; import { parseQrCodeFromFile } from '@/utils/qrCodeParser'; import { useTranslation } from 'react-i18next'; import type { QrCodeParserProps } from './types'; const QrCodeToUrlSection = ({ decodedResult, onDecodedResultChange, parsing, onParsingChange, parseError, onParseErrorChange, selectedFile, onFileChange, onClearFile, previewUrl, onPreviewUrlChange, dragging, onDraggingChange, expanded, onExpandedChange, forceExpanded = false, }: QrCodeParserProps) => { const { t } = useTranslation(['qrCode']); const { showMessage } = useSnackbar(); const handleClearFile = useCallback(() => { onClearFile(); onDecodedResultChange(''); onParseErrorChange(''); }, [onClearFile, onDecodedResultChange, onParseErrorChange]); const parseQrCode = async () => { if (!selectedFile) { showMessage(t('qrCode:selectImage'), { severity: 'error', autoHideDuration: 300 }); return; } try { onParsingChange(true); onParseErrorChange(''); onDecodedResultChange(''); const result = await parseQrCodeFromFile(selectedFile); if (result.success && result.data) { onDecodedResultChange(result.data); showMessage(t('qrCode:parseSuccess'), { severity: 'success', autoHideDuration: 1000 }); } else { onParseErrorChange(result.error || t('qrCode:noQrDetected')); showMessage(result.error || t('qrCode:noQrDetected'), { severity: 'error', autoHideDuration: 1000, }); } } catch (error) { console.error('解析二维码失败:', error); onParseErrorChange(t('qrCode:parseError')); showMessage(t('qrCode:parseError'), { severity: 'error', autoHideDuration: 300 }); } finally { onParsingChange(false); } }; return ( onExpandedChange(isExpanded)} sx={forceExpanded ? qrCodePageStyles.ACCORDION_DESKTOP : qrCodePageStyles.ACCORDION} > } sx={qrCodePageStyles.ACCORDION_SUMMARY}> {t('qrCode:qrToUrl')} ), }, }} sx={qrCodePageStyles.INPUT_STYLE} /> {parseError && ( {parseError} )} ); }; export default QrCodeToUrlSection;