// ── Every wipe this server has had ──────────────────────────────────────── // // The list is what makes the rest of the page navigable — picking a wipe here // filters the feed and the leaderboard — and it is also the proof R12 asks for: // a wipe that ended is still here, with its record still attached. A Rust server // wipes monthly, and a community site that forgot the previous map every time // would throw away most of what it knows about its own players. // // `wipeId` is derived by the bridge PLUGIN from the save's creation time and // stamped on every frame (PROTOCOL.md §8.2), so the id in this list is the same // id the events and the leaderboard filter by. There is no second derivation // anywhere that could disagree. import { EmptyState, ErrorState, Loading, useAsync } from '../core.js' import { ago, day } from '../lib/format.js' import api from '../api.js' export default function Wipes({ serverId, currentWipeId, selected, onSelect }) { const { data, loading, error } = useAsync(() => api.servers.wipes(serverId), [serverId]) const wipes = data ? data.wipes : [] if (loading) return if (error) return if (wipes.length === 0) { return ( ) } return (
    {wipes.map((wipe) => { const current = wipe.wipeId === currentWipeId const active = wipe.wipeId === selected return (
  • ) })}
) }