From 3fb0d128a179f73d00f026eccc1afa2fd3d3c2a1 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 16 Feb 2026 16:16:23 +0100 Subject: [PATCH] Fix missing query invalidations across member management Add utils.user.list.invalidate() after mutations that change user status to ensure member lists refresh without manual page reload: - Member detail page: after update and send invitation - User mobile actions: after send invitation - Add member dialog: after send invitation in jury group flow Co-Authored-By: Claude Opus 4.6 --- src/app/(admin)/admin/members/[id]/page.tsx | 4 ++++ src/components/admin/jury/add-member-dialog.tsx | 1 + src/components/admin/user-actions.tsx | 1 + 3 files changed, 6 insertions(+) diff --git a/src/app/(admin)/admin/members/[id]/page.tsx b/src/app/(admin)/admin/members/[id]/page.tsx index 3750510..abea22a 100644 --- a/src/app/(admin)/admin/members/[id]/page.tsx +++ b/src/app/(admin)/admin/members/[id]/page.tsx @@ -58,6 +58,7 @@ import { export default function MemberDetailPage() { const params = useParams() const router = useRouter() + const utils = trpc.useUtils() const userId = params.id as string const { data: user, isLoading, error, refetch } = trpc.user.get.useQuery({ id: userId }) @@ -103,6 +104,8 @@ export default function MemberDetailPage() { expertiseTags, maxAssignments: maxAssignments ? parseInt(maxAssignments) : null, }) + utils.user.get.invalidate({ id: userId }) + utils.user.list.invalidate() toast.success('Member updated successfully') router.push('/admin/members') } catch (error) { @@ -115,6 +118,7 @@ export default function MemberDetailPage() { await sendInvitation.mutateAsync({ userId }) toast.success('Invitation email sent successfully') refetch() + utils.user.list.invalidate() } catch (error) { toast.error(error instanceof Error ? error.message : 'Failed to send invitation') } diff --git a/src/components/admin/jury/add-member-dialog.tsx b/src/components/admin/jury/add-member-dialog.tsx index 53a54b6..72152ab 100644 --- a/src/components/admin/jury/add-member-dialog.tsx +++ b/src/components/admin/jury/add-member-dialog.tsx @@ -88,6 +88,7 @@ export function AddMemberDialog({ juryGroupId, open, onOpenChange }: AddMemberDi const { mutate: sendInvitation } = trpc.user.sendInvitation.useMutation({ onSuccess: (result) => { toast.success(`Invitation sent to ${result.email}`) + utils.user.list.invalidate() }, onError: (err) => { // Don't block — user was created and added, just invitation failed diff --git a/src/components/admin/user-actions.tsx b/src/components/admin/user-actions.tsx index cc756a8..043fe26 100644 --- a/src/components/admin/user-actions.tsx +++ b/src/components/admin/user-actions.tsx @@ -250,6 +250,7 @@ export function UserMobileActions({ try { await sendInvitation.mutateAsync({ userId }) toast.success(`Invitation sent to ${userEmail}`) + utils.user.list.invalidate() } catch (error) { toast.error(error instanceof Error ? error.message : 'Failed to send invitation') } finally {