Files
kandev/apps/web/lib/api/domains/canvas-error-copy.ts
T
2026-09-23 20:51:55 +01:00

62 lines
2.4 KiB
TypeScript

import { ApiError } from "../client";
type Translate = (key: string) => string;
const RUNTIME_TOKEN_EXPIRED_KEY = "canvases:runtimeTokenExpired";
const CANVAS_UNAVAILABLE_KEY = "canvases:unavailableDescription";
const CANVAS_API_ERROR_TRANSLATIONS: Record<string, string> = {
runtime_token_expired: RUNTIME_TOKEN_EXPIRED_KEY,
runtime_token_invalid: RUNTIME_TOKEN_EXPIRED_KEY,
runtime_token_stale: RUNTIME_TOKEN_EXPIRED_KEY,
canvas_not_found: CANVAS_UNAVAILABLE_KEY,
pending_first_release: "canvases:pendingFirstReleaseDescription",
permission_review_required: "canvases:pendingPermissionDescription",
invalid_release: "canvases:invalidReleaseDescription",
runtime_unavailable: CANVAS_UNAVAILABLE_KEY,
canvas_release_unavailable: CANVAS_UNAVAILABLE_KEY,
artifact_unavailable: CANVAS_UNAVAILABLE_KEY,
active_release_missing: CANVAS_UNAVAILABLE_KEY,
promotion_review_stale: "canvases:actionFailed",
workspace_data_review_stale: "canvases:workspaceDataReviewStale",
workspace_owner_required: "canvases:workspaceOwnerRequired",
canvas_edit_stale: "canvases:actionFailed",
};
function apiErrorCode(error: ApiError): string | null {
if (error.errorCode) return error.errorCode;
if (!error.body || typeof error.body !== "object") return null;
const code = (error.body as { error?: unknown }).error;
return typeof code === "string" && code.trim() ? code : null;
}
export function canvasApiErrorTranslationKey(error: unknown): string | null {
if (!(error instanceof ApiError)) return null;
return CANVAS_API_ERROR_TRANSLATIONS[apiErrorCode(error) ?? ""] ?? null;
}
export function canvasErrorCodeMessage(
code: string | undefined,
translate: Translate,
fallbackKey: string,
): string {
const translationKey = CANVAS_API_ERROR_TRANSLATIONS[code?.trim() ?? ""];
return translate(translationKey ?? fallbackKey);
}
/**
* API errors are rendered from stable server codes. Other errors keep their
* existing diagnostic text because they do not have a stable API contract.
*/
export function canvasErrorMessage(
error: unknown,
translate: Translate,
fallbackKey: string,
): string {
const translationKey = canvasApiErrorTranslationKey(error);
if (translationKey) return translate(translationKey);
if (error instanceof ApiError) return translate(fallbackKey);
if (error instanceof Error && error.message.trim()) return error.message;
return translate(fallbackKey);
}