import { useEffect, useMemo, useState } from 'react'; import { useI18n } from '@/utils/chromeI18n'; import { formatJson, type JsonFormatOptions, type JsonFormatResult, validateJson, } from '@/utils/jsonFormatter'; import { formatBytes } from '@/utils/format'; import { CopyButton } from '@/components/CopyButton'; import SwitchButtonGroup from '@/components/SwitchButtonGroup'; import TextInputArea from '@/components/TextInputArea'; import { Checkbox } from '@/components/ui/checkbox'; import { Label } from '@/components/ui/label'; export default function JsonFormatSection() { const { t } = useI18n('jsonFormat'); const [input, setInput] = useState(''); const [debouncedInput, setDebouncedInput] = useState(''); const [indentSize, setIndentSize] = useState(2); const [sortKeys, setSortKeys] = useState(false); // Debounce input useEffect(() => { const handle = setTimeout(() => { setDebouncedInput(input); }, 250); return () => clearTimeout(handle); }, [input]); const error = useMemo(() => { return validateJson(debouncedInput); }, [debouncedInput]); // Real-time formatting pipeline const formattedPipeline = useMemo(() => { const trimmed = debouncedInput.trim(); if (!trimmed || error) return null; try { const options: JsonFormatOptions = { indentSize, sortKeys }; return formatJson(debouncedInput, options); } catch (e) { return { isRuntimeError: true, errorMessage: e instanceof SyntaxError ? e.message : String(e), }; } }, [debouncedInput, error, indentSize, sortKeys]); const runtimeError = formattedPipeline && 'isRuntimeError' in formattedPipeline ? formattedPipeline.errorMessage : null; const result = formattedPipeline && !('isRuntimeError' in formattedPipeline) ? (formattedPipeline as JsonFormatResult) : null; return (
{/* 工具控制栏 */}
{/* 缩进配置区 */}
{t('jsonFormat:indentSize')} setIndentSize(Number(v))} options={[2, 4, 6, 8].map((size) => ({ value: size, label: String(size) }))} size="small" />
{/* 键名排序区 */}
setSortKeys(!sortKeys)} className="flex items-center gap-2 cursor-pointer select-none group py-1" > e.stopPropagation()} onCheckedChange={(checked) => setSortKeys(checked === true)} className="h-3.5 w-3.5 rounded border-input data-[state=checked]:bg-primary shadow-sm" />
{/* 满血版输入终端 */} setInput('')} /> {/* 格式化结果流面板展示 */} {result && result.formatted ? (
{/* 结果栏头部 */}
{t('jsonFormat:outputLabel')}
{t('jsonFormat:originalSize')}:{' '} {formatBytes(result.originalBytes)} | {t('jsonFormat:formattedSize')}:{' '} {formatBytes(result.formattedBytes)}
{result.formatted}
) : ( /* 空状态指示引导区 */

{error ? t('jsonFormat:fixErrorHint') : t('jsonFormat:emptyHint')}

)}
); }