From 7cefbbbfa1ef05c82e48382e347d36c3b8e31118 Mon Sep 17 00:00:00 2001 From: Croissant Le Doux Date: Fri, 17 Jul 2026 00:56:58 -0400 Subject: [PATCH] =?UTF-8?q?feat(review):=20approved/rejected=20queue=20vie?= =?UTF-8?q?ws=20=E2=80=94=20approve=20now=20produces=20a=20working=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit serverListPendingReviewMatches gains a status param; queue gains Pending/Approved/Rejected tabs composed with the source filter. Approve was already durable (review fields survive nightly re-scoring) but approved matches vanished from the UI — now they're the working list for manual contact pulls and sends. Co-Authored-By: Claude Fable 5 --- apps/outreach-review/app/routes/_index.tsx | 38 +++++++++++++++++-- .../list-pending-review-matches.server.ts | 9 +++-- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/apps/outreach-review/app/routes/_index.tsx b/apps/outreach-review/app/routes/_index.tsx index 8019290..70b5dec 100644 --- a/apps/outreach-review/app/routes/_index.tsx +++ b/apps/outreach-review/app/routes/_index.tsx @@ -13,8 +13,13 @@ export async function loader({ request }: Route.LoaderArgs) { const url = new URL(request.url); const source = url.searchParams.get('source') ?? undefined; - const matches = await serverListPendingReviewMatches(db, { source }); - return { matches, source: source ?? null }; + const statusParam = url.searchParams.get('status'); + const status = + statusParam === 'approved' || statusParam === 'rejected' + ? statusParam + : 'pending'; + const matches = await serverListPendingReviewMatches(db, { source, status }); + return { matches, source: source ?? null, status }; } export async function action({ request }: Route.ActionArgs) { @@ -39,11 +44,21 @@ export async function action({ request }: Route.ActionArgs) { export default function ReviewQueue({ loaderData }: Route.ComponentProps) { const matches = loaderData?.matches ?? []; const activeSource = loaderData?.source ?? null; + const activeStatus = loaderData?.status ?? 'pending'; + const withParams = (overrides: Record) => { + const params = new URLSearchParams(); + const merged = { source: activeSource, status: activeStatus, ...overrides }; + if (merged.source != null) params.set('source', merged.source); + if (merged.status != null && merged.status !== 'pending') + params.set('status', merged.status); + const qs = params.toString(); + return qs === '' ? '/' : `/?${qs}`; + }; return (

Grant Match Review Queue

-