useNodeMutations.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 interface NodeUpdateResult {
  9. id: number;
  10. name?: string;
  11. ok: boolean;
  12. error?: string;
  13. }
  14. export interface RemoteInboundOption {
  15. tag: string;
  16. remark?: string;
  17. protocol?: string;
  18. port?: number;
  19. }
  20. export function useNodeMutations() {
  21. const queryClient = useQueryClient();
  22. const invalidate = () => {
  23. queryClient.invalidateQueries({ queryKey: keys.nodes.root() });
  24. queryClient.invalidateQueries({ queryKey: keys.inbounds.options() });
  25. };
  26. const createMut = useMutation({
  27. mutationFn: (payload: Partial<NodeRecord>) => HttpUtil.post('/panel/api/nodes/add', payload),
  28. onSuccess: (msg) => {
  29. if (msg?.success) invalidate();
  30. },
  31. });
  32. const updateMut = useMutation({
  33. mutationFn: ({ id, payload }: { id: number; payload: Partial<NodeRecord> }) =>
  34. HttpUtil.post(`/panel/api/nodes/update/${id}`, payload),
  35. onSuccess: (msg) => {
  36. if (msg?.success) invalidate();
  37. },
  38. });
  39. const removeMut = useMutation({
  40. mutationFn: (id: number) => HttpUtil.post(`/panel/api/nodes/del/${id}`),
  41. onSuccess: (msg) => {
  42. if (msg?.success) invalidate();
  43. },
  44. });
  45. const setEnableMut = useMutation({
  46. mutationFn: ({ id, enable }: { id: number; enable: boolean }) =>
  47. HttpUtil.post(`/panel/api/nodes/setEnable/${id}`, { enable }),
  48. onSuccess: (msg) => {
  49. if (msg?.success) invalidate();
  50. },
  51. });
  52. const probeMut = useMutation({
  53. mutationFn: async (id: number): Promise<Msg<ProbeResult>> => {
  54. const raw = await HttpUtil.post(`/panel/api/nodes/probe/${id}`);
  55. return parseMsg(raw, ProbeResultSchema, 'nodes/probe');
  56. },
  57. onSuccess: (msg) => {
  58. if (msg?.success) invalidate();
  59. },
  60. });
  61. const updatePanelsMut = useMutation({
  62. mutationFn: ({ ids, dev }: { ids: number[]; dev: boolean }) =>
  63. HttpUtil.post<NodeUpdateResult[]>(
  64. '/panel/api/nodes/updatePanel',
  65. { ids, dev },
  66. {
  67. headers: { 'Content-Type': 'application/json' },
  68. },
  69. ),
  70. onSuccess: (msg) => {
  71. if (msg?.success) invalidate();
  72. },
  73. });
  74. return {
  75. create: (payload: Partial<NodeRecord>) => createMut.mutateAsync(payload),
  76. update: (id: number, payload: Partial<NodeRecord>) => updateMut.mutateAsync({ id, payload }),
  77. remove: (id: number) => removeMut.mutateAsync(id),
  78. setEnable: (id: number, enable: boolean) => setEnableMut.mutateAsync({ id, enable }),
  79. probe: (id: number) => probeMut.mutateAsync(id),
  80. updatePanels: (ids: number[], dev: boolean): Promise<Msg<NodeUpdateResult[]>> =>
  81. updatePanelsMut.mutateAsync({ ids, dev }),
  82. testConnection: async (payload: Partial<NodeRecord>): Promise<Msg<ProbeResult>> => {
  83. const raw = await HttpUtil.post('/panel/api/nodes/test', payload);
  84. return parseMsg(raw, ProbeResultSchema, 'nodes/test');
  85. },
  86. fetchFingerprint: (payload: Partial<NodeRecord>): Promise<Msg<string>> =>
  87. HttpUtil.post<string>('/panel/api/nodes/certFingerprint', payload),
  88. fetchInbounds: (payload: Partial<NodeRecord>): Promise<Msg<RemoteInboundOption[]>> =>
  89. HttpUtil.post<RemoteInboundOption[]>('/panel/api/nodes/inbounds', payload),
  90. };
  91. }