diff --git a/apps/web-evals/src/app/runs/[id]/run.tsx b/apps/web-evals/src/app/runs/[id]/run.tsx index 0b1f9250e1..cfbe4ba5f0 100644 --- a/apps/web-evals/src/app/runs/[id]/run.tsx +++ b/apps/web-evals/src/app/runs/[id]/run.tsx @@ -9,6 +9,7 @@ import type { Run, TaskMetrics as _TaskMetrics, Task } from "@roo-code/evals" import type { ToolName } from "@roo-code/types" import { formatCurrency, formatDuration, formatTokens, formatToolUsageSuccessRate } from "@/lib/formatters" +import { deserializeBoolean } from "@/lib/storage" import { useRunStatus } from "@/hooks/use-run-status" import { killRun } from "@/actions/runs" import { @@ -255,18 +256,6 @@ export function Run({ run }: { run: Run }) { const [showKillDialog, setShowKillDialog] = useState(false) const [isKilling, setIsKilling] = useState(false) - function deserializeBoolean(value: string): boolean { - // Support both raw-string storage and default `useLocalStorage` JSON serialization. - if (value === "true") return true - if (value === "false") return false - try { - const parsed: unknown = JSON.parse(value) - return typeof parsed === "boolean" ? parsed : false - } catch { - return false - } - } - const [groupByStatus, setGroupByStatus] = useLocalStorage("evals-group-by-status", false, { serializer: (value: boolean) => String(value), deserializer: deserializeBoolean, diff --git a/apps/web-evals/src/app/runs/new/new-run.tsx b/apps/web-evals/src/app/runs/new/new-run.tsx index aaff8cdcd5..55bcd81d11 100644 --- a/apps/web-evals/src/app/runs/new/new-run.tsx +++ b/apps/web-evals/src/app/runs/new/new-run.tsx @@ -48,7 +48,7 @@ import { ITERATIONS_DEFAULT, } from "@/lib/schemas" import { cn } from "@/lib/utils" -import { deserializeNumber, deserializeString, deserializeStringArray } from "@/lib/storage" +import { deserializeEnum, deserializeNumber, deserializeStringArray } from "@/lib/storage" import { loadRooLastModelSelection, saveRooLastModelSelection } from "@/lib/roo-last-model-selection" import { normalizeCreateRunForSubmit } from "@/lib/normalize-create-run" @@ -106,6 +106,8 @@ type ConfigSelection = { popoverOpen: boolean } +const SUITE_VALUES: ReadonlySet<"full" | "partial"> = new Set(["full", "partial"]) + export function NewRun() { const router = useRouter() const modelSelectionsByProviderRef = useRef>({}) @@ -143,7 +145,7 @@ export function NewRun() { }) const [savedSuite, setSavedSuite] = useLocalStorage<"full" | "partial">("evals-suite", "full", { serializer: (value: "full" | "partial") => value, - deserializer: (raw: string) => (deserializeString(raw) === "partial" ? "partial" : "full"), + deserializer: (raw: string) => deserializeEnum(raw, SUITE_VALUES, "full"), initializeWithValue: false, }) const [savedExercises, setSavedExercises] = useLocalStorage("evals-exercises", [], { diff --git a/apps/web-evals/src/types/usehooks-ts.d.ts b/apps/web-evals/src/types/usehooks-ts.d.ts deleted file mode 100644 index 9fa0c8fe9d..0000000000 --- a/apps/web-evals/src/types/usehooks-ts.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare module "usehooks-ts" { - import type { Dispatch, SetStateAction } from "react" - - export type UseLocalStorageOptions = { - serializer?: (value: T) => string - deserializer?: (value: string) => T - initializeWithValue?: boolean - } - - export function useLocalStorage( - key: string, - initialValue: T | (() => T), - options?: UseLocalStorageOptions, - ): [T, Dispatch>, () => void] -}