'use client'; import { useJWKS } from '@/lib/hooks'; import { useTranslation } from 'react-i18next'; import PageHeader from '@/components/ui/PageHeader'; import CopyButton from '@/components/ui/CopyButton'; import DataTable from '@/components/ui/DataTable'; import type { Column } from '@/components/ui/DataTable'; import type { JWK } from '@elydora/shared'; interface JWKRow extends JWK { [key: string]: unknown; } export default function JWKSPage() { const { t } = useTranslation(); const { data: jwksData, isLoading: jwksLoading, error: jwksError } = useJWKS(); const keys = (jwksData?.keys ?? []) as JWKRow[]; const jwkColumns: Column[] = [ { key: 'kid', label: t('jwks.colKeyId'), render: (row) => (
{row.kid}
), }, { key: 'kty', label: t('jwks.colKeyType'), width: '100px', render: (row) => ( {row.kty} ), }, { key: 'alg', label: t('jwks.colAlgorithm'), width: '120px', render: (row) => ( {row.alg} ), }, { key: 'crv', label: t('jwks.colCurve'), width: '100px', render: (row) => ( {row.crv ?? '\u2014'} ), }, { key: 'use', label: t('jwks.colUse'), width: '80px', render: (row) => ( {row.use} ), }, { key: 'x', label: t('jwks.colPublicKey'), render: (row) => row.x ? (
{row.x.slice(0, 20)}...
) : ( {'\u2014'} ), }, ]; return (
{t('jwks.publicKeys')}
{jwksData && ( )}
{jwksError && (
{t('jwks.failedToLoad')} {jwksError instanceof Error ? jwksError.message : t('common.unknownError')}
)} row.kid} isLoading={jwksLoading} emptyMessage={t('jwks.emptyMessage')} />
{t('jwks.endpoint')} /.well-known/elydora/jwks.json
); }