import { useCallback, useEffect, useMemo, useState } from 'react';
import { Key } from 'lucide-react';
import PageHeader from '@/components/PageHeader';
import { parseJwt, stringifyJson } from '@/utils/jwt';
import CopyButton from '@/components/CopyButton';
import TextInputArea from '@/components/TextInputArea';
import { useLazyTranslation } from '@/utils/useLazyTranslation';
import { useContextMenuData } from '@/utils/useContextMenuData';
import { cn } from '@/lib/utils';
interface SectionProps {
title: string;
content: unknown;
colorClass: string; // 💡 1. 废除硬编码十六进制色值,改用语义化的 Tailwind 类名
bgClass: string;
borderClass: string;
}
const Section = ({ title, content, colorClass, bgClass, borderClass }: SectionProps) => {
const { t } = useLazyTranslation('jwt');
return (
{title}
{/* 💡 排版微距精雕:
- 彻底移除 border-black/5 这种非暗黑模式友好的硬隔离。
- 统一收拢为标准的 bg-muted/40 配合 font-mono text-xs
*/}
{content ? stringifyJson(content) : t('jwt:invalidFormat')}
);
};
export default function Index() {
const { t } = useLazyTranslation(['jwt', 'jsonFormat']);
const [jwtInput, setJwtInput] = useState('');
// 2. 防抖中转管道:切断高频键盘敲击时的红色语法闪烁
const [debouncedInput, setDebouncedInput] = useState('');
useEffect(() => {
const handle = setTimeout(() => {
setDebouncedInput(jwtInput);
}, 200);
return () => clearTimeout(handle);
}, [jwtInput]);
const handleContextMenuData = useCallback((payload: string) => {
const cleaned = payload.replace(/^Bearer\s*/i, '').trim();
setJwtInput(cleaned);
}, []);
useContextMenuData({ featureKey: 'jwt', onData: handleContextMenuData });
// 3. 贯彻方案 A:衍生变量流。直接消费防抖后的文本
const result = useMemo(() => {
if (!debouncedInput.trim()) {
return null;
}
return parseJwt(debouncedInput);
}, [debouncedInput]);
return (
} // 💡 规范锁死 Icon 宽高,抹杀闪烁
/>
{/* 输入终端 */}
{
const cleaned = val.replace(/^Bearer\s*/i, '').trim();
setJwtInput(cleaned);
}}
allowCopy={true}
showClear={true}
externalError={result?.error || undefined}
onClear={() => setJwtInput('')}
/>
{/* 解码看板结果展现 */}
{result && !result.error && (
{/* Header 分区:完美致敬 JWT.io 的鲜艳色彩,同时实现黑夜暗化自适应 */}
{/* Payload 分区 */}
{/* Signature 签名区:完全对齐标准的 shadcn 骨架阶度 */}
{t('jwt:signatureTitle')}
{result.signature || t('jwt:noSignature')}
)}
{/* 当解析错误时的干净中性引导拦截 */}
{result?.error && (
{t('jsonFormat:invalidJson')}
)}
);
}