"use client"; import { ScoresaberPlayer } from "@/schemas/scoresaber/player"; import { ScoresaberScoreWithBeatsaverData } from "@/schemas/scoresaber/scoreWithBeatsaverData"; import { useSettingsStore } from "@/store/settingsStore"; import { SortType, SortTypes } from "@/types/SortTypes"; import { ScoreSaberAPI } from "@/utils/scoresaber/api"; import useStore from "@/utils/useStore"; import { useCallback, useEffect, useState } from "react"; import Card from "../Card"; import Error from "../Error"; import Pagination from "../Pagination"; import Score from "../score/Score"; type PageInfo = { page: number; totalPages: number; sortType: SortType; scores: Record; }; type ScoresProps = { initalScores: Record | undefined; initalPage: number; initalSortType: SortType; initalTotalPages?: number; playerData: ScoresaberPlayer; }; export default function Scores({ initalScores, initalPage, initalSortType, initalTotalPages, playerData, }: ScoresProps) { const settingsStore = useStore(useSettingsStore, (store) => store); const playerId = playerData.id; const [mounted, setMounted] = useState(false); const [error, setError] = useState(false); const [errorMessage, setErrorMessage] = useState(""); const [scores, setScores] = useState({ page: initalPage, totalPages: initalTotalPages || 1, sortType: initalSortType, scores: initalScores ? initalScores : {}, }); const [changedPage, setChangedPage] = useState(false); const updateScoresPage = useCallback( (sortType: SortType, page: any) => { if ( page == initalPage && sortType == initalSortType && initalScores && !changedPage ) { console.log("Already loaded scores, not fetching"); return; } ScoreSaberAPI.fetchScoresWithBeatsaverData( playerId, page, sortType.value, 10, ).then((scoresResponse) => { if (!scoresResponse) { setError(true); setErrorMessage("No Scores"); setScores({ ...scores }); return; } setScores({ ...scores, scores: scoresResponse.scores, totalPages: scoresResponse.pageInfo.totalPages, page: page, sortType: sortType, }); settingsStore?.setLastUsedSortType(sortType); window.history.pushState( {}, "", `/player/${playerId}/${sortType.value}/${page}`, ); setChangedPage(true); console.log(`Switched page to ${page} with sort ${sortType.value}`); }); }, [ changedPage, initalPage, initalScores, initalSortType, playerId, scores, settingsStore, ], ); useEffect(() => { if (mounted) return; setMounted(true); updateScoresPage(scores.sortType, scores.page); }, [mounted, updateScoresPage, scores.sortType, scores.page]); if (error) { return (
{error && }
); } return ( {/* Sort */}
{Object.values(SortTypes).map((sortType) => { return ( ); })}
<>
{Object.values(scores.scores).map((scoreData, id) => { const { score, leaderboard, mapId } = scoreData; return ( ); })}
{/* Pagination */}
{ updateScoresPage(scores.sortType, page); }} />
); }