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 <noreply@anthropic.com>
This commit is contained in:
Matt 2026-02-16 16:16:23 +01:00
parent 5965f7889d
commit 3fb0d128a1
3 changed files with 6 additions and 0 deletions

View File

@ -58,6 +58,7 @@ import {
export default function MemberDetailPage() { export default function MemberDetailPage() {
const params = useParams() const params = useParams()
const router = useRouter() const router = useRouter()
const utils = trpc.useUtils()
const userId = params.id as string const userId = params.id as string
const { data: user, isLoading, error, refetch } = trpc.user.get.useQuery({ id: userId }) const { data: user, isLoading, error, refetch } = trpc.user.get.useQuery({ id: userId })
@ -103,6 +104,8 @@ export default function MemberDetailPage() {
expertiseTags, expertiseTags,
maxAssignments: maxAssignments ? parseInt(maxAssignments) : null, maxAssignments: maxAssignments ? parseInt(maxAssignments) : null,
}) })
utils.user.get.invalidate({ id: userId })
utils.user.list.invalidate()
toast.success('Member updated successfully') toast.success('Member updated successfully')
router.push('/admin/members') router.push('/admin/members')
} catch (error) { } catch (error) {
@ -115,6 +118,7 @@ export default function MemberDetailPage() {
await sendInvitation.mutateAsync({ userId }) await sendInvitation.mutateAsync({ userId })
toast.success('Invitation email sent successfully') toast.success('Invitation email sent successfully')
refetch() refetch()
utils.user.list.invalidate()
} catch (error) { } catch (error) {
toast.error(error instanceof Error ? error.message : 'Failed to send invitation') toast.error(error instanceof Error ? error.message : 'Failed to send invitation')
} }

View File

@ -88,6 +88,7 @@ export function AddMemberDialog({ juryGroupId, open, onOpenChange }: AddMemberDi
const { mutate: sendInvitation } = trpc.user.sendInvitation.useMutation({ const { mutate: sendInvitation } = trpc.user.sendInvitation.useMutation({
onSuccess: (result) => { onSuccess: (result) => {
toast.success(`Invitation sent to ${result.email}`) toast.success(`Invitation sent to ${result.email}`)
utils.user.list.invalidate()
}, },
onError: (err) => { onError: (err) => {
// Don't block — user was created and added, just invitation failed // Don't block — user was created and added, just invitation failed

View File

@ -250,6 +250,7 @@ export function UserMobileActions({
try { try {
await sendInvitation.mutateAsync({ userId }) await sendInvitation.mutateAsync({ userId })
toast.success(`Invitation sent to ${userEmail}`) toast.success(`Invitation sent to ${userEmail}`)
utils.user.list.invalidate()
} catch (error) { } catch (error) {
toast.error(error instanceof Error ? error.message : 'Failed to send invitation') toast.error(error instanceof Error ? error.message : 'Failed to send invitation')
} finally { } finally {