diff --git a/src/components/admin/round/ranking-dashboard.tsx b/src/components/admin/round/ranking-dashboard.tsx index 825bb9f..58893e3 100644 --- a/src/components/admin/round/ranking-dashboard.tsx +++ b/src/components/admin/round/ranking-dashboard.tsx @@ -406,15 +406,28 @@ export function RankingDashboard({ competitionId: _competitionId, roundId }: Ran if (!initialized.current && snapshot) { const startup = (snapshot.startupRankingJson ?? []) as unknown as RankedProjectEntry[] const concept = (snapshot.conceptRankingJson ?? []) as unknown as RankedProjectEntry[] - setLocalOrder({ - STARTUP: startup.map((r) => r.projectId), - BUSINESS_CONCEPT: concept.map((r) => r.projectId), - }) - // Track original order for override detection (same effect = always in sync) + + // Track original AI order for override detection (same effect = always in sync) const order: Record = {} startup.forEach((r, i) => { order[r.projectId] = i + 1 }) concept.forEach((r, i) => { order[r.projectId] = i + 1 }) setSnapshotOrder(order) + + // Apply saved reorders so the ranking persists across all admin sessions. + // reordersJson is append-only — the latest event per category is the current order. + const reorders = (snapshot.reordersJson as Array<{ + category: 'STARTUP' | 'BUSINESS_CONCEPT' + orderedProjectIds: string[] + }> | null) ?? [] + + const latestStartupReorder = [...reorders].reverse().find((r) => r.category === 'STARTUP') + const latestConceptReorder = [...reorders].reverse().find((r) => r.category === 'BUSINESS_CONCEPT') + + setLocalOrder({ + STARTUP: latestStartupReorder?.orderedProjectIds ?? startup.map((r) => r.projectId), + BUSINESS_CONCEPT: latestConceptReorder?.orderedProjectIds ?? concept.map((r) => r.projectId), + }) + initialized.current = true } }, [snapshot])