From 0089241a534072c41b89d566d39e02b321949a33 Mon Sep 17 00:00:00 2001 From: Will Freeman Date: Sat, 25 Oct 2025 14:33:09 -0600 Subject: [PATCH] enable feature flags for app, add docs --- webapp/src/composables/useFeatureFlags.ts | 71 +++++++++++++++++++++++ webapp/src/views/DeflockApp.vue | 34 ++++++++++- webapp/src/views/ReportChoose.vue | 23 ++++++-- 3 files changed, 119 insertions(+), 9 deletions(-) create mode 100644 webapp/src/composables/useFeatureFlags.ts diff --git a/webapp/src/composables/useFeatureFlags.ts b/webapp/src/composables/useFeatureFlags.ts new file mode 100644 index 0000000..9d52e34 --- /dev/null +++ b/webapp/src/composables/useFeatureFlags.ts @@ -0,0 +1,71 @@ +import { ref, readonly } from 'vue'; + +interface FeatureFlags { + iosApp: { + enabled: boolean; + appUrl: string; + }; +} + +const flags = ref(null); +const isLoading = ref(false); +const error = ref(null); + +let fetchPromise: Promise | null = null; + +async function fetchFeatureFlags(): Promise { + if (flags.value !== null) { + // Already loaded + return; + } + + if (fetchPromise) { + // Already fetching, wait for the existing promise + return fetchPromise; + } + + fetchPromise = (async () => { + try { + isLoading.value = true; + error.value = null; + + const response = await fetch('https://cdn.deflock.me/config/flags.json'); + + if (!response.ok) { + throw new Error(`Failed to fetch feature flags: ${response.status}`); + } + + const data = await response.json(); + flags.value = data; + } catch (err) { + error.value = err instanceof Error ? err.message : 'Unknown error'; + console.warn('Failed to load feature flags, using defaults:', error.value); + + // Fallback to default values + flags.value = { + iosApp: { + enabled: false, + appUrl: '' + } + }; + } finally { + isLoading.value = false; + } + })(); + + return fetchPromise; +} + +export function useFeatureFlags() { + // Auto-fetch on first use + if (!fetchPromise) { + fetchFeatureFlags(); + } + + return { + flags: readonly(flags), + isLoading: readonly(isLoading), + error: readonly(error), + refresh: fetchFeatureFlags + }; +} \ No newline at end of file diff --git a/webapp/src/views/DeflockApp.vue b/webapp/src/views/DeflockApp.vue index d9005f3..e57c530 100644 --- a/webapp/src/views/DeflockApp.vue +++ b/webapp/src/views/DeflockApp.vue @@ -40,6 +40,20 @@ Get on Android Android Coming Soon + + + + View Mobile App Guide + + @@ -217,8 +231,11 @@