feat: update permissions

This commit is contained in:
ivannoskov
2026-02-10 17:15:38 +03:00
parent 6941915d76
commit e1117e46c8
13 changed files with 961 additions and 523 deletions

View File

@@ -20,16 +20,19 @@ export const membersApi = {
{ params }
),
/**
* Update member permissions
*/
/**
* Update member permissions
* @param workspaceId - workspace id
* @param workspaceUserId - workspace_user.id (not user.id!)
* @param data - permissions to update
*/
updatePermissions: (
workspaceId: string,
userId: string,
workspaceUserId: string,
data: UpdatePermissionsRequest
) =>
api.put<WorkspaceMember>(
`/workspaces/${workspaceId}/members/${userId}/permissions`,
`/workspaces/${workspaceId}/members/${workspaceUserId}/permissions`,
data
),
};

View File

@@ -0,0 +1,72 @@
// ============================================================================
// 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);
}