fix(ui): use describeApiError across remaining error-surface sites
Extends the previous describeApiError rollout to the rest of the UI.
Two symptom classes covered:
- Bare e.message / err.message in toast descriptions would render
"undefined" on Spring error bodies (plain objects without a proper
Error prototype). Affected: OidcConfigPage (save/test/delete),
ClaimMappingRulesModal (save + test), AgentHealth (dismiss),
RouteControlBar (route action + replay).
- Inline {String(error)} on load-failure banners would render
"[object Object]". Affected: InboxPage, RulesListPage, SilencesPage,
OutboundConnectionsPage.
Not touched: auth-store, AppsTab, UsersTab — they already guard with
`e instanceof Error` and fall back to a static string; replacing the
fallback with describeApiError would be a behavioral change best
evaluated separately.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ import {
|
||||
} from '../../api/queries/admin/claim-mappings';
|
||||
import type { ClaimMappingRule, TestResponse } from '../../api/queries/admin/claim-mappings';
|
||||
import { useRoles, useGroups } from '../../api/queries/admin/rbac';
|
||||
import { describeApiError } from '../../api/errors';
|
||||
import styles from './ClaimMappingRulesModal.module.css';
|
||||
|
||||
const MATCH_OPTIONS = [
|
||||
@@ -231,8 +232,8 @@ export default function ClaimMappingRulesModal({ open, onClose }: Props) {
|
||||
|
||||
toast({ title: 'Rules saved', variant: 'success' });
|
||||
handleClose();
|
||||
} catch (e: any) {
|
||||
toast({ title: 'Failed to save rules', description: e.message, variant: 'error', duration: 86_400_000 });
|
||||
} catch (e) {
|
||||
toast({ title: 'Failed to save rules', description: describeApiError(e), variant: 'error', duration: 86_400_000 });
|
||||
} finally {
|
||||
setApplying(false);
|
||||
}
|
||||
@@ -256,7 +257,7 @@ export default function ClaimMappingRulesModal({ open, onClose }: Props) {
|
||||
}));
|
||||
testRules.mutate({ rules, claims }, {
|
||||
onSuccess: (result) => setTestResult(result),
|
||||
onError: (e) => setTestError(e.message),
|
||||
onError: (e) => setTestError(describeApiError(e)),
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import { PageLoader } from '../../components/PageLoader';
|
||||
import { adminFetch } from '../../api/queries/admin/admin-api';
|
||||
import ClaimMappingRulesModal from './ClaimMappingRulesModal';
|
||||
import { useClaimMappingRules } from '../../api/queries/admin/claim-mappings';
|
||||
import { describeApiError } from '../../api/errors';
|
||||
import styles from './OidcConfigPage.module.css';
|
||||
import sectionStyles from '../../styles/section-card.module.css';
|
||||
|
||||
@@ -114,8 +115,8 @@ export default function OidcConfigPage() {
|
||||
setFormDraft(null);
|
||||
setEditing(false);
|
||||
toast({ title: 'Settings saved', description: 'OIDC configuration updated successfully.', variant: 'success' });
|
||||
} catch (e: any) {
|
||||
toast({ title: 'Failed to save OIDC configuration', description: e.message, variant: 'error', duration: 86_400_000 });
|
||||
} catch (e) {
|
||||
toast({ title: 'Failed to save OIDC configuration', description: describeApiError(e), variant: 'error', duration: 86_400_000 });
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
@@ -127,8 +128,8 @@ export default function OidcConfigPage() {
|
||||
try {
|
||||
const result = await adminFetch<{ status: string; authorizationEndpoint?: string }>('/oidc/test', { method: 'POST' });
|
||||
toast({ title: 'Connection test', description: `OIDC provider responded: ${result.status}`, variant: 'success' });
|
||||
} catch (e: any) {
|
||||
toast({ title: 'Connection test failed', description: e.message, variant: 'error', duration: 86_400_000 });
|
||||
} catch (e) {
|
||||
toast({ title: 'Connection test failed', description: describeApiError(e), variant: 'error', duration: 86_400_000 });
|
||||
} finally {
|
||||
setTesting(false);
|
||||
}
|
||||
@@ -142,8 +143,8 @@ export default function OidcConfigPage() {
|
||||
setFormDraft(null);
|
||||
setEditing(false);
|
||||
toast({ title: 'Configuration deleted', description: 'OIDC configuration has been removed.', variant: 'warning' });
|
||||
} catch (e: any) {
|
||||
toast({ title: 'Failed to delete OIDC configuration', description: e.message, variant: 'error', duration: 86_400_000 });
|
||||
} catch (e) {
|
||||
toast({ title: 'Failed to delete OIDC configuration', description: describeApiError(e), variant: 'error', duration: 86_400_000 });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ export default function OutboundConnectionsPage() {
|
||||
const { toast } = useToast();
|
||||
|
||||
if (isLoading) return <PageLoader />;
|
||||
if (error) return <div>Failed to load outbound connections: {String(error)}</div>;
|
||||
if (error) return <div>Failed to load outbound connections: {describeApiError(error)}</div>;
|
||||
|
||||
const rows = data ?? [];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user