Skip to content

Commit e9c5d0a

Browse files
Merge pull request #513 from mijinummi/feat/464-react-query-hooks-users-settings
Feat/464 react query hooks users settings
2 parents e45e448 + 73aef98 commit e9c5d0a

File tree

4 files changed

+57
-5
lines changed

4 files changed

+57
-5
lines changed

frontend/app/hooks/useUsers.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
2-
import { getUsers, updateUserRole } from '../lib/api/usersApi';
2+
import { getUsers, updateUserRole, updateProfile } from '../lib/api/usersApi';
3+
import { getReportsSummary } from '../lib/api/reportsApi';
4+
import { User, ReportSummary } from '../lib/types/users';
5+
import { useAuthStore } from '../store/authStore';
36

4-
export function useUsers() {
5-
return useQuery({ queryKey: ['users'], queryFn: getUsers });
7+
export function useUsersList() {
8+
return useQuery<User[]>({
9+
queryKey: ['users'],
10+
queryFn: getUsers,
11+
});
612
}
713

814
export function useUpdateUserRole() {
@@ -15,3 +21,23 @@ export function useUpdateUserRole() {
1521
},
1622
});
1723
}
24+
25+
export function useUpdateProfile() {
26+
const queryClient = useQueryClient();
27+
return useMutation({
28+
mutationFn: ({ id, payload }: { id: string; payload: Partial<User> }) =>
29+
updateProfile(id, payload),
30+
onSuccess: (updatedUser) => {
31+
// Update Zustand store to keep sidebar in sync
32+
useAuthStore.getState().setUser(updatedUser);
33+
queryClient.invalidateQueries({ queryKey: ['users'] });
34+
},
35+
});
36+
}
37+
38+
export function useReportsSummary() {
39+
return useQuery<ReportSummary>({
40+
queryKey: ['reportsSummary'],
41+
queryFn: getReportsSummary,
42+
});
43+
}

frontend/lib/api/reportsApi.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import api from './client';
2+
import { ReportSummary } from '../users';
3+
4+
export async function getReportsSummary(): Promise<ReportSummary> {
5+
const res = await api.get('/api/reports/summary');
6+
return res.data;
7+
}

frontend/lib/api/usersApi.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import api from './client';
2+
import { User } from '../users';
23

3-
export async function getUsers() {
4+
export async function getUsers(): Promise<User[]> {
45
const res = await api.get('/api/users');
56
return res.data;
67
}
78

8-
export async function updateUserRole(id: string, role: string) {
9+
export async function updateUserRole(id: string, role: string): Promise<User> {
910
const res = await api.patch(`/api/users/${id}/role`, { role });
1011
return res.data;
1112
}
13+
14+
export async function updateProfile(id: string, payload: Partial<User>): Promise<User> {
15+
const res = await api.patch(`/api/users/${id}`, payload);
16+
return res.data;
17+
}

frontend/lib/users.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export interface User {
2+
id: string;
3+
name: string;
4+
email: string;
5+
role: 'admin' | 'manager' | 'staff';
6+
joinedAt: string;
7+
}
8+
9+
export interface ReportSummary {
10+
totalUsers: number;
11+
activeUsers: number;
12+
inactiveUsers: number;
13+
}

0 commit comments

Comments
 (0)