"use client"; import { useMemo, useState } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Search, MoreHorizontal } from "lucide-react"; import { Button } from "@/components/ui/button"; import { useRouter } from "next/navigation"; import { useEnv } from "@/components/env-provider"; export default function FeatureFlagsPage() { const router = useRouter(); const [searchQuery, setSearchQuery] = useState(""); const { state } = useEnv(); const backendFlag = useMemo(() => { const lastObs = state?.history?.[state.history.length - 1]?.observation; if (!lastObs) return null; return { id: lastObs.feature_name, name: lastObs.feature_name.replace(/_/g, " "), rollout: lastObs.current_rollout_percentage, status: !(state?.is_done ?? false), scenario: state?.scenario_name ?? "unknown", difficulty: state?.difficulty ?? "unknown", lastUpdated: `Step ${state?.step_count ?? 0}`, }; }, [state]); const filtered = useMemo(() => { if (!backendFlag) return []; const q = searchQuery.trim().toLowerCase(); if (!q) return [backendFlag]; if (backendFlag.id.toLowerCase().includes(q) || backendFlag.name.toLowerCase().includes(q)) { return [backendFlag]; } return []; }, [backendFlag, searchQuery]); return (

Control

The UI reflects only what the backend supports.

setSearchQuery(e.target.value)} />
{filtered.map((flag) => ( router.push(`/flags/${flag.id}`)} >

{flag.name}

{flag.status ? "Active" : "Done"} {flag.rollout}% Rollout

Scenario: {flag.scenario} ({flag.difficulty})

{flag.lastUpdated} Last updated
))} {!backendFlag ? ( No active simulation found yet. Start the backend and open the Dashboard to initialize state. ) : null}
); }