dify/web/app/components/plugins/plugin-page/plugin-tasks/hooks.ts

90 lines
2.6 KiB
TypeScript
Raw Normal View History

2024-11-25 17:32:57 +08:00
import {
useCallback,
useEffect,
useRef,
useState,
} from 'react'
2024-11-11 18:17:44 +08:00
import { TaskStatus } from '@/app/components/plugins/types'
import type { PluginStatus } from '@/app/components/plugins/types'
2024-11-12 17:58:14 +08:00
import {
useMutationClearTaskPlugin,
usePluginTaskList,
} from '@/service/use-plugins'
2024-11-11 18:17:44 +08:00
export const usePluginTaskStatus = () => {
2024-11-12 17:58:14 +08:00
const {
pluginTasks,
} = usePluginTaskList()
const { mutate } = useMutationClearTaskPlugin()
2024-11-15 15:46:29 +08:00
const allPlugins = pluginTasks.filter(task => task.status !== TaskStatus.success).map(task => task.plugins.map((plugin) => {
2024-11-12 17:58:14 +08:00
return {
...plugin,
taskId: task.id,
}
})).flat()
2024-11-11 18:17:44 +08:00
const errorPlugins: PluginStatus[] = []
const successPlugins: PluginStatus[] = []
const runningPlugins: PluginStatus[] = []
allPlugins.forEach((plugin) => {
if (plugin.status === TaskStatus.running)
runningPlugins.push(plugin)
if (plugin.status === TaskStatus.failed)
errorPlugins.push(plugin)
if (plugin.status === TaskStatus.success)
successPlugins.push(plugin)
})
2024-11-12 17:58:14 +08:00
const handleClearErrorPlugin = useCallback((taskId: string, pluginId: string) => {
mutate({
taskId,
pluginId,
})
}, [mutate])
2024-11-25 17:32:57 +08:00
const totalPluginsLength = allPlugins.length
const runningPluginsLength = runningPlugins.length
const errorPluginsLength = errorPlugins.length
const successPluginsLength = successPlugins.length
const isInstalling = runningPluginsLength > 0 && errorPluginsLength === 0 && successPluginsLength === 0
const isInstallingWithSuccess = runningPluginsLength > 0 && successPluginsLength > 0 && errorPluginsLength === 0
const isInstallingWithError = runningPluginsLength > 0 && errorPluginsLength > 0
const isSuccess = successPluginsLength === totalPluginsLength && totalPluginsLength > 0
const isFailed = runningPluginsLength === 0 && (errorPluginsLength + successPluginsLength) === totalPluginsLength && totalPluginsLength > 0 && errorPluginsLength > 0
const [opacity, setOpacity] = useState(1)
const timerRef = useRef<NodeJS.Timeout | null>(null)
useEffect(() => {
if (isSuccess && opacity > 0) {
if (timerRef.current) {
clearTimeout(timerRef.current)
timerRef.current = null
}
timerRef.current = setTimeout(() => {
setOpacity(v => v - 0.1)
}, 200)
}
if (!isSuccess)
setOpacity(1)
}, [isSuccess, opacity])
2024-11-12 17:58:14 +08:00
2024-11-11 18:17:44 +08:00
return {
errorPlugins,
successPlugins,
runningPlugins,
2024-11-25 17:32:57 +08:00
runningPluginsLength,
errorPluginsLength,
successPluginsLength,
totalPluginsLength,
isInstalling,
isInstallingWithSuccess,
isInstallingWithError,
isSuccess,
isFailed,
2024-11-12 17:58:14 +08:00
handleClearErrorPlugin,
2024-11-25 17:32:57 +08:00
opacity,
2024-11-11 18:17:44 +08:00
}
}