"use client"; import { ScoresaberPlayer } from "@/schemas/scoresaber/player"; import { ScoresaberPlayerScore } from "@/schemas/scoresaber/playerScore"; import { useSettingsStore } from "@/store/settingsStore"; import { SortType, SortTypes } from "@/types/SortTypes"; import { ScoreSaberAPI } from "@/utils/scoresaber/api"; import useStore from "@/utils/useStore"; import dynamic from "next/dynamic"; import { useCallback, useEffect, useState } from "react"; import Card from "../Card"; import Error from "../Error"; import Pagination from "../Pagination"; import Score from "./Score"; const Spinner = dynamic(() => import("@/components/Spinner")); type PageInfo = { loading: boolean; page: number; totalPages: number; sortType: SortType; scores: ScoresaberPlayerScore[]; }; type ScoresProps = { playerData: ScoresaberPlayer; page: number; sortType: SortType; }; export default function Scores({ playerData, page, sortType }: 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({ loading: true, page: page, totalPages: 1, sortType: sortType, scores: [], }); const updateScoresPage = useCallback( (sortType: SortType, page: any) => { ScoreSaberAPI.fetchScores(playerId, page, sortType.value, 10).then( (scoresResponse) => { if (!scoresResponse) { setError(true); setErrorMessage("No Scores"); setScores({ ...scores, loading: false }); return; } setScores({ ...scores, scores: scoresResponse.scores, totalPages: scoresResponse.pageInfo.totalPages, loading: false, page: page, sortType: sortType, }); settingsStore?.setLastUsedSortType(sortType); window.history.pushState( {}, "", `/player/${playerId}/${sortType.value}/${page}`, ); console.log(`Switched page to ${page} with sort ${sortType.value}`); }, ); }, [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 ( ); })}
{scores.loading ? (
) : (
{!scores.loading && scores.scores.length == 0 ? (

{errorMessage}

) : ( scores.scores.map((scoreData, id) => { const { score, leaderboard } = scoreData; return ( ); }) )}
)}
{/* Pagination */}
{ updateScoresPage(scores.sortType, page); }} />
); }