'use client'; import React, { useState, useRef } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faImage, faCopy, faCheck, faDownload, faTrash, faRedo } from '@fortawesome/free-solid-svg-icons'; import ToolHeader from '@/components/ToolHeader'; import { QRCode } from 'react-qrcode-logo'; import { useLanguage } from '@/context/LanguageContext'; // 定义QR码样式类型 type QRStyle = 'squares' | 'dots'; // 定义颜色预设 const colorPresets = [ { bg: '#FFFFFF', fg: '#000000', name: 'preset_classic_bw' }, { bg: '#0088CC', fg: '#FFFFFF', name: 'preset_blue_white' }, { bg: '#EF4444', fg: '#FFFFFF', name: 'preset_vibrant_red' }, { bg: '#10B981', fg: '#FFFFFF', name: 'preset_fresh_green' }, { bg: '#6366F1', fg: '#FFFFFF', name: 'preset_tech_purple' }, { bg: '#262626', fg: '#F5F5F5', name: 'preset_dark_mode' }, { bg: '#FFFFFF', fg: '#F97316', name: 'preset_orange_accent' }, { bg: '#FFEDD5', fg: '#7C2D12', name: 'preset_warm_brown' }, ]; // 添加CSS变量样式 const styles = { card: "card p-4", heading: "text-md font-medium text-primary mb-4", label: "block text-sm text-secondary mb-2", input: "search-input w-full", rangeValue: "text-sm text-primary min-w-[40px] text-right", buttonActive: "px-4 py-2 rounded-md transition-all bg-gradient-to-r from-[rgb(var(--color-primary))] to-[rgb(var(--color-primary-hover))] text-white shadow-sm shadow-[rgba(var(--color-primary),0.3)]", buttonInactive: "px-4 py-2 rounded-md transition-all btn-secondary", presetButton: "p-2 rounded-md border transition-all hover:border-purple", colorBox: "w-5 h-5 rounded-sm border border-purple-glow/30", secondaryText: "text-sm text-tertiary", flexCenter: "flex items-center justify-center", preview: "rounded-xl overflow-hidden border border-purple-glow/20 bg-block-strong p-2", placeholder: "flex items-center justify-center p-4 text-tertiary", } export default function QRCodeGenerator() { const { t } = useLanguage(); // QR码内容和样式状态 const [value, setValue] = useState('https://example.com'); const [size, setSize] = useState(200); const [bgColor, setBgColor] = useState('#FFFFFF'); const [fgColor, setFgColor] = useState('#000000'); const [quietZone, setQuietZone] = useState(10); const [qrStyle, setQrStyle] = useState('squares'); // Logo相关状态 const [logoImage, setLogoImage] = useState(null); const [logoWidth, setLogoWidth] = useState(60); const [logoHeight, setLogoHeight] = useState(60); const [logoOpacity, setLogoOpacity] = useState(1); const [removeQrCodeBehindLogo, setRemoveQrCodeBehindLogo] = useState(true); // 眼睛(定位图案)相关状态 const [eyeColor, setEyeColor] = useState('#000000'); const [eyeRadius, setEyeRadius] = useState(0); // 其他状态 const [copied, setCopied] = useState(false); const [downloading, setDownloading] = useState(false); // QR码引用 // eslint-disable-next-line @typescript-eslint/no-explicit-any const qrCodeRef = useRef(null); // 文件上传引用 const fileInputRef = useRef(null); // 处理Logo图片上传 const handleLogoUpload = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onload = (e) => { const result = e.target?.result as string; setLogoImage(result); }; reader.readAsDataURL(file); } }; // 触发文件上传点击 const triggerLogoUpload = () => { fileInputRef.current?.click(); }; // 移除Logo const removeLogo = () => { setLogoImage(null); if (fileInputRef.current) { fileInputRef.current.value = ''; } }; // 复制QR码内容 const copyQRValue = () => { navigator.clipboard.writeText(value) .then(() => { setCopied(true); setTimeout(() => setCopied(false), 2000); }) .catch(err => console.error(t('tools.qrcode_generator.copy_failed'), err)); }; // 下载QR码图片 const downloadQRCode = () => { if (qrCodeRef.current) { setDownloading(true); try { qrCodeRef.current.download('png', '二维码'); } catch (err) { console.error(t('tools.qrcode_generator.download_failed'), err); } finally { setDownloading(false); } } }; // 应用颜色预设 const applyColorPreset = (preset: { bg: string; fg: string }) => { setBgColor(preset.bg); setFgColor(preset.fg); setEyeColor(preset.fg); }; // 重置所有设置 const resetSettings = () => { setValue('https://example.com'); setSize(200); setBgColor('#FFFFFF'); setFgColor('#000000'); setQuietZone(10); setQrStyle('squares'); setLogoImage(null); setLogoWidth(60); setLogoHeight(60); setLogoOpacity(1); setRemoveQrCodeBehindLogo(true); setEyeColor('#000000'); setEyeRadius(0); if (fileInputRef.current) { fileInputRef.current.value = ''; } }; return (
{/* 主内容区 */}
{/* 左侧面板 - 设置选项 */}
{/* 基本设置 */}

{t('tools.qrcode_generator.basic_settings')}