This commit is contained in:
parent
671f520635
commit
7112d3f53b
@ -23,6 +23,7 @@
|
|||||||
"chart.js": "^4.4.4",
|
"chart.js": "^4.4.4",
|
||||||
"class-variance-authority": "^0.7.0",
|
"class-variance-authority": "^0.7.0",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
"comlink": "^4.4.1",
|
||||||
"dexie": "^4.0.8",
|
"dexie": "^4.0.8",
|
||||||
"dexie-react-hooks": "^1.1.7",
|
"dexie-react-hooks": "^1.1.7",
|
||||||
"framer-motion": "^11.5.4",
|
"framer-motion": "^11.5.4",
|
||||||
|
7
pnpm-lock.yaml
generated
7
pnpm-lock.yaml
generated
@ -47,6 +47,9 @@ dependencies:
|
|||||||
clsx:
|
clsx:
|
||||||
specifier: ^2.1.1
|
specifier: ^2.1.1
|
||||||
version: 2.1.1
|
version: 2.1.1
|
||||||
|
comlink:
|
||||||
|
specifier: ^4.4.1
|
||||||
|
version: 4.4.1
|
||||||
dexie:
|
dexie:
|
||||||
specifier: ^4.0.8
|
specifier: ^4.0.8
|
||||||
version: 4.0.8
|
version: 4.0.8
|
||||||
@ -1362,6 +1365,10 @@ packages:
|
|||||||
/color-name@1.1.4:
|
/color-name@1.1.4:
|
||||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||||
|
|
||||||
|
/comlink@4.4.1:
|
||||||
|
resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/commander@4.1.1:
|
/commander@4.1.1:
|
||||||
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
|
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
|
@ -5,10 +5,10 @@ import localFont from "next/font/local";
|
|||||||
import BackgroundImage from "../components/background-image";
|
import BackgroundImage from "../components/background-image";
|
||||||
import DatabaseLoader from "../components/loaders/database-loader";
|
import DatabaseLoader from "../components/loaders/database-loader";
|
||||||
import NavBar from "../components/navbar/navbar";
|
import NavBar from "../components/navbar/navbar";
|
||||||
import { QueryProvider } from "../components/providers/query-provider";
|
import { QueryProvider } from "@/components/providers/query-provider";
|
||||||
import { ThemeProvider } from "../components/providers/theme-provider";
|
import { ThemeProvider } from "@/components/providers/theme-provider";
|
||||||
import { Toaster } from "../components/ui/toaster";
|
import { Toaster } from "@/components/ui/toaster";
|
||||||
import { TooltipProvider } from "../components/ui/tooltip";
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
|
|
||||||
const siteFont = localFont({
|
const siteFont = localFont({
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
export const diffColors: Record<string, string> = {
|
const diffColors: Record<string, string> = {
|
||||||
easy: "MediumSeaGreen",
|
easy: "MediumSeaGreen",
|
||||||
normal: "#59b0f4",
|
normal: "#59b0f4",
|
||||||
hard: "tomato",
|
hard: "tomato",
|
||||||
@ -45,6 +45,5 @@ export function accuracyToColor(acc: number): string {
|
|||||||
return badge.color;
|
return badge.color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Return a default color if no badge matches
|
return "#000000"; // fallback color
|
||||||
return "#000000"; // black or any default color
|
|
||||||
}
|
}
|
||||||
|
16
src/common/workers/worker.ts
Normal file
16
src/common/workers/worker.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import * as Comlink from "comlink";
|
||||||
|
import { scoresaberFetcher } from "@/common/data-fetcher/impl/scoresaber";
|
||||||
|
|
||||||
|
export interface WorkerApi {
|
||||||
|
getName: typeof getName;
|
||||||
|
}
|
||||||
|
|
||||||
|
const workerApi: WorkerApi = {
|
||||||
|
getName,
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getName() {
|
||||||
|
return await scoresaberFetcher.lookupPlayer("76561198449412074");
|
||||||
|
}
|
||||||
|
|
||||||
|
Comlink.expose(workerApi);
|
5
src/common/workers/workers.ts
Normal file
5
src/common/workers/workers.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import * as Comlink from "comlink";
|
||||||
|
import { WorkerApi } from "@/common/workers/worker";
|
||||||
|
|
||||||
|
export const scoresaberReloadedWorker = () =>
|
||||||
|
Comlink.wrap<WorkerApi>(new Worker(new URL("./worker.ts", import.meta.url)));
|
@ -8,6 +8,8 @@ import { useQuery } from "@tanstack/react-query";
|
|||||||
import PlayerHeader from "./player-header";
|
import PlayerHeader from "./player-header";
|
||||||
import PlayerRankChart from "./player-rank-chart";
|
import PlayerRankChart from "./player-rank-chart";
|
||||||
import PlayerScores from "./player-scores";
|
import PlayerScores from "./player-scores";
|
||||||
|
import { useEffect } from "react";
|
||||||
|
import { scoresaberReloadedWorker } from "@/common/workers/workers";
|
||||||
|
|
||||||
const REFRESH_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
const REFRESH_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
||||||
|
|
||||||
@ -31,6 +33,13 @@ export default function PlayerData({
|
|||||||
refetchInterval: REFRESH_INTERVAL,
|
refetchInterval: REFRESH_INTERVAL,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
(async () => {
|
||||||
|
const worker = scoresaberReloadedWorker();
|
||||||
|
console.log(await worker.getName());
|
||||||
|
})();
|
||||||
|
}, []);
|
||||||
|
|
||||||
if (data && (!isLoading || !isError)) {
|
if (data && (!isLoading || !isError)) {
|
||||||
player = data;
|
player = data;
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,41 @@ import Pagination from "../input/pagination";
|
|||||||
import { Button } from "../ui/button";
|
import { Button } from "../ui/button";
|
||||||
import Score from "./score/score";
|
import Score from "./score/score";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
initialScoreData?: ScoreSaberPlayerScoresPage;
|
||||||
|
player: ScoreSaberPlayer;
|
||||||
|
sort: ScoreSort;
|
||||||
|
page: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
type PageState = {
|
||||||
|
/**
|
||||||
|
* The current page
|
||||||
|
*/
|
||||||
|
page: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current sort
|
||||||
|
*/
|
||||||
|
sort: ScoreSort;
|
||||||
|
};
|
||||||
|
|
||||||
|
const leaderboards = {
|
||||||
|
ScoreSaber: {
|
||||||
|
capabilities: {
|
||||||
|
search: true,
|
||||||
|
},
|
||||||
|
queries: {
|
||||||
|
lookupScores: (player: ScoreSaberPlayer, pageState: PageState) =>
|
||||||
|
scoresaberFetcher.lookupPlayerScores({
|
||||||
|
playerId: player.id,
|
||||||
|
sort: ScoreSort.top,
|
||||||
|
page: 1,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
const scoreSort = [
|
const scoreSort = [
|
||||||
{
|
{
|
||||||
name: "Top",
|
name: "Top",
|
||||||
@ -52,31 +87,13 @@ const scoreAnimation: Variants = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
type Props = {
|
|
||||||
initialScoreData?: ScoreSaberPlayerScoresPage;
|
|
||||||
player: ScoreSaberPlayer;
|
|
||||||
sort: ScoreSort;
|
|
||||||
page: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
type PageState = {
|
|
||||||
/**
|
|
||||||
* The current page
|
|
||||||
*/
|
|
||||||
page: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The current sort
|
|
||||||
*/
|
|
||||||
sort: ScoreSort;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function PlayerScores({
|
export default function PlayerScores({
|
||||||
initialScoreData,
|
initialScoreData,
|
||||||
player,
|
player,
|
||||||
sort,
|
sort,
|
||||||
page,
|
page,
|
||||||
}: Props) {
|
}: Props) {
|
||||||
|
const leaderboard = leaderboards.ScoreSaber;
|
||||||
const { width } = useWindowDimensions();
|
const { width } = useWindowDimensions();
|
||||||
const controls = useAnimation();
|
const controls = useAnimation();
|
||||||
|
|
||||||
@ -96,13 +113,8 @@ export default function PlayerScores({
|
|||||||
isLoading,
|
isLoading,
|
||||||
refetch,
|
refetch,
|
||||||
} = useQuery({
|
} = useQuery({
|
||||||
queryKey: ["playerScores", player.id, pageState],
|
queryKey: ["playerScores", player.id, leaderboard, pageState],
|
||||||
queryFn: () =>
|
queryFn: () => leaderboard.queries.lookupScores(player, pageState),
|
||||||
scoresaberFetcher.lookupPlayerScores({
|
|
||||||
playerId: player.id,
|
|
||||||
sort: pageState.sort,
|
|
||||||
page: pageState.page,
|
|
||||||
}),
|
|
||||||
staleTime: 30 * 1000, // Cache data for 30 seconds
|
staleTime: 30 * 1000, // Cache data for 30 seconds
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user