Files
routstr-core/ui/lib/hooks/useUsers.ts
T
2025-10-21 22:07:47 +02:00

121 lines
3.1 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { UserService } from '../api/services/users';
import { CreateUser, UpdateUser } from '../api/schemas/users';
import { toast } from 'sonner';
// Query keys for users
const userKeys = {
all: ['users'] as const,
lists: () => [...userKeys.all, 'list'] as const,
list: (filters: { organizationId?: string }) =>
[...userKeys.lists(), filters] as const,
details: () => [...userKeys.all, 'detail'] as const,
detail: (id: string) => [...userKeys.details(), id] as const,
};
/**
* Hook to fetch users list with optional organization filter
*/
export function useUsers(filters?: {
organizationId?: string;
enabled?: boolean;
}) {
const { organizationId, enabled } = filters || {};
return useQuery({
queryKey: userKeys.list({ organizationId }),
queryFn: () => UserService.listUsers(organizationId),
enabled: enabled ?? true,
});
}
/**
* Hook to fetch a specific user by ID
*/
export function useUser(userId: string, options?: { enabled?: boolean }) {
return useQuery({
queryKey: userKeys.detail(userId),
queryFn: () => UserService.getUser(userId),
enabled: !!userId && (options?.enabled ?? true),
});
}
/**
* Hook to create a new user
*/
export function useCreateUser() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (userData: CreateUser) => {
return UserService.createUser(userData);
},
onSuccess: (user) => {
toast.success('User created successfully');
queryClient.invalidateQueries({ queryKey: userKeys.lists() });
queryClient.invalidateQueries({
queryKey: userKeys.list({ organizationId: user.organization_id }),
});
},
onError: (error) => {
toast.error(`Failed to create user: ${error.message}`);
},
});
}
/**
* Hook to update an existing user
*/
export function useUpdateUser() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({
userId,
userData,
}: {
userId: string;
userData: UpdateUser;
}) => {
return UserService.updateUser(userId, userData);
},
onSuccess: (updatedUser) => {
if (updatedUser) {
toast.success('User updated successfully');
queryClient.invalidateQueries({
queryKey: userKeys.detail(updatedUser.id),
});
queryClient.invalidateQueries({ queryKey: userKeys.lists() });
queryClient.invalidateQueries({
queryKey: userKeys.list({
organizationId: updatedUser.organization_id,
}),
});
}
},
onError: (error) => {
toast.error(`Failed to update user: ${error.message}`);
},
});
}
/**
* Hook to delete a user
*/
export function useDeleteUser() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (userId: string) => {
return UserService.deleteUser(userId);
},
onSuccess: () => {
toast.success('User deleted successfully');
queryClient.invalidateQueries({ queryKey: userKeys.lists() });
},
onError: (error) => {
toast.error(`Failed to delete user: ${error.message}`);
},
});
}