diff --git a/apps/portal/composables/useFeatureFlag.ts b/apps/portal/composables/useFeatureFlag.ts new file mode 100644 index 0000000..248b010 --- /dev/null +++ b/apps/portal/composables/useFeatureFlag.ts @@ -0,0 +1,75 @@ +// Client-side feature-flag helper. One bulk eval per session, shared across +// every component via module-level state. Hits POST /api/flags/evaluate — +// the portal-side proxy derives the tenant from the signed-in user's JWT +// so callers don't pass a slug. +// +// Usage: +// const enabled = useFeatureFlag('new_inbox_view') +// +// +// Multi-key: +// const { flags, ready, refresh } = useFeatureFlags() +// ready → ref true once the first eval has resolved +// flags → ref<{ key: boolean }> +// refresh() → re-fetch (e.g. after an admin flipped a flag while the user is +// online; rare, mostly useful in long-lived sessions) +// +// The composable is intentionally NOT a Promise-returning function. It +// returns refs that update once the bulk eval lands; consumers can +// `