dify/web/service/use-plugins.ts

196 lines
5.0 KiB
TypeScript
Raw Normal View History

2024-11-12 17:58:14 +08:00
import { useCallback, useState } from 'react'
2024-11-08 18:21:39 +08:00
import type {
DebugInfo as DebugInfoTypes,
2024-11-13 15:48:06 +08:00
Dependency,
2024-11-08 18:25:15 +08:00
InstallPackageResponse,
2024-11-08 18:21:39 +08:00
InstalledPluginListResponse,
Permissions,
2024-11-12 17:58:14 +08:00
PluginTask,
2024-11-08 18:21:39 +08:00
PluginsFromMarketplaceResponse,
} from '@/app/components/plugins/types'
import type {
PluginsSearchParams,
} from '@/app/components/plugins/marketplace/types'
import { get, post, postMarketplace } from './base'
import {
2024-11-08 16:11:50 +08:00
useMutation,
useQuery,
2024-11-08 18:21:39 +08:00
useQueryClient,
} from '@tanstack/react-query'
2024-11-13 15:48:06 +08:00
import { useStore as usePluginDependencyStore } from '@/app/components/workflow/plugin-dependency/store'
const NAME_SPACE = 'plugins'
const useInstalledPluginListKey = [NAME_SPACE, 'installedPluginList']
export const useInstalledPluginList = () => {
return useQuery<InstalledPluginListResponse>({
queryKey: useInstalledPluginListKey,
queryFn: () => get<InstalledPluginListResponse>('/workspaces/current/plugin/list'),
})
}
export const useInvalidateInstalledPluginList = () => {
const queryClient = useQueryClient()
return () => {
queryClient.invalidateQueries(
{
queryKey: useInstalledPluginListKey,
})
}
}
2024-11-08 15:10:06 +08:00
2024-11-08 18:25:15 +08:00
export const useInstallPackageFromMarketPlace = () => {
return useMutation({
mutationFn: (uniqueIdentifier: string) => {
return post<InstallPackageResponse>('/workspaces/current/plugin/install/marketplace', { body: { plugin_unique_identifiers: [uniqueIdentifier] } })
},
})
}
export const useInstallPackageFromLocal = () => {
return useMutation({
mutationFn: (uniqueIdentifier: string) => {
return post<InstallPackageResponse>('/workspaces/current/plugin/install/pkg', {
body: { plugin_unique_identifiers: [uniqueIdentifier] },
})
},
})
}
2024-11-08 15:10:06 +08:00
export const useDebugKey = () => {
return useQuery({
queryKey: [NAME_SPACE, 'debugKey'],
queryFn: () => get<DebugInfoTypes>('/workspaces/current/plugin/debugging-key'),
})
}
2024-11-08 16:11:50 +08:00
const usePermissionsKey = [NAME_SPACE, 'permissions']
export const usePermissions = () => {
return useQuery({
queryKey: usePermissionsKey,
queryFn: () => get<Permissions>('/workspaces/current/plugin/permission/fetch'),
})
}
export const useInvalidatePermissions = () => {
const queryClient = useQueryClient()
return () => {
queryClient.invalidateQueries(
{
queryKey: usePermissionsKey,
})
}
}
export const useMutationPermissions = ({
onSuccess,
}: {
onSuccess?: () => void
}) => {
return useMutation({
mutationFn: (payload: Permissions) => {
return post('/workspaces/current/plugin/permission/change', { body: payload })
},
onSuccess,
})
}
2024-11-08 18:21:39 +08:00
export const useMutationPluginsFromMarketplace = () => {
return useMutation({
mutationFn: (pluginsSearchParams: PluginsSearchParams) => {
const {
query,
sortBy,
sortOrder,
category,
tags,
} = pluginsSearchParams
return postMarketplace<{ data: PluginsFromMarketplaceResponse }>('/plugins/search/basic', {
body: {
page: 1,
page_size: 10,
query,
sort_by: sortBy,
sort_order: sortOrder,
category: category !== 'all' ? category : '',
tags,
},
})
},
})
}
2024-11-12 17:58:14 +08:00
const usePluginTaskListKey = [NAME_SPACE, 'pluginTaskList']
export const usePluginTaskList = () => {
2024-11-13 11:33:39 +08:00
const [enabled, setEnabled] = useState(true)
2024-11-12 17:58:14 +08:00
const {
data,
isFetched,
refetch,
...rest
} = useQuery({
queryKey: usePluginTaskListKey,
queryFn: async () => {
const currentData = await get<{ tasks: PluginTask[] }>('/workspaces/current/plugin/tasks?page=1&page_size=100')
const taskDone = currentData.tasks.every(task => task.total_plugins === task.completed_plugins)
if (taskDone)
setEnabled(false)
return currentData
},
2024-11-13 11:33:39 +08:00
// refetchInterval: 5000,
2024-11-12 17:58:14 +08:00
enabled,
})
const handleRefetch = useCallback(() => {
setEnabled(true)
refetch()
}, [refetch])
return {
data,
pluginTasks: data?.tasks || [],
isFetched,
handleRefetch,
...rest,
}
}
export const useMutationClearTaskPlugin = () => {
return useMutation({
mutationFn: ({ taskId, pluginId }: { taskId: string; pluginId: string }) => {
2024-11-13 11:33:39 +08:00
return post<{ success: boolean }>(`/workspaces/current/plugin/tasks/${taskId}/delete/${pluginId}`)
2024-11-12 17:58:14 +08:00
},
})
}
2024-11-13 15:48:06 +08:00
export const useMutationCheckDependenciesBeforeImportDSL = () => {
const mutation = useMutation({
mutationFn: ({ dslString, url }: { dslString?: string, url?: string }) => {
if (url) {
return post<{ leaked: Dependency[] }>(
'/apps/import/url/dependencies/check',
{
body: {
url,
},
},
)
}
return post<{ leaked: Dependency[] }>(
'/apps/import/dependencies/check',
{
body: {
data: dslString,
},
})
},
onSuccess: (data) => {
const { setDependencies } = usePluginDependencyStore.getState()
setDependencies(data.leaked || [])
},
})
return mutation
}