import { useMemo, useState } from 'react';
import { Box, Container, Paper, Stack, TextField, Typography } from '@mui/material';
import { useSnackbar } from '@/components/GlobalSnackbar';
import VpnKeyIcon from '@mui/icons-material/VpnKey';
import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';
import PageHeader from '@/components/PageHeader';
import { jwtPageStyles } from '@/config/pageTheme';
import { formatJson, parseJwt } from '@/utils/jwt';
import CopyButton from '@/components/CopyButton';
import { useTranslation } from 'react-i18next';
interface SectionProps {
title: string;
content: unknown;
raw: string;
color: string;
}
const Section = ({ title, content, color }: SectionProps) => {
const { t } = useTranslation(['jwt']);
return (
{title}
{content ? formatJson(content) : t('jwt:invalidFormat')}
);
};
export default function Index() {
useSnackbar();
const { t } = useTranslation(['jwt']);
const [jwtInput, setJwtInput] = useState('');
const result = useMemo(() => {
if (!jwtInput.trim()) {
return null;
}
return parseJwt(jwtInput);
}, [jwtInput]);
return (
}
/>
{/* Input Area */}
{
// 自动去除 Bearer 前缀及首尾空白字符/换行
const val = e.target.value.replace(/^Bearer\s*/i, '').trim();
setJwtInput(val);
}}
fullWidth
sx={jwtPageStyles.INPUT_STYLE}
/>
{result?.error && (
{result.error}
)}
{result && !result.error && (
{t('jwt:signatureTitle')}
{result.signature || t('jwt:noSignature')}
)}
);
}