useAreas.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
  2. import { areaClient } from '../api/areaClient';
  3. import type { CreateAreaRequest, UpdateAreaRequest, AreaQueryParams } from '../types/area';
  4. import { toast } from 'sonner';
  5. // 获取区域列表的hook
  6. export const useAreas = (params?: AreaQueryParams) => {
  7. return useQuery({
  8. queryKey: ['areas', params],
  9. queryFn: async () => {
  10. const res = await areaClient.index.$get({
  11. query: {
  12. page: params?.page || 1,
  13. pageSize: params?.pageSize || 100,
  14. filters: params?.filters || '',
  15. sortBy: params?.sortBy || 'id',
  16. sortOrder: params?.sortOrder || 'ASC'
  17. }
  18. });
  19. if (res.status !== 200) throw new Error('获取区域列表失败');
  20. const response = await res.json();
  21. return response.data;
  22. },
  23. staleTime: 5 * 60 * 1000,
  24. gcTime: 10 * 60 * 1000,
  25. });
  26. };
  27. // 获取区域子树的hook
  28. export const useAreaSubtree = (parentId: number) => {
  29. return useQuery({
  30. queryKey: ['areas-subtree', parentId],
  31. queryFn: async () => {
  32. const res = await areaClient.index.$get({
  33. query: {
  34. page: 1,
  35. pageSize: 100,
  36. filters: JSON.stringify({ parentId }),
  37. sortBy: 'id',
  38. sortOrder: 'ASC'
  39. }
  40. });
  41. if (res.status !== 200) throw new Error('获取区域子树失败');
  42. const response = await res.json();
  43. return response.data;
  44. },
  45. enabled: !!parentId,
  46. staleTime: 5 * 60 * 1000,
  47. gcTime: 10 * 60 * 1000,
  48. });
  49. };
  50. // 创建区域的hook
  51. export const useCreateArea = () => {
  52. const queryClient = useQueryClient();
  53. return useMutation({
  54. mutationFn: async (data: CreateAreaRequest) => {
  55. const res = await areaClient.index.$post({ json: data });
  56. if (res.status !== 201) throw new Error('创建区域失败');
  57. },
  58. onSuccess: (_, variables) => {
  59. // 更新根级缓存
  60. queryClient.invalidateQueries({ queryKey: ['areas'] });
  61. queryClient.invalidateQueries({ queryKey: ['areas-tree-province'] });
  62. // 如果创建的是子节点,更新父节点的子树缓存
  63. if (variables.parentId) {
  64. queryClient.invalidateQueries({ queryKey: ['areas-subtree', variables.parentId] });
  65. }
  66. toast.success('区域创建成功');
  67. },
  68. onError: () => {
  69. toast.error('创建失败,请重试');
  70. }
  71. });
  72. };
  73. // 更新区域的hook
  74. export const useUpdateArea = () => {
  75. const queryClient = useQueryClient();
  76. return useMutation({
  77. mutationFn: async ({ id, data }: { id: number; data: UpdateAreaRequest }) => {
  78. const res = await areaClient[':id'].$put({
  79. param: { id },
  80. json: data
  81. });
  82. if (res.status !== 200) throw new Error('更新区域失败');
  83. },
  84. onSuccess: () => {
  85. // 更新所有相关缓存
  86. queryClient.invalidateQueries({ queryKey: ['areas'] });
  87. queryClient.invalidateQueries({ queryKey: ['areas-tree-province'] });
  88. queryClient.invalidateQueries({ queryKey: ['areas-subtree'] });
  89. toast.success('区域更新成功');
  90. },
  91. onError: () => {
  92. toast.error('更新失败,请重试');
  93. }
  94. });
  95. };
  96. // 删除区域的hook
  97. export const useDeleteArea = () => {
  98. const queryClient = useQueryClient();
  99. return useMutation({
  100. mutationFn: async (id: number) => {
  101. const res = await areaClient[':id'].$delete({
  102. param: { id }
  103. });
  104. if (res.status !== 204) throw new Error('删除区域失败');
  105. },
  106. onSuccess: () => {
  107. // 更新所有相关缓存
  108. queryClient.invalidateQueries({ queryKey: ['areas'] });
  109. queryClient.invalidateQueries({ queryKey: ['areas-tree-province'] });
  110. queryClient.invalidateQueries({ queryKey: ['areas-subtree'] });
  111. toast.success('区域删除成功');
  112. },
  113. onError: () => {
  114. toast.error('删除失败,请重试');
  115. }
  116. });
  117. };
  118. // 切换区域状态的hook
  119. export const useToggleAreaStatus = () => {
  120. const queryClient = useQueryClient();
  121. return useMutation({
  122. mutationFn: async ({ id, isDisabled }: { id: number; isDisabled: number }) => {
  123. const res = await areaClient[':id'].$put({
  124. param: { id },
  125. json: { isDisabled }
  126. });
  127. if (res.status !== 200) throw new Error('更新区域状态失败');
  128. },
  129. onSuccess: () => {
  130. // 更新所有相关缓存
  131. queryClient.invalidateQueries({ queryKey: ['areas'] });
  132. queryClient.invalidateQueries({ queryKey: ['areas-tree-province'] });
  133. queryClient.invalidateQueries({ queryKey: ['areas-subtree'] });
  134. toast.success('区域状态更新成功');
  135. },
  136. onError: () => {
  137. toast.error('状态更新失败,请重试');
  138. }
  139. });
  140. };