Skip to content

Commit 314f9fa

Browse files
committed
Created and implemented react query hooks
1 parent d3ee01e commit 314f9fa

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
// frontend/lib/query/hooks/useAssets.ts
2+
import { useQuery, useMutation, useQueryClient, UseQueryOptions } from '@tanstack/react-query';
3+
import {
4+
assetApiClient,
5+
AssetListFilters,
6+
AssetListResponse,
7+
CreateAssetInput,
8+
DepartmentWithCount,
9+
CategoryWithCount,
10+
} from '@/lib/api/assets';
11+
import { queryKeys } from '../keys';
12+
import { Asset } from '../types/asset';
13+
import { ApiError } from '../types';
14+
15+
export function useAssets(
16+
filters?: AssetListFilters,
17+
options?: Omit<UseQueryOptions<AssetListResponse, ApiError>, 'queryKey' | 'queryFn'>,
18+
) {
19+
return useQuery<AssetListResponse, ApiError>({
20+
queryKey: queryKeys.assets.list(filters as Record<string, unknown> ?? {}),
21+
queryFn: () => assetApiClient.getAssets(filters),
22+
...options,
23+
});
24+
}
25+
26+
// ── Departments ──────────────────────────────────────────────
27+
28+
export function useDepartmentsList() {
29+
return useQuery<DepartmentWithCount[], ApiError>({
30+
queryKey: queryKeys.departments.list(),
31+
queryFn: () => assetApiClient.getDepartments(),
32+
});
33+
}
34+
35+
export function useCreateDepartment() {
36+
const queryClient = useQueryClient();
37+
return useMutation<{ id: string; name: string }, ApiError, { name: string; description?: string }>({
38+
mutationFn: (data) => assetApiClient.createDepartment(data),
39+
onSuccess: () => {
40+
queryClient.invalidateQueries({ queryKey: queryKeys.departments.all });
41+
},
42+
});
43+
}
44+
45+
export function useDeleteDepartment() {
46+
const queryClient = useQueryClient();
47+
return useMutation<void, ApiError, string>({
48+
mutationFn: (id) => assetApiClient.deleteDepartment(id),
49+
onSuccess: () => {
50+
queryClient.invalidateQueries({ queryKey: queryKeys.departments.all });
51+
},
52+
});
53+
}
54+
55+
// ── Categories ───────────────────────────────────────────────
56+
57+
export function useCategories() {
58+
return useQuery<CategoryWithCount[], ApiError>({
59+
queryKey: queryKeys.categories.list(),
60+
queryFn: () => assetApiClient.getCategories(),
61+
});
62+
}
63+
64+
export function useCreateCategory() {
65+
const queryClient = useQueryClient();
66+
return useMutation<{ id: string; name: string }, ApiError, { name: string; description?: string }>({
67+
mutationFn: (data) => assetApiClient.createCategory(data),
68+
onSuccess: () => {
69+
queryClient.invalidateQueries({ queryKey: queryKeys.categories.all });
70+
},
71+
});
72+
}
73+
74+
export function useDeleteCategory() {
75+
const queryClient = useQueryClient();
76+
return useMutation<void, ApiError, string>({
77+
mutationFn: (id) => assetApiClient.deleteCategory(id),
78+
onSuccess: () => {
79+
queryClient.invalidateQueries({ queryKey: queryKeys.categories.all });
80+
},
81+
});
82+
}
83+
84+
// ── Assets ───────────────────────────────────────────────────
85+
86+
export function useCreateAsset() {
87+
const queryClient = useQueryClient();
88+
return useMutation<Asset, ApiError, CreateAssetInput>({
89+
mutationFn: (data) => assetApiClient.createAsset(data),
90+
onSuccess: () => {
91+
queryClient.invalidateQueries({ queryKey: queryKeys.assets.all });
92+
},
93+
});
94+
}
95+
96+
export function useUpdateAsset(id: string) {
97+
const queryClient = useQueryClient();
98+
return useMutation<Asset, ApiError, Partial<CreateAssetInput>>({
99+
mutationFn: (data) => assetApiClient.updateAsset(id, data),
100+
onSuccess: (updated) => {
101+
queryClient.setQueryData(queryKeys.assets.detail(id), updated);
102+
queryClient.invalidateQueries({ queryKey: queryKeys.assets.all });
103+
},
104+
});
105+
}
106+
107+
---
108+
109+
// frontend/lib/query/hooks/useReports.ts
110+
import { useQuery } from '@tanstack/react-query';
111+
import { reportsApiClient, ReportsSummary } from '@/lib/api/reports';
112+
113+
export function useReportsSummary() {
114+
return useQuery<ReportsSummary>({
115+
queryKey: ['reports', 'summary'],
116+
queryFn: () => reportsApiClient.getSummary(),
117+
});
118+
}
119+
120+
---
121+
122+
// frontend/lib/query/hooks/useUser.ts
123+
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
124+
import {
125+
usersApiClient,
126+
AppUser,
127+
UserRole,
128+
UpdateProfileInput,
129+
} from "@/lib/api/users";
130+
131+
const usersKeys = {
132+
all: ["users"] as const,
133+
list: (search?: string) => [...usersKeys.all, "list", search ?? ""] as const,
134+
};
135+
136+
export function useUsersList(search?: string) {
137+
return useQuery<AppUser[]>({
138+
queryKey: usersKeys.list(search),
139+
queryFn: () => usersApiClient.getUsers(search),
140+
});
141+
}
142+
143+
export function useUpdateUserRole() {
144+
const queryClient = useQueryClient();
145+
return useMutation<AppUser, Error, { id: string; role: UserRole }>({
146+
mutationFn: ({ id, role }) => usersApiClient.updateRole(id, role),
147+
onSuccess: () => {
148+
queryClient.invalidateQueries({ queryKey: usersKeys.all });
149+
},
150+
});
151+
}
152+
153+
export function useUpdateProfile() {
154+
const queryClient = useQueryClient();
155+
return useMutation<AppUser, Error, UpdateProfileInput>({
156+
mutationFn: (data) => usersApiClient.updateProfile(data),
157+
onSuccess: () => {
158+
queryClient.invalidateQueries({ queryKey: usersKeys.all });
159+
},
160+
});
161+
}

0 commit comments

Comments
 (0)