73 lines
2.1 KiB
TypeScript
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);
|
|
}
|