From b51a0b0847a9b35d257aa2172e87a4cbc357bd85 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Fri, 30 Jan 2026 15:43:00 +0100 Subject: [PATCH] fix: cache already-enabled feature opt-in status in local storage (#27393) When the eligibility check returns "already_enabled", store this in local storage to prevent repeated API calls on subsequent page loads. Co-authored-by: Claude Opus 4.5 --- .../feature-opt-in/hooks/useFeatureOptInBanner.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/web/modules/feature-opt-in/hooks/useFeatureOptInBanner.ts b/apps/web/modules/feature-opt-in/hooks/useFeatureOptInBanner.ts index 1e9050bed2..39a6b8d913 100644 --- a/apps/web/modules/feature-opt-in/hooks/useFeatureOptInBanner.ts +++ b/apps/web/modules/feature-opt-in/hooks/useFeatureOptInBanner.ts @@ -3,8 +3,7 @@ import type { OptInFeatureConfig } from "@calcom/features/feature-opt-in/config"; import { getOptInFeatureConfig, shouldDisplayFeatureAt } from "@calcom/features/feature-opt-in/config"; import { trpc } from "@calcom/trpc/react"; -import { useCallback, useMemo, useState } from "react"; - +import { useCallback, useEffect, useMemo, useState } from "react"; import { getFeatureOptInTimestamp, isFeatureDismissed, @@ -65,6 +64,15 @@ function useFeatureOptInBanner(featureId: string): UseFeatureOptInBannerResult { } ); + // When the server reports the feature is already enabled, cache it locally + // to avoid repeated API calls on subsequent page loads + useEffect(() => { + if (eligibilityQuery.data?.status === "already_enabled") { + setFeatureOptedIn(featureId); + setIsOptedIn(true); + } + }, [eligibilityQuery.data?.status, featureId]); + const setUserStateMutation = trpc.viewer.featureOptIn.setUserState.useMutation(); const setTeamStateMutation = trpc.viewer.featureOptIn.setTeamState.useMutation(); const setOrganizationStateMutation = trpc.viewer.featureOptIn.setOrganizationState.useMutation();