Skip to content

Commit 61a7b37

Browse files
committed
plan upgrade to refresh session
1 parent ed197d8 commit 61a7b37

File tree

5 files changed

+73
-21
lines changed

5 files changed

+73
-21
lines changed

apps/sim/app/_shell/providers/session-provider.tsx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import type React from 'react'
44
import { createContext, useCallback, useEffect, useMemo, useState } from 'react'
5+
import { useQueryClient } from '@tanstack/react-query'
56
import posthog from 'posthog-js'
67
import { client } from '@/lib/auth/auth-client'
78

@@ -35,12 +36,15 @@ export function SessionProvider({ children }: { children: React.ReactNode }) {
3536
const [data, setData] = useState<AppSession>(null)
3637
const [isPending, setIsPending] = useState(true)
3738
const [error, setError] = useState<Error | null>(null)
39+
const queryClient = useQueryClient()
3840

39-
const loadSession = useCallback(async () => {
41+
const loadSession = useCallback(async (bypassCache = false) => {
4042
try {
4143
setIsPending(true)
4244
setError(null)
43-
const res = await client.getSession()
45+
const res = bypassCache
46+
? await client.getSession({ query: { disableCookieCache: true } })
47+
: await client.getSession()
4448
setData(res?.data ?? null)
4549
} catch (e) {
4650
setError(e instanceof Error ? e : new Error('Failed to fetch session'))
@@ -50,8 +54,25 @@ export function SessionProvider({ children }: { children: React.ReactNode }) {
5054
}, [])
5155

5256
useEffect(() => {
53-
loadSession()
54-
}, [loadSession])
57+
// Check if user was redirected after plan upgrade
58+
const params = new URLSearchParams(window.location.search)
59+
const wasUpgraded = params.get('upgraded') === 'true'
60+
61+
if (wasUpgraded) {
62+
params.delete('upgraded')
63+
const newUrl = params.toString()
64+
? `${window.location.pathname}?${params.toString()}`
65+
: window.location.pathname
66+
window.history.replaceState({}, '', newUrl)
67+
}
68+
69+
loadSession(wasUpgraded).then(() => {
70+
if (wasUpgraded) {
71+
queryClient.invalidateQueries({ queryKey: ['organizations'] })
72+
queryClient.invalidateQueries({ queryKey: ['subscription'] })
73+
}
74+
})
75+
}, [loadSession, queryClient])
5576

5677
useEffect(() => {
5778
if (isPending || typeof posthog.identify !== 'function') {

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Skeleton } from '@/components/ui'
88
import { useSession } from '@/lib/auth/auth-client'
99
import { useSubscriptionUpgrade } from '@/lib/billing/client/upgrade'
1010
import { USAGE_THRESHOLDS } from '@/lib/billing/client/usage-visualization'
11+
import { getEffectiveSeats } from '@/lib/billing/subscriptions/utils'
1112
import { cn } from '@/lib/core/utils/cn'
1213
import { getBaseUrl } from '@/lib/core/utils/urls'
1314
import { getUserRole } from '@/lib/workspaces/organization/utils'
@@ -191,7 +192,13 @@ export function Subscription() {
191192
const [upgradeError, setUpgradeError] = useState<'pro' | 'team' | null>(null)
192193
const usageLimitRef = useRef<UsageLimitRef | null>(null)
193194

194-
const isLoading = isSubscriptionLoading || isUsageLimitLoading || isWorkspaceLoading
195+
const isOrgPlan =
196+
subscriptionData?.data?.plan === 'team' || subscriptionData?.data?.plan === 'enterprise'
197+
const isLoading =
198+
isSubscriptionLoading ||
199+
isUsageLimitLoading ||
200+
isWorkspaceLoading ||
201+
(isOrgPlan && isOrgBillingLoading)
195202

196203
const subscription = {
197204
isFree: subscriptionData?.data?.plan === 'free' || !subscriptionData?.data?.plan,
@@ -204,7 +211,7 @@ export function Subscription() {
204211
subscriptionData?.data?.status === 'active',
205212
plan: subscriptionData?.data?.plan || 'free',
206213
status: subscriptionData?.data?.status || 'inactive',
207-
seats: organizationBillingData?.totalSeats ?? 0,
214+
seats: getEffectiveSeats(subscriptionData?.data),
208215
}
209216

210217
const usage = {
@@ -445,16 +452,10 @@ export function Subscription() {
445452
? `${subscription.seats} seats`
446453
: undefined
447454
}
448-
current={
449-
subscription.isEnterprise || subscription.isTeam
450-
? (organizationBillingData?.totalCurrentUsage ?? usage.current)
451-
: usage.current
452-
}
455+
current={usage.current}
453456
limit={
454457
subscription.isEnterprise || subscription.isTeam
455-
? organizationBillingData?.totalUsageLimit ||
456-
organizationBillingData?.minimumBillingAmount ||
457-
usage.limit
458+
? organizationBillingData?.data?.totalUsageLimit
458459
: !subscription.isFree &&
459460
(permissions.canEditUsageLimit || permissions.showTeamMemberView)
460461
? usage.current // placeholder; rightContent will render UsageLimit
@@ -468,19 +469,31 @@ export function Subscription() {
468469
<UsageLimit
469470
ref={usageLimitRef}
470471
currentLimit={
471-
subscription.isTeam && isTeamAdmin
472-
? organizationBillingData?.totalUsageLimit || usage.limit
472+
(subscription.isTeam || subscription.isEnterprise) &&
473+
isTeamAdmin &&
474+
organizationBillingData?.data
475+
? organizationBillingData.data.totalUsageLimit
473476
: usageLimitData.currentLimit || usage.limit
474477
}
475478
currentUsage={usage.current}
476479
canEdit={permissions.canEditUsageLimit}
477480
minimumLimit={
478-
subscription.isTeam && isTeamAdmin
479-
? organizationBillingData?.minimumBillingAmount || (subscription.isPro ? 20 : 40)
481+
(subscription.isTeam || subscription.isEnterprise) &&
482+
isTeamAdmin &&
483+
organizationBillingData?.data
484+
? organizationBillingData.data.minimumBillingAmount
480485
: usageLimitData.minimumLimit || (subscription.isPro ? 20 : 40)
481486
}
482-
context={subscription.isTeam && isTeamAdmin ? 'organization' : 'user'}
483-
organizationId={subscription.isTeam && isTeamAdmin ? activeOrgId : undefined}
487+
context={
488+
(subscription.isTeam || subscription.isEnterprise) && isTeamAdmin
489+
? 'organization'
490+
: 'user'
491+
}
492+
organizationId={
493+
(subscription.isTeam || subscription.isEnterprise) && isTeamAdmin
494+
? activeOrgId
495+
: undefined
496+
}
484497
onLimitUpdated={() => {
485498
logger.info('Usage limit updated')
486499
}}

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/settings-modal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ export function SettingsModal({ open, onOpenChange }: SettingsModalProps) {
174174

175175
const userEmail = session?.user?.email
176176
const userId = session?.user?.id
177+
177178
const userRole = getUserRole(activeOrganization, userEmail)
178179
const isOwner = userRole === 'owner'
179180
const isAdmin = userRole === 'admin'

apps/sim/hooks/queries/organization.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,22 @@ export function useOrganizations() {
4747
})
4848
}
4949

50+
/**
51+
* Fetch organizations where user is owner/admin directly from DB
52+
* This bypasses session's activeOrganizationId for reliable role checking
53+
*/
54+
export function useUserOwnedOrganizations() {
55+
return useQuery({
56+
queryKey: ['user-owned-organizations'],
57+
queryFn: async () => {
58+
const res = await fetch('/api/organizations')
59+
if (!res.ok) return { organizations: [] }
60+
return res.json()
61+
},
62+
staleTime: 0, // Always refetch to ensure fresh org membership data
63+
})
64+
}
65+
5066
/**
5167
* Fetch a specific organization by ID
5268
*/

apps/sim/lib/billing/client/upgrade.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,13 @@ export function useSubscriptionUpgrade() {
8181
}
8282

8383
const currentUrl = `${window.location.origin}${window.location.pathname}`
84+
const successUrl = `${currentUrl}?upgraded=true`
8485

8586
try {
8687
const upgradeParams = {
8788
plan: targetPlan,
8889
referenceId,
89-
successUrl: currentUrl,
90+
successUrl,
9091
cancelUrl: currentUrl,
9192
...(targetPlan === 'team' && { seats: CONSTANTS.INITIAL_TEAM_SEATS }),
9293
} as const

0 commit comments

Comments
 (0)