import { Image as ImageIcon, Trash2, Upload } from 'lucide-react'; import TextInputArea from '@/components/TextInputArea'; import { useTranslation } from 'react-i18next'; import CopyButton from '@/components/CopyButton'; import DecodeResultPaper from '@/components/DecodeResultPaper'; import { Button } from '@/components/ui/button'; import { downloadBlob, formatFileSize } from '@/utils/base64Converter'; import { useStorageState } from '@/utils/useStorageState'; import type { Base64ConvertDirection } from '@/types/storage'; import SwitchButtonGroup from '@/components/SwitchButtonGroup'; import { useBase64Converter } from './useBase64Converter'; import { cn } from '@/lib/utils'; const isValidDirection = (val: unknown): val is Base64ConvertDirection => val === 'encode' || val === 'decode'; interface Base64ConverterSectionProps { mode: 'file' | 'image'; } export default function Base64ConverterSection({ mode }: Base64ConverterSectionProps) { const { t } = useTranslation('base64Converter'); const [direction, setDirection] = useStorageState( `base64Converter/${mode}Mode/direction`, 'encode', isValidDirection, ); const { result, info, isLoading, isDragging, setIsDragging, fileInputRef, encodeError, decodeInput, setDecodeInput, decoded, decodeError, decodedFileName, setCustomFileName, resetAll, safeFileSelect, maxFileSizeStr, } = useBase64Converter({ mode }); const handleDirectionChange = (next: Base64ConvertDirection) => { if (!next || next === direction) return; resetAll(); setDirection(next); }; const handleDownload = () => { if (decoded) downloadBlob(decoded.blob, decodedFileName); }; return (