import { useCallback, useEffect, useMemo, useState } from 'react'; import { parseJwt, stringifyJson } from '@/utils/jwt'; import CopyButton from '@/components/CopyButton'; import TextInputArea from '@/components/TextInputArea'; import { useI18n } from '@/utils/chromeI18n'; 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 } = useI18n('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 } = useI18n(['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 (
{/* 输入终端 */} { 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')}

)}
); }