project-nomad/admin/inertia/hooks/useBenchmarkRerunBanner.ts
chriscrosstalk 0a2666a2da
feat(benchmark): dashboard re-run banner prompting a Score v2 re-run (#1096)
Shows a dismissible dashboard banner to users who submitted a benchmark under
v1 scoring but don't yet have a Score v2 result, nudging them to re-run so the
community leaderboard gets their v2 number.

- Show logic (benchmark_service.shouldShowRerunBanner): has a result with
  submitted_to_repository=true AND no result with nomad_score_v2 AND the
  dismiss KV isn't set. Self-clears two ways — dismiss sets the KV, and any v2
  run gives a result a nomad_score_v2 so the condition flips off on its own.
- New GET /api/benchmark/rerun-banner + useBenchmarkRerunBanner hook (mirrors
  useUpdateAvailable), rendered as a dismissible Alert on the dashboard with a
  "Re-run benchmark" CTA to /settings/benchmark.
- New KV key benchmark.rerunBannerDismissed (boolean) in both KV_STORE_SCHEMA
  and the SETTINGS_KEYS whitelist (the PATCH /system/settings validator enum);
  dismiss writes it via the existing updateSetting endpoint + invalidates the
  query.

Sibling to the Score v2 app client (#1094); stacked on it for the
nomad_score_v2 column. Browser-verified on the NOMAD3 dev env: show/dismiss/
reload-persist/self-clear-on-v2 all correct.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 03:38:31 +00:00

16 lines
513 B
TypeScript

import api from "~/lib/api"
import { useQuery } from "@tanstack/react-query"
export const BENCHMARK_RERUN_BANNER_QUERY_KEY = ['benchmark-rerun-banner']
export const useBenchmarkRerunBanner = () => {
const queryData = useQuery<{ show: boolean } | undefined>({
queryKey: BENCHMARK_RERUN_BANNER_QUERY_KEY,
queryFn: () => api.checkBenchmarkRerunBanner(),
refetchInterval: Infinity, // Disable automatic refetching
refetchOnWindowFocus: false,
})
return queryData.data
}