// ============================================================================ // 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); }