From 502cddd68cfa0af7e4d1b77f926ee470c685c81f Mon Sep 17 00:00:00 2001 From: Leopoldadmin Date: Fri, 3 Jul 2026 15:23:59 +0000 Subject: [PATCH] feat: add useRoles/useCreateRole/useUpdateRole/useDeleteRole and plugin mutation hooks --- frontend/src/api/hooks.ts | 105 +++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/frontend/src/api/hooks.ts b/frontend/src/api/hooks.ts index ec051a9..517ff60 100644 --- a/frontend/src/api/hooks.ts +++ b/frontend/src/api/hooks.ts @@ -74,6 +74,23 @@ export interface SearchResult { url: string; } +export interface Role { + id: string; + name: string; + permissions: Record; + field_permissions?: Record; +} + +export interface Plugin { + name: string; + display_name?: string; + description?: string; + version?: string; + status: 'discovered' | 'installed' | 'active' | 'inactive'; + installed?: boolean; + active?: boolean; +} + export function useLogin() { const { setUser, setError } = useAuthStore(); return useMutation({ @@ -427,6 +444,92 @@ export function useDeleteNotification() { export function usePlugins() { return useQuery({ queryKey: ['plugins'], - queryFn: () => apiGet('/plugins'), + queryFn: async () => { + const data = await apiGet('/plugins'); + return data; + }, + }); +} + +export function useInstallPlugin() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (name: string) => apiPost(`/plugins/${name}/install`), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['plugins'] }); + }, + }); +} + +export function useActivatePlugin() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (name: string) => apiPost(`/plugins/${name}/activate`), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['plugins'] }); + }, + }); +} + +export function useDeactivatePlugin() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (name: string) => apiPost(`/plugins/${name}/deactivate`), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['plugins'] }); + }, + }); +} + +export function useUninstallPlugin() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ name, removeData }: { name: string; removeData: boolean }) => + apiDelete(`/plugins/${name}?remove_data=${removeData}`), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['plugins'] }); + }, + }); +} + +export function useRoles() { + return useQuery({ + queryKey: ['roles'], + queryFn: async () => { + const data = await apiGet('/roles'); + return data; + }, + }); +} + +export function useCreateRole() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (data: { name: string; permissions: Record; field_permissions: Record }) => + apiPost('/roles', data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['roles'] }); + }, + }); +} + +export function useUpdateRole() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, data }: { id: string; data: { name?: string; permissions?: Record; field_permissions?: Record } }) => + apiPatch(`/roles/${id}`, data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['roles'] }); + }, + }); +} + +export function useDeleteRole() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (id: string) => apiDelete(`/roles/${id}`), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['roles'] }); + }, }); }