fix score leaderboard staying open when switching sort/page
This commit is contained in:
@ -9,7 +9,7 @@ import ScoreSaberPlayerScoresPageToken from "@ssr/common/types/token/scoresaber/
|
||||
import ScoreSaberPlayer, { getScoreSaberPlayerFromToken } from "@ssr/common/types/player/impl/scoresaber-player";
|
||||
import { config } from "../../../../../config";
|
||||
import NodeCache from "node-cache";
|
||||
import { getCookieValue } from "@/common/cookie-utils";
|
||||
import { getCookieValue } from "@ssr/common/utils/cookie-utils";
|
||||
|
||||
const UNKNOWN_PLAYER = {
|
||||
title: "ScoreSaber Reloaded - Unknown Player",
|
||||
|
@ -1,47 +0,0 @@
|
||||
import { isServer } from "@tanstack/react-query";
|
||||
|
||||
export type CookieName = "playerId" | "lastScoreSort";
|
||||
|
||||
/**
|
||||
* Gets the value of a cookie
|
||||
*
|
||||
* @param name the name of the cookie
|
||||
* @param defaultValue the fallback value
|
||||
* @returns the value of the cookie, or the fallback value (undefined if no fallback value is provided)
|
||||
*/
|
||||
export async function getCookieValue(name: CookieName, defaultValue?: string): Promise<string | undefined> {
|
||||
let value: string | undefined;
|
||||
if (isServer) {
|
||||
const { cookies } = await import("next/headers");
|
||||
|
||||
const cookieStore = await cookies();
|
||||
const cookieValue = cookieStore.get(name)?.value;
|
||||
value = cookieValue ? cookieValue : defaultValue ? defaultValue : undefined;
|
||||
} else {
|
||||
const { get } = (await import("js-cookie")).default;
|
||||
value = get(name) || defaultValue ? defaultValue : undefined;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of a cookie
|
||||
*
|
||||
* @param name the name of the cookie
|
||||
* @param value the value of the cookie
|
||||
*/
|
||||
export async function setCookieValue(name: CookieName, value: string) {
|
||||
if (isServer) {
|
||||
const { cookies } = await import("next/headers");
|
||||
|
||||
const cookieStore = await cookies();
|
||||
cookieStore.set(name, value, {
|
||||
path: "/",
|
||||
});
|
||||
}
|
||||
const { set } = (await import("js-cookie")).default;
|
||||
set(name, value, {
|
||||
path: "/",
|
||||
});
|
||||
}
|
@ -1,13 +1,12 @@
|
||||
import Dexie, { EntityTable } from "dexie";
|
||||
import BeatSaverMap from "./types/beatsaver-map";
|
||||
import Settings from "./types/settings";
|
||||
import { setCookieValue } from "@/common/cookie-utils";
|
||||
import { Friend } from "@/common/database/types/friends";
|
||||
import ScoreSaberPlayerToken from "@ssr/common/types/token/scoresaber/score-saber-player-token";
|
||||
import { scoresaberService } from "@ssr/common/service/impl/scoresaber";
|
||||
import { setCookieValue } from "@ssr/common/utils/cookie-utils";
|
||||
|
||||
const SETTINGS_ID = "SSR"; // DO NOT CHANGE
|
||||
const FRIENDS_ID = "FRIENDS"; // DO NOT CHANGE
|
||||
|
||||
export default class Database extends Dexie {
|
||||
/**
|
||||
|
@ -7,7 +7,7 @@ import { useToast } from "@/hooks/use-toast";
|
||||
import Tooltip from "../tooltip";
|
||||
import { Button } from "../ui/button";
|
||||
import { revalidatePath } from "next/cache";
|
||||
import { setCookieValue } from "@/common/cookie-utils";
|
||||
import { setCookieValue } from "@ssr/common/utils/cookie-utils";
|
||||
|
||||
type Props = {
|
||||
/**
|
||||
|
@ -16,7 +16,7 @@ import ScoreSaberPlayer from "@ssr/common/types/player/impl/scoresaber-player";
|
||||
import ScoreSaberPlayerScoresPageToken from "@ssr/common/types/token/scoresaber/score-saber-player-scores-page-token";
|
||||
import { ScoreSort } from "@ssr/common/types/score/score-sort";
|
||||
import { scoresaberService } from "@ssr/common/service/impl/scoresaber";
|
||||
import { setCookieValue } from "@/common/cookie-utils";
|
||||
import { setCookieValue } from "@ssr/common/utils/cookie-utils";
|
||||
|
||||
type Props = {
|
||||
initialScoreData?: ScoreSaberPlayerScoresPageToken;
|
||||
|
@ -48,16 +48,29 @@ export default function Score({ player, playerScore, settings }: Props) {
|
||||
setBeatSaverMap(beatSaverMapData);
|
||||
}, [leaderboard.songHash, settings?.noScoreButtons]);
|
||||
|
||||
/**
|
||||
* Set the base score
|
||||
*/
|
||||
useEffect(() => {
|
||||
if (playerScore?.score?.baseScore) {
|
||||
setBaseScore(playerScore.score.baseScore);
|
||||
}
|
||||
}, [playerScore]);
|
||||
|
||||
/**
|
||||
* Fetch the beatSaver data on page load
|
||||
*/
|
||||
useEffect(() => {
|
||||
fetchBeatSaverData();
|
||||
}, [fetchBeatSaverData]);
|
||||
|
||||
/**
|
||||
* Close the leaderboard when the score changes
|
||||
*/
|
||||
useEffect(() => {
|
||||
setIsLeaderboardExpanded(false);
|
||||
}, [score]);
|
||||
|
||||
const accuracy = (baseScore / leaderboard.maxScore) * 100;
|
||||
const pp = baseScore === score.baseScore ? score.pp : scoresaberService.getPp(leaderboard.stars, accuracy);
|
||||
|
||||
|
Reference in New Issue
Block a user