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')}
)}
);
}