import { useState } from 'react' import { AdminLayout } from '../Admin' import { Button } from '../../../design-system/primitives/Button/Button' import { Input } from '../../../design-system/primitives/Input/Input' import { Toggle } from '../../../design-system/primitives/Toggle/Toggle' import { FormField } from '../../../design-system/primitives/FormField/FormField' import { Tag } from '../../../design-system/primitives/Tag/Tag' import { SectionHeader } from '../../../design-system/primitives/SectionHeader/SectionHeader' import { ConfirmDialog } from '../../../design-system/composites/ConfirmDialog/ConfirmDialog' import { useToast } from '../../../design-system/composites/Toast/Toast' import styles from './OidcConfig.module.css' interface OidcFormData { enabled: boolean autoSignup: boolean issuerUri: string clientId: string clientSecret: string rolesClaim: string displayNameClaim: string defaultRoles: string[] } const INITIAL_DATA: OidcFormData = { enabled: true, autoSignup: true, issuerUri: 'https://keycloak.example.com/realms/cameleer', clientId: 'cameleer-app', clientSecret: '••••••••••••', rolesClaim: 'realm_access.roles', displayNameClaim: 'name', defaultRoles: ['USER', 'VIEWER'], } export function OidcConfig() { const [form, setForm] = useState(INITIAL_DATA) const [newRole, setNewRole] = useState('') const [deleteOpen, setDeleteOpen] = useState(false) const { toast } = useToast() function update(key: K, value: OidcFormData[K]) { setForm((prev) => ({ ...prev, [key]: value })) } function addRole() { const role = newRole.trim().toUpperCase() if (role && !form.defaultRoles.includes(role)) { update('defaultRoles', [...form.defaultRoles, role]) setNewRole('') } } function removeRole(role: string) { update('defaultRoles', form.defaultRoles.filter((r) => r !== role)) } function handleSave() { toast({ title: 'Settings saved', description: 'OIDC configuration updated successfully.', variant: 'success' }) } function handleTest() { toast({ title: 'Connection test', description: 'OIDC provider responded successfully.', variant: 'info' }) } function handleDelete() { setDeleteOpen(false) setForm({ ...INITIAL_DATA, enabled: false, issuerUri: '', clientId: '', clientSecret: '', defaultRoles: [] }) toast({ title: 'Configuration deleted', description: 'OIDC configuration has been removed.', variant: 'warning' }) } return (
Behavior
update('enabled', e.target.checked)} />
update('autoSignup', e.target.checked)} /> Automatically create accounts for new OIDC users
Provider Settings update('issuerUri', e.target.value)} /> update('clientId', e.target.value)} /> update('clientSecret', e.target.value)} />
Claim Mapping update('rolesClaim', e.target.value)} /> update('displayNameClaim', e.target.value)} />
Default Roles
{form.defaultRoles.map((role) => ( removeRole(role)} /> ))} {form.defaultRoles.length === 0 && ( No default roles configured )}
setNewRole(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); addRole() } }} className={styles.roleInput} />
Danger Zone setDeleteOpen(false)} onConfirm={handleDelete} message="Delete OIDC configuration? All users signed in via OIDC will lose access." confirmText="delete oidc" />
) }