import { useCallback, useMemo, useState } from 'react'; import { Key } from 'lucide-react'; import { useSnackbar } from '@/components/GlobalSnackbar'; import PageHeader from '@/components/PageHeader'; import { stringifyJson, parseJwt } 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 (
{title}
        {content ? stringifyJson(content) : t('jwt:invalidFormat')}
      
); }; export default function Index() { const { showMessage } = useSnackbar(); 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} showMessage={showMessage} externalError={result?.error} /> {result && !result.error && (
{t('jwt:signatureTitle')}
{result.signature || t('jwt:noSignature')}
)}
); }