2024-04-21 14:34:45 +02:00
|
|
|
import {makeApiUrl, Player} from './serverCalls.tsx';
|
2024-04-13 23:07:08 +02:00
|
|
|
import DataTable from "./components/DataTable.tsx";
|
2024-04-17 23:09:01 +02:00
|
|
|
import {useQuery} from "@tanstack/react-query";
|
2024-04-13 23:07:08 +02:00
|
|
|
|
2024-04-14 18:26:13 +02:00
|
|
|
function numberSorter(a: number, b: number) {
|
|
|
|
return b - a;
|
|
|
|
}
|
|
|
|
|
2024-04-13 23:07:08 +02:00
|
|
|
export default function Scoreboard({}: {}) {
|
2024-04-17 23:09:01 +02:00
|
|
|
const query = useQuery({
|
|
|
|
queryKey: ['scores'],
|
2024-04-29 13:54:29 +02:00
|
|
|
refetchInterval: 5000,
|
2024-04-17 23:09:01 +02:00
|
|
|
queryFn: async () => {
|
2024-04-21 14:34:45 +02:00
|
|
|
const url = makeApiUrl('/scores');
|
2024-04-17 23:09:01 +02:00
|
|
|
const response = await fetch(url, {method: 'GET'});
|
|
|
|
if (!response.ok)
|
|
|
|
throw new Error(`response failed with code ${response.status} (${response.status})${await response.text()}`)
|
|
|
|
return await response.json() as Player[];
|
|
|
|
}
|
|
|
|
});
|
2024-04-13 23:07:08 +02:00
|
|
|
|
2024-04-17 23:09:01 +02:00
|
|
|
if (query.isError)
|
|
|
|
return <p>{query.error.message}</p>;
|
|
|
|
if (query.isPending)
|
|
|
|
return <p>loading...</p>;
|
2024-04-13 23:07:08 +02:00
|
|
|
|
2024-04-14 12:57:45 +02:00
|
|
|
return <DataTable
|
2024-04-17 23:09:01 +02:00
|
|
|
data={query.data}
|
2024-04-14 12:57:45 +02:00
|
|
|
columns={[
|
|
|
|
{field: 'name'},
|
2024-04-14 18:26:13 +02:00
|
|
|
{
|
|
|
|
field: 'kills',
|
|
|
|
visualize: p => p.scores.kills.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.kills, b.scores.kills)
|
|
|
|
},
|
|
|
|
{
|
|
|
|
field: 'deaths',
|
|
|
|
visualize: p => p.scores.deaths.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.deaths, b.scores.deaths)
|
|
|
|
},
|
|
|
|
{
|
|
|
|
field: 'ratio',
|
|
|
|
visualize: p => p.scores.ratio.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.ratio, b.scores.ratio)
|
2024-04-19 13:34:56 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
field: 'walls',
|
|
|
|
visualize: p => p.scores.wallsDestroyed.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.wallsDestroyed, b.scores.wallsDestroyed)
|
2024-04-22 21:26:46 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
field: 'bullets',
|
|
|
|
visualize: p => p.scores.shotsFired.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.shotsFired, b.scores.shotsFired)
|
|
|
|
},
|
2024-04-29 13:54:29 +02:00
|
|
|
{
|
|
|
|
field: 'powerUps',
|
|
|
|
visualize: p => p.scores.powerUpsCollected.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.powerUpsCollected, b.scores.powerUpsCollected)
|
|
|
|
},
|
2024-04-29 14:13:04 +02:00
|
|
|
{
|
|
|
|
field: 'distance',
|
|
|
|
visualize: p => p.scores.pixelsMoved.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.pixelsMoved, b.scores.pixelsMoved)
|
|
|
|
},
|
2024-04-22 21:26:46 +02:00
|
|
|
{
|
|
|
|
field: 'score',
|
|
|
|
visualize: p => p.scores.overallScore.toString(),
|
|
|
|
sorter: (a, b) => numberSorter(a.scores.overallScore, b.scores.overallScore)
|
2024-04-14 18:26:13 +02:00
|
|
|
}
|
2024-04-14 12:57:45 +02:00
|
|
|
]}/>
|
2024-04-13 23:07:08 +02:00
|
|
|
}
|