feat: add useRoles/useCreateRole/useUpdateRole/useDeleteRole and plugin mutation hooks

This commit is contained in:
2026-07-03 15:23:59 +00:00
parent eb0420d726
commit 502cddd68c
+104 -1
View File
@@ -74,6 +74,23 @@ export interface SearchResult {
url: string; url: string;
} }
export interface Role {
id: string;
name: string;
permissions: Record<string, any>;
field_permissions?: Record<string, any>;
}
export interface Plugin {
name: string;
display_name?: string;
description?: string;
version?: string;
status: 'discovered' | 'installed' | 'active' | 'inactive';
installed?: boolean;
active?: boolean;
}
export function useLogin() { export function useLogin() {
const { setUser, setError } = useAuthStore(); const { setUser, setError } = useAuthStore();
return useMutation({ return useMutation({
@@ -427,6 +444,92 @@ export function useDeleteNotification() {
export function usePlugins() { export function usePlugins() {
return useQuery({ return useQuery({
queryKey: ['plugins'], queryKey: ['plugins'],
queryFn: () => apiGet<any[]>('/plugins'), queryFn: async () => {
const data = await apiGet<any>('/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<any>('/roles');
return data;
},
});
}
export function useCreateRole() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: { name: string; permissions: Record<string, any>; field_permissions: Record<string, any> }) =>
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<string, any>; field_permissions?: Record<string, any> } }) =>
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'] });
},
}); });
} }