feat: wire feature flag checks into web Sidebar and upgrade mobile flag client

This commit is contained in:
saravanakumardb1 2026-03-21 20:34:16 -07:00
parent 5842ff1b22
commit 304d2ae865
2 changed files with 16 additions and 3 deletions

View File

@ -28,6 +28,11 @@ export const featureFlagClient = createFeatureFlagClient({
productId: PRODUCT_ID, productId: PRODUCT_ID,
platform: 'mobile', platform: 'mobile',
pollIntervalMs: 5 * 60 * 1000, pollIntervalMs: 5 * 60 * 1000,
getAccessToken,
storage: {
getItem: (key: string) => mmkvStorage.getItem(key),
setItem: (key: string, value: string) => mmkvStorage.setItem(key, value),
},
}); });
export const killSwitchClient = createKillSwitchClient({ export const killSwitchClient = createKillSwitchClient({
@ -75,6 +80,13 @@ export function isFeatureEnabled(key: string): boolean {
return featureFlagClient.isEnabled(key); return featureFlagClient.isEnabled(key);
} }
export function getFeatureValue<T = boolean | string | number | Record<string, unknown>>(
key: string,
defaultValue: T,
): T {
return featureFlagClient.getValue(key, defaultValue);
}
export async function checkKillSwitch(): Promise<{ disabled: boolean; message: string | null }> { export async function checkKillSwitch(): Promise<{ disabled: boolean; message: string | null }> {
return killSwitchClient.check(); return killSwitchClient.check();
} }

View File

@ -4,11 +4,12 @@ import Link from "next/link";
import { usePathname } from "next/navigation"; import { usePathname } from "next/navigation";
import { House, Search, Settings, Sparkles, FolderKanban, ShieldCheck } from "lucide-react"; import { House, Search, Settings, Sparkles, FolderKanban, ShieldCheck } from "lucide-react";
import { PRODUCT_NAME } from "@/lib/product-config"; import { PRODUCT_NAME } from "@/lib/product-config";
import { isFeatureEnabled } from "@/lib/feature-flags";
const navItems = [ const navItems: { href: string; label: string; icon: typeof House; flag?: string }[] = [
{ href: "/dashboard", label: "Dashboard", icon: House }, { href: "/dashboard", label: "Dashboard", icon: House },
{ href: "/workspaces", label: "Workspaces", icon: FolderKanban }, { href: "/workspaces", label: "Workspaces", icon: FolderKanban },
{ href: "/reviews", label: "Reviews", icon: ShieldCheck }, { href: "/reviews", label: "Reviews", icon: ShieldCheck, flag: "mcp_tools_enabled" },
{ href: "/search", label: "Search", icon: Search }, { href: "/search", label: "Search", icon: Search },
{ href: "/settings", label: "Settings", icon: Settings }, { href: "/settings", label: "Settings", icon: Settings },
]; ];
@ -33,7 +34,7 @@ export function Sidebar() {
</div> </div>
<nav aria-label="Primary navigation" style={{ display: "grid", gap: "var(--nl-space-2)" }}> <nav aria-label="Primary navigation" style={{ display: "grid", gap: "var(--nl-space-2)" }}>
{navItems.map((item) => { {navItems.filter((item) => !item.flag || isFeatureEnabled(item.flag)).map((item) => {
const Icon = item.icon; const Icon = item.icon;
const active = pathname === item.href || pathname.startsWith(`${item.href}/`); const active = pathname === item.href || pathname.startsWith(`${item.href}/`);
return ( return (