import { useCallback, 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';
interface SectionProps {
title: string;
content: unknown;
color: string;
}
const Section = ({ title, content, color }: SectionProps) => {
const { t } = useLazyTranslation('jwt');
return (
{content ? stringifyJson(content) : t('jwt:invalidFormat')}
);
};
export default function Index() {
const { t } = useLazyTranslation('jwt');
const [jwtInput, setJwtInput] = useState('');
const handleContextMenuData = useCallback((payload: string) => {
const cleaned = payload.replace(/^Bearer\s*/i, '').trim();
setJwtInput(cleaned);
}, []);
useContextMenuData({ featureKey: 'jwt', onData: handleContextMenuData });
const result = useMemo(() => {
if (!jwtInput.trim()) {
return null;
}
return parseJwt(jwtInput);
}, [jwtInput]);
return (
} />
{/* Input Area */}
{
const cleaned = val.replace(/^Bearer\s*/i, '').trim();
setJwtInput(cleaned);
}}
allowCopy={true}
showClear={true}
externalError={result?.error}
/>
{result && !result.error && (
{t('jwt:signatureTitle')}
{result.signature || t('jwt:noSignature')}
)}
);
}