useNodeMutations.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { useMutation, useQueryClient } from '@tanstack/react-query';
  2. import { HttpUtil, Msg } from '@/utils';
  3. import { parseMsg } from '@/utils/zodValidate';
  4. import { keys } from '@/api/queryKeys';
  5. import type { NodeRecord } from '@/api/queries/useNodesQuery';
  6. import { ProbeResultSchema, type ProbeResult } from '@/schemas/node';
  7. export type { ProbeResult };
  8. export function useNodeMutations() {
  9. const queryClient = useQueryClient();
  10. const invalidate = () => queryClient.invalidateQueries({ queryKey: keys.nodes.root() });
  11. const createMut = useMutation({
  12. mutationFn: (payload: Partial<NodeRecord>) =>
  13. HttpUtil.post('/panel/api/nodes/add', payload),
  14. onSuccess: (msg) => { if (msg?.success) invalidate(); },
  15. });
  16. const updateMut = useMutation({
  17. mutationFn: ({ id, payload }: { id: number; payload: Partial<NodeRecord> }) =>
  18. HttpUtil.post(`/panel/api/nodes/update/${id}`, payload),
  19. onSuccess: (msg) => { if (msg?.success) invalidate(); },
  20. });
  21. const removeMut = useMutation({
  22. mutationFn: (id: number) =>
  23. HttpUtil.post(`/panel/api/nodes/del/${id}`),
  24. onSuccess: (msg) => { if (msg?.success) invalidate(); },
  25. });
  26. const setEnableMut = useMutation({
  27. mutationFn: ({ id, enable }: { id: number; enable: boolean }) =>
  28. HttpUtil.post(`/panel/api/nodes/setEnable/${id}`, { enable }),
  29. onSuccess: (msg) => { if (msg?.success) invalidate(); },
  30. });
  31. const probeMut = useMutation({
  32. mutationFn: async (id: number): Promise<Msg<ProbeResult>> => {
  33. const raw = await HttpUtil.post(`/panel/api/nodes/probe/${id}`);
  34. return parseMsg(raw, ProbeResultSchema, 'nodes/probe');
  35. },
  36. onSuccess: (msg) => { if (msg?.success) invalidate(); },
  37. });
  38. return {
  39. create: (payload: Partial<NodeRecord>) => createMut.mutateAsync(payload),
  40. update: (id: number, payload: Partial<NodeRecord>) => updateMut.mutateAsync({ id, payload }),
  41. remove: (id: number) => removeMut.mutateAsync(id),
  42. setEnable: (id: number, enable: boolean) => setEnableMut.mutateAsync({ id, enable }),
  43. probe: (id: number) => probeMut.mutateAsync(id),
  44. testConnection: async (payload: Partial<NodeRecord>): Promise<Msg<ProbeResult>> => {
  45. const raw = await HttpUtil.post('/panel/api/nodes/test', payload);
  46. return parseMsg(raw, ProbeResultSchema, 'nodes/test');
  47. },
  48. };
  49. }