import { useCallback, useEffect, useState } from "react" import { RefreshCw, RotateCcw } from "lucide-react" import { useArcadiaClient } from "@crema/arcadia-core-client" import { useToast } from "@crema/notification-ui" import { BadgeCell } from "@crema/table-ui" import { EmptyState } from "@crema/feedback-ui" import type { TenantTabProps } from "~/routes/tenants.$id" import { DataState } from "~/components/data-state" import { errorMessage } from "~/lib/errors" import { Button } from "~/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card" import { Switch } from "~/components/ui/switch" import { clearFeatureFlag, listFeatureFlags, setFeatureFlag, type TenantFeatureFlag, } from "~/lib/arcadia/tenants" /** * Per-tenant feature-flag overrides. The list is every platform-defined flag * with this tenant's effective value; a flag is either inherited from the * platform default ("default") or pinned for this tenant ("override"). Toggling * a row pins it; "Revert" drops the override so it follows the default again. * You can't add arbitrary keys here — a flag has to exist at the platform level * before a tenant can override it. */ export function FeatureFlagsTab({ tenant }: TenantTabProps) { const arcadia = useArcadiaClient() const toast = useToast() const [flags, setFlags] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [busy, setBusy] = useState(null) const load = useCallback(async () => { setError(null) setLoading(true) try { setFlags(await listFeatureFlags(arcadia, tenant.id)) } catch (err) { setError(err) } finally { setLoading(false) } }, [arcadia, tenant.id]) useEffect(() => { load() }, [load]) const toggle = async (flag: TenantFeatureFlag, next: boolean) => { setBusy(flag.key) // Optimistic: reflect the pin immediately, roll back on failure. setFlags((prev) => prev.map((f) => (f.key === flag.key ? { ...f, enabled: next, source: "override" } : f)), ) try { await setFeatureFlag(arcadia, tenant.id, flag.key, next) toast.success(`${next ? "Enabled" : "Disabled"} ${flag.key} for ${tenant.name}`) await load() } catch (err) { setFlags((prev) => prev.map((f) => (f.key === flag.key ? flag : f))) toast.error(errorMessage(err, `override ${flag.key}`)) } finally { setBusy(null) } } const revert = async (flag: TenantFeatureFlag) => { setBusy(flag.key) try { await clearFeatureFlag(arcadia, tenant.id, flag.key) toast.success(`${flag.key} follows the platform default again`) await load() } catch (err) { toast.error(errorMessage(err, `revert ${flag.key}`)) } finally { setBusy(null) } } return (
Feature flags Override a platform flag for this tenant. Un-overridden flags follow the platform default.
} >
    {flags.map((flag) => (
  • {flag.key}
    {flag.description ? (

    {flag.description}

    ) : null}
    {flag.source === "override" ? ( ) : null} toggle(flag, v)} disabled={busy === flag.key} data-action={`tenant-detail-flags-toggle-${flag.key}`} aria-label={`Override ${flag.key}`} />
  • ))}
) }