feat: add featureFlags to authStore, fetched in fetchUser

Loads resolved feature flags from /auth/me/feature-flags alongside
user, account, and subscription data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chihlasm
2026-04-02 15:20:38 +00:00
parent 6117a83b0b
commit b7e5979d0c

View File

@@ -12,6 +12,7 @@ interface AuthState {
token: Token | null
account: Account | null
subscription: SubscriptionDetails | null
featureFlags: Record<string, boolean>
isAuthenticated: boolean
isLoading: boolean
error: string | null
@@ -33,6 +34,7 @@ export const useAuthStore = create<AuthState>()(
token: null,
account: null,
subscription: null,
featureFlags: {},
isAuthenticated: false,
isLoading: false,
error: null,
@@ -87,22 +89,24 @@ export const useAuthStore = create<AuthState>()(
clearCachedQuota()
Sentry.setUser(null)
resetAnalytics()
set({ user: null, token: null, account: null, subscription: null, isAuthenticated: false, error: null })
set({ user: null, token: null, account: null, subscription: null, featureFlags: {}, isAuthenticated: false, error: null })
}
},
fetchUser: async () => {
set({ isLoading: true })
try {
const [userResult, accountResult, subscriptionResult] = await Promise.allSettled([
const [userResult, accountResult, subscriptionResult, flagsResult] = await Promise.allSettled([
authApi.me(),
apiClient.get<Account>('/accounts/me').then(r => r.data),
apiClient.get<SubscriptionDetails>('/accounts/me/subscription').then(r => r.data),
apiClient.get<Record<string, boolean>>('/auth/me/feature-flags').then(r => r.data),
])
const user = userResult.status === 'fulfilled' ? userResult.value : null
const account = accountResult.status === 'fulfilled' ? accountResult.value : null
const subscription = subscriptionResult.status === 'fulfilled' ? subscriptionResult.value : null
const featureFlags = flagsResult.status === 'fulfilled' ? flagsResult.value : {}
if (!user) {
// User fetch failed — propagate the error
@@ -116,7 +120,7 @@ export const useAuthStore = create<AuthState>()(
// Identify user in PostHog for product analytics
identifyUser({ id: user.id, email: user.email, role: user.role, is_super_admin: user.is_super_admin, account_id: account?.id })
set({ user, account, subscription, isLoading: false })
set({ user, account, subscription, featureFlags, isLoading: false })
} catch (error: unknown) {
const message = error instanceof Error ? error.message : 'Failed to fetch user'
set({ error: message, isLoading: false })
@@ -135,6 +139,7 @@ export const useAuthStore = create<AuthState>()(
isAuthenticated: state.isAuthenticated,
account: state.account,
subscription: state.subscription,
featureFlags: state.featureFlags,
}),
}
)