import { useMemo, useState } from 'react'; import { Box, Container, Paper, Stack, Typography } from '@mui/material'; import { useSnackbar } from '@/components/GlobalSnackbar'; import VpnKeyIcon from '@mui/icons-material/VpnKey'; import PageHeader from '@/components/PageHeader'; import { stringifyJson, parseJwt } from '@/utils/jwt'; import CopyButton from '@/components/CopyButton'; import TextInputArea from '@/components/TextInputArea'; import { useTranslation } from 'react-i18next'; interface SectionProps { title: string; content: unknown; color: string; } const Section = ({ title, content, color }: SectionProps) => { const { t } = useTranslation(['jwt']); return ( {title} {content ? stringifyJson(content) : t('jwt:invalidFormat')} ); }; export default function Index() { const { showMessage } = useSnackbar(); const { t } = useTranslation(['jwt']); const [jwtInput, setJwtInput] = useState(''); 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')} )} ); }