diff --git a/adminfront/src/features/tenants/routes/TenantAdminsAndOwnersTab.tsx b/adminfront/src/features/tenants/routes/TenantAdminsAndOwnersTab.tsx index dedf8d65..d592d6f2 100644 --- a/adminfront/src/features/tenants/routes/TenantAdminsAndOwnersTab.tsx +++ b/adminfront/src/features/tenants/routes/TenantAdminsAndOwnersTab.tsx @@ -40,6 +40,7 @@ import { } from "../../../components/ui/table"; import { toast } from "../../../components/ui/use-toast"; import { + type TenantAdmin, addTenantAdmin, addTenantOwner, fetchTenantAdmins, @@ -86,7 +87,7 @@ export function TenantAdminsAndOwnersTab() { await queryClient.cancelQueries({ queryKey: ["tenant-owners", tenantId], }); - const previousOwners = queryClient.getQueryData([ + const previousOwners = queryClient.getQueryData([ "tenant-owners", tenantId, ]); @@ -94,17 +95,20 @@ export function TenantAdminsAndOwnersTab() { // Optimistically add to the list to prevent immediate double clicks const addedUser = searchResults.find((u) => u.id === userId); if (addedUser) { - queryClient.setQueryData(["tenant-owners", tenantId], (old) => { - if (!old) + queryClient.setQueryData( + ["tenant-owners", tenantId], + (old) => { + if (!old) + return [ + { id: userId, name: addedUser.name, email: addedUser.email }, + ]; + if (old.some((o) => o.id === userId)) return old; return [ + ...old, { id: userId, name: addedUser.name, email: addedUser.email }, ]; - if (old.some((o) => o.id === userId)) return old; - return [ - ...old, - { id: userId, name: addedUser.name, email: addedUser.email }, - ]; - }); + }, + ); } return { previousOwners }; }, @@ -140,12 +144,13 @@ export function TenantAdminsAndOwnersTab() { await queryClient.cancelQueries({ queryKey: ["tenant-owners", tenantId], }); - const previousOwners = queryClient.getQueryData([ + const previousOwners = queryClient.getQueryData([ "tenant-owners", tenantId, ]); - queryClient.setQueryData(["tenant-owners", tenantId], (old) => - old ? old.filter((o) => o.id !== userId) : [], + queryClient.setQueryData( + ["tenant-owners", tenantId], + (old) => (old ? old.filter((o) => o.id !== userId) : []), ); return { previousOwners }; }, @@ -182,24 +187,27 @@ export function TenantAdminsAndOwnersTab() { await queryClient.cancelQueries({ queryKey: ["tenant-admins", tenantId], }); - const previousAdmins = queryClient.getQueryData([ + const previousAdmins = queryClient.getQueryData([ "tenant-admins", tenantId, ]); const addedUser = searchResults.find((u) => u.id === userId); if (addedUser) { - queryClient.setQueryData(["tenant-admins", tenantId], (old) => { - if (!old) + queryClient.setQueryData( + ["tenant-admins", tenantId], + (old) => { + if (!old) + return [ + { id: userId, name: addedUser.name, email: addedUser.email }, + ]; + if (old.some((a) => a.id === userId)) return old; return [ + ...old, { id: userId, name: addedUser.name, email: addedUser.email }, ]; - if (old.some((a) => a.id === userId)) return old; - return [ - ...old, - { id: userId, name: addedUser.name, email: addedUser.email }, - ]; - }); + }, + ); } return { previousAdmins }; }, @@ -234,12 +242,13 @@ export function TenantAdminsAndOwnersTab() { await queryClient.cancelQueries({ queryKey: ["tenant-admins", tenantId], }); - const previousAdmins = queryClient.getQueryData([ + const previousAdmins = queryClient.getQueryData([ "tenant-admins", tenantId, ]); - queryClient.setQueryData(["tenant-admins", tenantId], (old) => - old ? old.filter((a) => a.id !== userId) : [], + queryClient.setQueryData( + ["tenant-admins", tenantId], + (old) => (old ? old.filter((a) => a.id !== userId) : []), ); return { previousAdmins }; }, diff --git a/adminfront/src/features/users/UserDetailPage.tsx b/adminfront/src/features/users/UserDetailPage.tsx index a39d21d0..fc5730fe 100644 --- a/adminfront/src/features/users/UserDetailPage.tsx +++ b/adminfront/src/features/users/UserDetailPage.tsx @@ -12,11 +12,14 @@ import { Save, Trash2, UserCheck, - UserMinus, Users, } from "lucide-react"; import * as React from "react"; -import { useForm } from "react-hook-form"; +import { + type FieldErrors, + type UseFormRegister, + useForm, +} from "react-hook-form"; import { Link, useNavigate, useParams } from "react-router-dom"; import { Badge } from "../../components/ui/badge"; import { Button } from "../../components/ui/button"; @@ -35,7 +38,6 @@ import { type UserUpdateRequest, deleteUser, fetchMe, - fetchTenant, fetchTenants, fetchUser, updateUser, @@ -52,6 +54,10 @@ type UserSchemaField = { validation?: string; }; +type UserFormValues = Omit & { + metadata: Record>; +}; + function TenantMetadataFields({ tenant, schema, @@ -60,8 +66,8 @@ function TenantMetadataFields({ }: { tenant: { id: string; name: string; slug: string }; schema: UserSchemaField[]; - register: any; - errors: any; + register: UseFormRegister; + errors: FieldErrors; }) { if (schema.length === 0) return null; @@ -107,7 +113,7 @@ function TenantMetadataFields({ className={ field.type === "boolean" ? "w-auto h-auto" : "h-8 text-sm" } - {...register(`metadata.${tenant.id}.${field.key}`, { + {...register(`metadata.${tenant.id}.${field.key}` as const, { required: field.required ? t( "msg.admin.users.detail.form.field_required", @@ -149,10 +155,6 @@ function TenantMetadataFields({ ); } -type UserFormValues = Omit & { - metadata: Record>; -}; - function UserDetailPage() { const params = useParams<{ id: string }>(); const userId = params.id ?? ""; @@ -191,7 +193,6 @@ function UserDetailPage() { handleSubmit, reset, watch, - setValue, formState: { errors }, } = useForm({ defaultValues: { @@ -261,7 +262,11 @@ function UserDetailPage() { department: user.department || "", position: user.position || "", jobTitle: user.jobTitle || "", - metadata: user.metadata || {}, + metadata: + (user.metadata as unknown as Record< + string, + Record + >) || {}, }); } }, [user, reset]); @@ -326,7 +331,10 @@ function UserDetailPage() { }), ); - mutation.mutate({ ...data, metadata: cleanMetadata }); + mutation.mutate({ + ...data, + metadata: cleanMetadata as Record, + }); }; const handleDelete = () => {