El admin global ahora puede crear usuarios directamente desde /admin/usuarios sin depender de que un owner los invite. Backend: - Nuevo endpoint POST /usuarios/global (controller + service) - Valida límite de usuarios del plan del tenant destino - Si el email ya existe, agrega membership al tenant destino - Si no existe, crea user con temp password + membership - Schema Zod: email, nombre, role, tenantId, supervisorUserId? Frontend: - Botón 'Agregar Usuario' en /admin/usuarios - Formulario con: nombre, email, rol, empresa - Hook useCreateUsuarioGlobal con invalidación de queries
80 lines
2.3 KiB
TypeScript
80 lines
2.3 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import * as usuariosApi from '../api/usuarios';
|
|
import type { UserInvite, UserUpdate } from '@horux/shared';
|
|
|
|
export function useUsuarios() {
|
|
return useQuery({
|
|
queryKey: ['usuarios'],
|
|
queryFn: usuariosApi.getUsuarios,
|
|
});
|
|
}
|
|
|
|
export function useInviteUsuario() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (data: UserInvite) => usuariosApi.inviteUsuario(data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['usuarios'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateUsuario() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ id, data }: { id: string; data: UserUpdate }) => usuariosApi.updateUsuario(id, data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['usuarios'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteUsuario() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: string) => usuariosApi.deleteUsuario(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['usuarios'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
// Hooks globales (admin global)
|
|
export function useAllUsuarios() {
|
|
return useQuery({
|
|
queryKey: ['usuarios', 'global'],
|
|
queryFn: usuariosApi.getAllUsuarios,
|
|
});
|
|
}
|
|
|
|
export function useCreateUsuarioGlobal() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (data: UserInvite & { tenantId: string }) => usuariosApi.createUsuarioGlobal(data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['usuarios', 'global'] });
|
|
queryClient.invalidateQueries({ queryKey: ['usuarios'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateUsuarioGlobal() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ id, data }: { id: string; data: UserUpdate }) => usuariosApi.updateUsuarioGlobal(id, data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['usuarios'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteUsuarioGlobal() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: string) => usuariosApi.deleteUsuarioGlobal(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['usuarios'] });
|
|
},
|
|
});
|
|
}
|