From cde49d5b64939415334609feb1f098a8b3645e54 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Fri, 5 Dec 2025 18:40:11 -0800 Subject: [PATCH] refresh feature flags on auth or subscription state change (#7197) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds watch on auth state that refreshes remote config. In future PR, the remote config system and feature flags should be consolidated and moved out of ComfyApi. Currently, we need feature flags before GraphView mounts, but also need to add auth headers after auth, which necessitates these parallel systems temporarily ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-7197-refresh-feature-flags-on-auth-or-subscription-state-change-2c06d73d3650810a906ad36a60c86600) by [Unito](https://www.unito.io) --- src/extensions/core/cloudRemoteConfig.ts | 17 ++++++++++++++ .../remoteConfig/refreshRemoteConfig.ts | 23 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/platform/remoteConfig/refreshRemoteConfig.ts diff --git a/src/extensions/core/cloudRemoteConfig.ts b/src/extensions/core/cloudRemoteConfig.ts index 8716269fb..0628800d8 100644 --- a/src/extensions/core/cloudRemoteConfig.ts +++ b/src/extensions/core/cloudRemoteConfig.ts @@ -1,4 +1,9 @@ +import { watchDebounced } from '@vueuse/core' + +import { useCurrentUser } from '@/composables/auth/useCurrentUser' +import { useSubscription } from '@/platform/cloud/subscription/composables/useSubscription' import { loadRemoteConfig } from '@/platform/remoteConfig/remoteConfig' +import { refreshRemoteConfig } from '@/platform/remoteConfig/refreshRemoteConfig' import { useExtensionService } from '@/services/extensionService' /** @@ -9,6 +14,18 @@ useExtensionService().registerExtension({ name: 'Comfy.Cloud.RemoteConfig', setup: async () => { + const { isLoggedIn } = useCurrentUser() + const { isActiveSubscription } = useSubscription() + + watchDebounced( + [isLoggedIn, isActiveSubscription], + () => { + if (!isLoggedIn.value) return + void refreshRemoteConfig() + }, + { debounce: 256, immediate: true } + ) + // Poll for config updates every 10 minutes setInterval(() => void loadRemoteConfig(), 600_000) } diff --git a/src/platform/remoteConfig/refreshRemoteConfig.ts b/src/platform/remoteConfig/refreshRemoteConfig.ts new file mode 100644 index 000000000..5000f2014 --- /dev/null +++ b/src/platform/remoteConfig/refreshRemoteConfig.ts @@ -0,0 +1,23 @@ +import { api } from '@/scripts/api' + +import { remoteConfig } from './remoteConfig' + +export async function refreshRemoteConfig(): Promise { + try { + const response = await api.fetchApi('/features', { cache: 'no-store' }) + if (response.ok) { + const config = await response.json() + window.__CONFIG__ = config + remoteConfig.value = config + return + } + + console.warn('Failed to load remote config:', response.statusText) + if (response.status === 401 || response.status === 403) { + window.__CONFIG__ = {} + remoteConfig.value = {} + } + } catch (error) { + console.error('Failed to fetch remote config:', error) + } +}