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