Files
leocrm/frontend/src/api/plugins.ts
T

99 lines
2.7 KiB
TypeScript
Raw Normal View History

/**
2026-07-23 19:01:18 +02:00
* Plugin management hooks: list, install, activate, deactivate, uninstall, upload, install-url.
*/
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { apiGet, apiPost, apiDelete } from './client';
export interface Plugin {
name: string;
display_name?: string;
description?: string;
version?: string;
status: 'discovered' | 'installed' | 'active' | 'inactive';
installed?: boolean;
active?: boolean;
}
export function usePlugins() {
return useQuery({
queryKey: ['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'] });
},
});
}
2026-07-23 19:01:18 +02:00
export function useUploadPlugin() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (file: File) => {
const formData = new FormData();
formData.append('file', file);
const { default: apiClient } = await import('./client');
const res = await apiClient.post('/plugins/upload', formData, {
2026-07-23 19:01:18 +02:00
headers: { 'Content-Type': 'multipart/form-data' },
});
return res.data;
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['plugins'] });
},
});
}
export function useInstallPluginFromUrl() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (url: string) => {
const { default: apiClient } = await import('./client');
const res = await apiClient.post('/plugins/install-url', { url });
2026-07-23 19:01:18 +02:00
return res.data;
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['plugins'] });
},
});
}