mirror of
https://github.com/Routstr/routstr-core.git
synced 2026-08-09 11:04:36 +00:00
121 lines
3.1 KiB
TypeScript
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}`);
|
|
},
|
|
});
|
|
}
|