mirror of
https://github.com/warmbly/warmbly.git
synced 2026-09-10 16:04:55 +00:00
64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import axios from "axios";
|
|
import { AuthError } from "@/lib/errors/auth";
|
|
|
|
export interface AppError {
|
|
error: string;
|
|
message: string;
|
|
status?: number;
|
|
redirect?: boolean;
|
|
/** Stable machine-readable code from the API, for branching on a specific
|
|
* condition rather than matching on human-readable text. */
|
|
code?: string;
|
|
/** Correlation id the API already returns, so a user can quote it and an
|
|
* operator can find the matching server-side log line. */
|
|
request_id?: string;
|
|
}
|
|
|
|
export function normalizeError(error: unknown): AppError {
|
|
if (error instanceof AuthError) {
|
|
return {
|
|
error: "Authentication Required",
|
|
message: error.message,
|
|
status: 401,
|
|
redirect: true,
|
|
};
|
|
}
|
|
|
|
if (axios.isAxiosError(error)) {
|
|
if (!error.response) {
|
|
// network, CORS, or timeout
|
|
return {
|
|
error: "Network Error",
|
|
message: "Please check your connection.",
|
|
};
|
|
}
|
|
|
|
const status = error.response.status;
|
|
const data = error.response.data;
|
|
|
|
if (status === 401) {
|
|
return {
|
|
error: data.error || "Unauthorized",
|
|
message: data.message || "Your session is invalid or expired.",
|
|
status,
|
|
redirect: true,
|
|
code: data.code,
|
|
request_id: data.request_id,
|
|
};
|
|
}
|
|
|
|
return {
|
|
error: data.error || "Unknown Error",
|
|
message: data.message || "Unexpected error occured.",
|
|
status,
|
|
code: data.code,
|
|
request_id: data.request_id,
|
|
}
|
|
}
|
|
|
|
return {
|
|
error: "Unknown Error",
|
|
message: "Unexpected error occurred.",
|
|
};
|
|
}
|