import { useMutation, useQueryClient } from '@tanstack/react-query'; import { HttpUtil, Msg } from '@/utils'; import { parseMsg } from '@/utils/zodValidate'; import { keys } from '@/api/queryKeys'; import type { NodeRecord } from '@/api/queries/useNodesQuery'; import { ProbeResultSchema, type ProbeResult } from '@/schemas/node'; export type { ProbeResult }; export function useNodeMutations() { const queryClient = useQueryClient(); const invalidate = () => queryClient.invalidateQueries({ queryKey: keys.nodes.root() }); const createMut = useMutation({ mutationFn: (payload: Partial) => HttpUtil.post('/panel/api/nodes/add', payload), onSuccess: (msg) => { if (msg?.success) invalidate(); }, }); const updateMut = useMutation({ mutationFn: ({ id, payload }: { id: number; payload: Partial }) => HttpUtil.post(`/panel/api/nodes/update/${id}`, payload), onSuccess: (msg) => { if (msg?.success) invalidate(); }, }); const removeMut = useMutation({ mutationFn: (id: number) => HttpUtil.post(`/panel/api/nodes/del/${id}`), onSuccess: (msg) => { if (msg?.success) invalidate(); }, }); const setEnableMut = useMutation({ mutationFn: ({ id, enable }: { id: number; enable: boolean }) => HttpUtil.post(`/panel/api/nodes/setEnable/${id}`, { enable }), onSuccess: (msg) => { if (msg?.success) invalidate(); }, }); const probeMut = useMutation({ mutationFn: async (id: number): Promise> => { const raw = await HttpUtil.post(`/panel/api/nodes/probe/${id}`); return parseMsg(raw, ProbeResultSchema, 'nodes/probe'); }, onSuccess: (msg) => { if (msg?.success) invalidate(); }, }); return { create: (payload: Partial) => createMut.mutateAsync(payload), update: (id: number, payload: Partial) => updateMut.mutateAsync({ id, payload }), remove: (id: number) => removeMut.mutateAsync(id), setEnable: (id: number, enable: boolean) => setEnableMut.mutateAsync({ id, enable }), probe: (id: number) => probeMut.mutateAsync(id), testConnection: async (payload: Partial): Promise> => { const raw = await HttpUtil.post('/panel/api/nodes/test', payload); return parseMsg(raw, ProbeResultSchema, 'nodes/test'); }, }; }