diff --git a/src/lib/leaderboard-updates.ts b/src/lib/leaderboard-updates.ts new file mode 100644 index 0000000..1da3b5c --- /dev/null +++ b/src/lib/leaderboard-updates.ts @@ -0,0 +1,27 @@ +import type { LeaderboardResponse } from './leaderboard.js'; + +export const leaderboardPageSize = 25; + +/** Keep a viewed ranking stable until the reader chooses to apply new results. */ +export function createLeaderboardUpdates(scope: string, current: LeaderboardResponse) { + let pending: LeaderboardResponse | null = null; + return { + reset(nextScope: string, report: LeaderboardResponse) { + scope = nextScope; + current = report; + pending = null; + }, + receive(requestScope: string, report: LeaderboardResponse, inspecting: boolean) { + if (requestScope !== scope) return null; + if (JSON.stringify(current) === JSON.stringify(report)) pending = null; + else if (inspecting || pending) pending = report; + else current = report; + return { current, pending }; + }, + apply() { + if (pending) current = pending; + pending = null; + return current; + } + }; +} diff --git a/src/lib/ui/components/RecordSource.svelte b/src/lib/ui/components/RecordSource.svelte index 3fc9f28..6cd2320 100644 --- a/src/lib/ui/components/RecordSource.svelte +++ b/src/lib/ui/components/RecordSource.svelte @@ -1,23 +1,25 @@
- {evidence.mapName} · {gameName} + {evidence.mapName} · {gameName} {#if evidence.endedAt}Completed {:else}Completed · End time unknown{/if} -
- Run details + {#snippet runDetails()}
-
Server
{evidence.server}
+
Instance
{evidence.server}
{evidence.startObserved ? 'Match started' : 'Match first observed'}
Player participation
{evidence.presentAtStart ? 'Present at recorded start' : evidence.firstObservedRound === null ? 'Participation start unknown' : `First observed at round ${evidence.firstObservedRound}`}

Recorded presence does not establish continuous survival.

-
+ {/snippet} + {#if disclosure}
Run details{@render runDetails()}
+ {:else}{@render runDetails()}{/if}