diff --git a/app/client/modules/settings/components/create-user-dialog.tsx b/app/client/modules/settings/components/create-user-dialog.tsx index 51160419..25ba8533 100644 --- a/app/client/modules/settings/components/create-user-dialog.tsx +++ b/app/client/modules/settings/components/create-user-dialog.tsx @@ -1,4 +1,5 @@ import { arktypeResolver } from "@hookform/resolvers/arktype"; +import { useMutation } from "@tanstack/react-query"; import { type } from "arktype"; import { Plus, UserPlus } from "lucide-react"; import { useState } from "react"; @@ -35,7 +36,6 @@ interface CreateUserDialogProps { export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { const [isOpen, setIsOpen] = useState(false); - const [isLoading, setIsLoading] = useState(false); const form = useForm({ resolver: arktypeResolver(createUserSchema), @@ -48,10 +48,8 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { }, }); - const onSubmit = async (values: CreateUserFormValues) => { - setIsLoading(true); - - try { + const createUserMutation = useMutation({ + mutationFn: async (values: CreateUserFormValues) => { const { error } = await authClient.admin.createUser({ email: values.email, password: values.password, @@ -61,20 +59,19 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { }); if (error) { - toast.error("Failed to create user", { description: error.message }); - } else { - toast.success("User created successfully"); - setIsOpen(false); - form.reset(); - onUserCreated?.(); + throw new Error(error.message); } - } catch (err) { - console.error(err); - toast.error("An unexpected error occurred"); - } finally { - setIsLoading(false); - } - }; + }, + onSuccess: () => { + toast.success("User created successfully"); + setIsOpen(false); + form.reset(); + onUserCreated?.(); + }, + onError: (error: Error) => { + toast.error("Failed to create user", { description: error.message }); + }, + }); return ( @@ -86,7 +83,7 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) {
- + createUserMutation.mutate(values))} className="space-y-6"> @@ -102,7 +99,7 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { Full Name - + @@ -115,7 +112,7 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { Username - + @@ -128,7 +125,12 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { Email - + @@ -141,7 +143,12 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { Password - + @@ -153,7 +160,7 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { render={({ field }) => ( Role - @@ -170,10 +177,15 @@ export function CreateUserDialog({ onUserCreated }: CreateUserDialogProps) { /> - - diff --git a/app/server/modules/auth/auth.service.ts b/app/server/modules/auth/auth.service.ts index daeac206..15b60ad5 100644 --- a/app/server/modules/auth/auth.service.ts +++ b/app/server/modules/auth/auth.service.ts @@ -7,7 +7,7 @@ import { repositoriesTable, backupSchedulesTable, } from "../../db/schema"; -import { eq, sql, and, count, inArray } from "drizzle-orm"; +import { eq, ne, and, count, inArray } from "drizzle-orm"; import type { UserDeletionImpactDto } from "./auth.dto"; export class AuthService { @@ -37,7 +37,7 @@ export class AuthService { and( eq(member.organizationId, membership.organizationId), eq(member.role, "owner"), - sql`user_id != ${userId}`, + ne(member.userId, userId), ), );