Files
tgex-frontend/lib/utils/error-handler.ts
2026-02-10 17:15:38 +03:00

73 lines
2.1 KiB
TypeScript

// ============================================================================
// API Error Types & Utilities
// ============================================================================
import { toast } from "sonner";
import type { ApiError } from "@/lib/types/api";
export interface PermissionErrorInfo {
isPermissionError: boolean;
message: string;
}
export function isPermissionError(error: ApiError): boolean {
return (
error.detail?.includes("access denied") ||
error.detail?.includes("доступ запрещён") ||
error.detail?.includes("недостаточно прав") ||
error.detail?.includes("403")
);
}
export function getPermissionErrorMessage(error: ApiError): string {
if (isPermissionError(error)) {
return "Недостаточно прав. Обратитесь к администратору.";
}
return error.detail || "Произошла ошибка";
}
export function handleApiError(error: unknown, customMessage?: string): ApiError {
const apiError = error as ApiError;
if (isPermissionError(apiError)) {
toast.error("Недостаточно прав", {
description: "Обратитесь к администратору workspace",
});
} else {
toast.error(customMessage || "Ошибка", {
description: apiError.detail || "Произошла ошибка при выполнении операции",
});
}
return apiError;
}
export function showPermissionErrorToast(): void {
toast.error("Недостаточно прав", {
description: "Обратитесь к администратору workspace",
duration: 5000,
});
}
export function showSuccessToast(message: string, description?: string): void {
toast.success(message, {
description,
duration: 4000,
});
}
export function showErrorToast(message: string, description?: string): void {
toast.error(message, {
description,
duration: 5000,
});
}
export function showLoadingToast(message: string): string | number {
return toast.loading(message);
}
export function dismissToast(id: string | number): void {
toast.dismiss(id);
}