Files
xingrin/frontend/hooks/use-workers.ts
2025-12-12 18:04:57 +08:00

156 lines
4.1 KiB
TypeScript

/**
* Worker 节点管理 Hooks
*/
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { workerService } from '@/services/worker.service'
import type { CreateWorkerRequest, UpdateWorkerRequest } from '@/types/worker.types'
import { toast } from 'sonner'
// Query Keys
export const workerKeys = {
all: ['workers'] as const,
lists: () => [...workerKeys.all, 'list'] as const,
list: (page: number, pageSize: number) => [...workerKeys.lists(), { page, pageSize }] as const,
details: () => [...workerKeys.all, 'detail'] as const,
detail: (id: number) => [...workerKeys.details(), id] as const,
}
/**
* 获取 Worker 列表
*/
export function useWorkers(page = 1, pageSize = 10) {
return useQuery({
queryKey: workerKeys.list(page, pageSize),
queryFn: () => workerService.getWorkers(page, pageSize),
})
}
/**
* 获取单个 Worker 详情
*/
export function useWorker(id: number) {
return useQuery({
queryKey: workerKeys.detail(id),
queryFn: () => workerService.getWorker(id),
enabled: id > 0,
})
}
/**
* 创建 Worker
*/
export function useCreateWorker() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (data: CreateWorkerRequest) => workerService.createWorker(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: workerKeys.lists() })
toast.success('Worker 节点创建成功')
},
onError: (error: Error) => {
toast.error(`创建失败: ${error.message}`)
},
})
}
/**
* 更新 Worker
*/
export function useUpdateWorker() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ id, data }: { id: number; data: UpdateWorkerRequest }) =>
workerService.updateWorker(id, data),
onSuccess: (_: unknown, { id }: { id: number; data: UpdateWorkerRequest }) => {
queryClient.invalidateQueries({ queryKey: workerKeys.lists() })
queryClient.invalidateQueries({ queryKey: workerKeys.detail(id) })
toast.success('Worker 节点更新成功')
},
onError: (error: Error) => {
toast.error(`更新失败: ${error.message}`)
},
})
}
/**
* 删除 Worker
*/
export function useDeleteWorker() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (id: number) => workerService.deleteWorker(id),
onSuccess: () => {
// 立即刷新活跃的列表查询
queryClient.invalidateQueries({
queryKey: workerKeys.lists(),
refetchType: 'active',
})
toast.success('Worker 节点已删除')
},
onError: (error: Error) => {
toast.error(`删除失败: ${error.message}`)
},
})
}
/**
* 部署 Worker
*/
export function useDeployWorker() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (id: number) => workerService.deployWorker(id),
onSuccess: (_: unknown, id: number) => {
queryClient.invalidateQueries({ queryKey: workerKeys.detail(id) })
queryClient.invalidateQueries({ queryKey: workerKeys.lists() })
toast.success('部署已启动')
},
onError: (error: Error) => {
toast.error(`部署失败: ${error.message}`)
},
})
}
/**
* 重启 Worker
*/
export function useRestartWorker() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (id: number) => workerService.restartWorker(id),
onSuccess: (_: unknown, id: number) => {
queryClient.invalidateQueries({ queryKey: workerKeys.detail(id) })
queryClient.invalidateQueries({ queryKey: workerKeys.lists() })
toast.success('Worker 正在重启')
},
onError: (error: Error) => {
toast.error(`重启失败: ${error.message}`)
},
})
}
/**
* 停止 Worker
*/
export function useStopWorker() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (id: number) => workerService.stopWorker(id),
onSuccess: (_: unknown, id: number) => {
queryClient.invalidateQueries({ queryKey: workerKeys.detail(id) })
queryClient.invalidateQueries({ queryKey: workerKeys.lists() })
toast.success('Worker 已停止')
},
onError: (error: Error) => {
toast.error(`停止失败: ${error.message}`)
},
})
}