From 97ff695ac9816454f6f66ea1a35736cf9555c23d Mon Sep 17 00:00:00 2001 From: Ignacio Dobronich Date: Tue, 23 Jun 2026 18:14:27 -0300 Subject: [PATCH] fix: invalidate permissions cache on org invite acceptance (#47247) - Add `invalidatePermissionsQuery` helper to `permissions-query.ts` - Invalidate it alongside organizations and projects in `useOrganizationAcceptInvitationMutation`'s `onSuccess`, so permissions are refetched before the redirect to the org. ## Testing 1. Invite a user to an org. 2. Accept the invite via the invite link. 3. Navigate to the org's Billing page. 4. Verify the Subscription and Cost Control sections load without "you need additional permissions" errors (no manual reload needed). ## Summary by CodeRabbit * **Bug Fixes** * Fixed an issue where user permissions were not properly synchronized after accepting organization invitations. --- .../organization-invitation-accept-mutation.ts | 8 ++++++-- apps/studio/data/permissions/permissions-query.ts | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/studio/data/organization-members/organization-invitation-accept-mutation.ts b/apps/studio/data/organization-members/organization-invitation-accept-mutation.ts index c15e19deea5..ccd70b2cd29 100644 --- a/apps/studio/data/organization-members/organization-invitation-accept-mutation.ts +++ b/apps/studio/data/organization-members/organization-invitation-accept-mutation.ts @@ -3,6 +3,7 @@ import { toast } from 'sonner' import { handleError, post } from '@/data/fetchers' import { invalidateOrganizationsQuery } from '@/data/organizations/organizations-query' +import { invalidatePermissionsQuery } from '@/data/permissions/permissions-query' import { useInvalidateProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' import type { ResponseError, UseCustomMutationOptions } from '@/types' @@ -47,8 +48,11 @@ export const useOrganizationAcceptInvitationMutation = ({ >({ mutationFn: (vars) => acceptOrganizationInvitation(vars), async onSuccess(data, variables, context) { - await invalidateOrganizationsQuery(queryClient) - await invalidateProjectsQuery() + await Promise.all([ + invalidateOrganizationsQuery(queryClient), + invalidateProjectsQuery(), + invalidatePermissionsQuery(queryClient), + ]) await onSuccess?.(data, variables, context) }, async onError(data, variables, context) { diff --git a/apps/studio/data/permissions/permissions-query.ts b/apps/studio/data/permissions/permissions-query.ts index 8102973331f..29805386523 100644 --- a/apps/studio/data/permissions/permissions-query.ts +++ b/apps/studio/data/permissions/permissions-query.ts @@ -1,4 +1,4 @@ -import { useQuery } from '@tanstack/react-query' +import { useQuery, type QueryClient } from '@tanstack/react-query' import { useIsLoggedIn } from 'common' import { permissionKeys } from './keys' @@ -44,3 +44,7 @@ export const usePermissionsQuery = ({ staleTime: 5 * 60 * 1000, }) } + +export function invalidatePermissionsQuery(client: QueryClient) { + return client.invalidateQueries({ queryKey: permissionKeys.list() }) +}