import { useEffect, useMemo, useState } from 'react'; import { Button } from '@/components/ui/button'; import { useLazyTranslation } from '@/utils/useLazyTranslation'; import { formatJson, validateJson, type JsonFormatOptions, type JsonFormatResult, } from '@/utils/jsonFormatter'; import { formatByteSize } from '@/utils/textStatistics'; import { useSnackbar } from '@/components/GlobalSnackbar'; import CopyButton from '@/components/CopyButton'; import SwitchButtonGroup from '@/components/SwitchButtonGroup'; /** 缩进大小选项 */ const INDENT_OPTIONS = [2, 4, 6, 8] as const; /** * JSON 格式化工具区域组件 * * 提供输入区域、格式化选项(缩进大小、键名排序)和格式化结果展示, * 支持一键复制格式化后的 JSON。 */ export default function JsonFormatSection() { const { t } = useLazyTranslation('jsonFormat'); const { showMessage } = useSnackbar(); const [input, setInput] = useState(''); const [error, setError] = useState(null); const [indentSize, setIndentSize] = useState(2); const [sortKeys, setSortKeys] = useState(false); const [result, setResult] = useState(null); // 防抖校验输入 useEffect(() => { const handle = setTimeout(() => { setError(validateJson(input)); }, 300); return () => clearTimeout(handle); }, [input]); const canFormat = useMemo(() => { return input.trim() !== '' && !error; }, [input, error]); const handleFormat = () => { const validationError = validateJson(input); if (validationError) { setError(validationError); setResult(null); return; } try { const options: JsonFormatOptions = { indentSize, sortKeys }; const formatResult = formatJson(input, options); setResult(formatResult); } catch (e) { setError(e instanceof SyntaxError ? e.message : String(e)); setResult(null); } }; const handleClear = () => { setInput(''); setError(null); setResult(null); }; return (
{/* 工具栏 */}
{/* 缩进选择 */} {t('jsonFormat:indentSize')} setIndentSize(v)} options={INDENT_OPTIONS.map((size) => ({ value: size, label: String(size) }))} sx={{ width: 'auto', mb: 0, flexShrink: 0 }} size="small" /> {/* 键名排序开关 */}
{/* 输入区 */}