useTenants.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
  2. import { tenantClient } from '../api/tenantClient';
  3. import { toast } from 'sonner';
  4. export interface UseTenantsOptions {
  5. page?: number;
  6. pageSize?: number;
  7. keyword?: string;
  8. filters?: Record<string, unknown>;
  9. }
  10. export function useTenants(options: UseTenantsOptions = {}) {
  11. const {
  12. page = 1,
  13. pageSize = 10,
  14. keyword = '',
  15. filters = {}
  16. } = options;
  17. const queryClient = useQueryClient();
  18. const query = useQuery({
  19. queryKey: ['tenants', page, pageSize, keyword, filters],
  20. queryFn: async () => {
  21. const res = await tenantClient.index.$get({
  22. query: {
  23. page,
  24. pageSize,
  25. keyword,
  26. filters: Object.keys(filters).length > 0 ? JSON.stringify(filters) : undefined
  27. }
  28. });
  29. if (res.status !== 200) {
  30. throw new Error('获取租户列表失败');
  31. }
  32. return await res.json();
  33. }
  34. });
  35. const createMutation = useMutation({
  36. mutationFn: async (data: Parameters<typeof tenantClient.index.$post>[0]['json']) => {
  37. const res = await tenantClient.index.$post({ json: data });
  38. if (res.status !== 201) {
  39. throw new Error('创建租户失败');
  40. }
  41. return await res.json();
  42. },
  43. onSuccess: () => {
  44. toast.success('租户创建成功');
  45. queryClient.invalidateQueries({ queryKey: ['tenants'] });
  46. },
  47. onError: () => {
  48. toast.error('创建失败,请重试');
  49. }
  50. });
  51. const updateMutation = useMutation({
  52. mutationFn: async ({ id, data }: { id: number; data: Parameters<typeof tenantClient[':id']['$put']>[0]['json'] }) => {
  53. const res = await tenantClient[':id']['$put']({
  54. param: { id },
  55. json: data
  56. });
  57. if (res.status !== 200) {
  58. throw new Error('更新租户失败');
  59. }
  60. return await res.json();
  61. },
  62. onSuccess: () => {
  63. toast.success('租户更新成功');
  64. queryClient.invalidateQueries({ queryKey: ['tenants'] });
  65. },
  66. onError: () => {
  67. toast.error('更新失败,请重试');
  68. }
  69. });
  70. const deleteMutation = useMutation({
  71. mutationFn: async (id: number) => {
  72. const res = await tenantClient[':id']['$delete']({
  73. param: { id }
  74. });
  75. if (res.status !== 204) {
  76. throw new Error('删除租户失败');
  77. }
  78. },
  79. onSuccess: () => {
  80. toast.success('租户删除成功');
  81. queryClient.invalidateQueries({ queryKey: ['tenants'] });
  82. },
  83. onError: () => {
  84. toast.error('删除失败,请重试');
  85. }
  86. });
  87. return {
  88. ...query,
  89. createTenant: createMutation.mutateAsync,
  90. updateTenant: updateMutation.mutateAsync,
  91. deleteTenant: deleteMutation.mutateAsync,
  92. isCreating: createMutation.isPending,
  93. isUpdating: updateMutation.isPending,
  94. isDeleting: deleteMutation.isPending
  95. };
  96. }