make urls look less awful (remove query params)
All checks were successful
deploy / deploy (push) Successful in 53s

This commit is contained in:
Lee 2023-10-24 12:56:28 +01:00
parent 3e10b0108b
commit 171dfd9cc0
12 changed files with 47 additions and 84 deletions

@ -6,7 +6,7 @@ import { normalizedRegionName } from "@/utils/utils";
import { Metadata } from "next"; import { Metadata } from "next";
type Props = { type Props = {
params: { id: string }; params: { id: string; sort: string; page: string };
}; };
export async function generateMetadata({ export async function generateMetadata({
@ -47,6 +47,6 @@ export async function generateMetadata({
}; };
} }
export default function Player({ params: { id } }: Props) { export default function Player({ params: { id, sort, page } }: Props) {
return <PlayerPage id={id} />; return <PlayerPage id={id} sort={sort} page={page} />;
} }

@ -0,0 +1,9 @@
import GlobalRanking from "@/components/player/GlobalRanking";
type Props = {
params: { page: string; country: string };
};
export default function RankingGlobal({ params: { page, country } }: Props) {
return <GlobalRanking page={Number(page)} country={country} />;
}

@ -1,14 +0,0 @@
import GlobalRanking from "@/components/player/GlobalRanking";
import { getPageFromSearchQuery } from "@/utils/utils";
import { headers } from "next/headers";
type RankingCountryProps = {
params: { country: string };
};
export default function RankingCountry({ params }: RankingCountryProps) {
const page = getPageFromSearchQuery(headers());
const country = params.country;
return <GlobalRanking page={page} country={country} />;
}

@ -0,0 +1,9 @@
import GlobalRanking from "@/components/player/GlobalRanking";
type Props = {
params: { page: string };
};
export default function RankingGlobal({ params: { page } }: Props) {
return <GlobalRanking page={Number(page)} />;
}

@ -1,9 +0,0 @@
import GlobalRanking from "@/components/player/GlobalRanking";
import { getPageFromSearchQuery } from "@/utils/utils";
import { headers } from "next/headers";
export default function RankingGlobal() {
const page = getPageFromSearchQuery(headers());
return <GlobalRanking page={page} />;
}

@ -56,7 +56,7 @@ export default function Navbar() {
size={32} size={32}
/> />
} }
href={`/player/${settingsStore.player.id}`} href={`/player/${settingsStore.player.id}/top/1`}
/> />
)} )}
@ -70,7 +70,7 @@ export default function Navbar() {
key={friend.id} key={friend.id}
className="mt-2 bg-gray-500" className="mt-2 bg-gray-500"
text={friend.name} text={friend.name}
url={`/player/${friend.id}`} url={`/player/${friend.id}/top/1`}
icon={ icon={
<Avatar <Avatar
url={friend.profilePicture} url={friend.profilePicture}
@ -93,7 +93,7 @@ export default function Navbar() {
<NavbarButton <NavbarButton
text="Ranking" text="Ranking"
icon={<GlobeAltIcon height={20} width={20} />} icon={<GlobeAltIcon height={20} width={20} />}
href="/ranking/global" href="/ranking/global/1"
/> />
<div className="m-auto" /> <div className="m-auto" />

@ -59,18 +59,11 @@ export default function GlobalRanking({ page, country }: GlobalRankingProps) {
loading: false, loading: false,
page: page, page: page,
}); });
const urlBase = country router.push(
? `/ranking/country/${country}` country
: "/ranking/global"; ? `/ranking/country/${country}/${page}`
if (page > 1) { : `/ranking/global/${page}`,
router.push(`${urlBase}?page=${page}`, { );
scroll: false,
});
} else {
router.push(`${urlBase}`, {
scroll: false,
});
}
}); });
}, },
[country, pageInfo, router], [country, pageInfo, router],

@ -169,9 +169,7 @@ export default function PlayerInfo({ playerData }: PlayerInfoProps) {
<a <a
className="flex transform-gpu items-center gap-1 transition-all hover:text-blue-500" className="flex transform-gpu items-center gap-1 transition-all hover:text-blue-500"
href={`/ranking/global/?page=${Math.round( href={`/ranking/global/${Math.round(playerData.rank / 50)}`}
playerData.rank / 50,
)}`}
> >
<p>#{formatNumber(playerData.rank)}</p> <p>#{formatNumber(playerData.rank)}</p>
</a> </a>
@ -181,7 +179,7 @@ export default function PlayerInfo({ playerData }: PlayerInfoProps) {
<div className="text-gray-300"> <div className="text-gray-300">
<a <a
className="flex transform-gpu items-center gap-1 transition-all hover:text-blue-500" className="flex transform-gpu items-center gap-1 transition-all hover:text-blue-500"
href={`/ranking/country/${playerData.country}?page=${Math.round( href={`/ranking/country/${playerData.country}/${Math.round(
playerData.countryRank / 50, playerData.countryRank / 50,
)}`} )}`}
> >

@ -5,12 +5,9 @@ import Container from "@/components/Container";
import Spinner from "@/components/Spinner"; import Spinner from "@/components/Spinner";
import Scores from "@/components/player/Scores"; import Scores from "@/components/player/Scores";
import { ScoresaberPlayer } from "@/schemas/scoresaber/player"; import { ScoresaberPlayer } from "@/schemas/scoresaber/player";
import { useSettingsStore } from "@/store/settingsStore"; import { SortTypes } from "@/types/SortTypes";
import { SortType, SortTypes } from "@/types/SortTypes";
import { ScoreSaberAPI } from "@/utils/scoresaber/api"; import { ScoreSaberAPI } from "@/utils/scoresaber/api";
import useStore from "@/utils/useStore";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import { useSearchParams } from "next/navigation";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import PlayerInfo from "./PlayerInfo"; import PlayerInfo from "./PlayerInfo";
@ -23,14 +20,13 @@ type PlayerInfo = {
type PlayerPageProps = { type PlayerPageProps = {
id: string; id: string;
sort: string;
page: string;
}; };
const DEFAULT_SORT_TYPE = SortTypes.top; const DEFAULT_SORT_TYPE = SortTypes.top;
export default function PlayerPage({ id }: PlayerPageProps) { export default function PlayerPage({ id, sort, page }: PlayerPageProps) {
const settingsStore = useStore(useSettingsStore, (store) => store);
const searchParams = useSearchParams();
const [mounted, setMounted] = useState(false); const [mounted, setMounted] = useState(false);
const [error, setError] = useState(false); const [error, setError] = useState(false);
const [errorMessage, setErrorMessage] = useState(""); const [errorMessage, setErrorMessage] = useState("");
@ -40,21 +36,7 @@ export default function PlayerPage({ id }: PlayerPageProps) {
player: undefined, player: undefined,
}); });
let page; const sortType = SortTypes[sort] || DEFAULT_SORT_TYPE;
const pageString = searchParams.get("page");
if (pageString == null) {
page = 1;
} else {
page = Number.parseInt(pageString) || 1;
}
let sortType: SortType;
const sortTypeString = searchParams.get("sort");
if (sortTypeString == null) {
sortType = settingsStore?.lastUsedSortType || DEFAULT_SORT_TYPE;
} else {
sortType = SortTypes[sortTypeString] || DEFAULT_SORT_TYPE;
}
useEffect(() => { useEffect(() => {
setMounted(true); setMounted(true);
@ -102,7 +84,11 @@ export default function PlayerPage({ id }: PlayerPageProps) {
<main> <main>
<Container> <Container>
<PlayerInfo playerData={playerData} /> <PlayerInfo playerData={playerData} />
<Scores playerData={playerData} page={page} sortType={sortType} /> <Scores
playerData={playerData}
page={Number(page)}
sortType={sortType}
/>
</Container> </Container>
</main> </main>
); );

@ -66,18 +66,9 @@ export default function Scores({ playerData, page, sortType }: ScoresProps) {
}); });
settingsStore?.setLastUsedSortType(sortType); settingsStore?.setLastUsedSortType(sortType);
if (page > 1) { router.push(`/player/${playerId}/${sortType.value}/${page}`, {
router.push(
`/player/${playerId}?page=${page}&sort=${sortType.value}`,
{
scroll: false,
},
);
} else {
router.push(`/player/${playerId}?sort=${sortType.value}`, {
scroll: false, scroll: false,
}); });
}
console.log(`Switched page to ${page} with sort ${sortType.value}`); console.log(`Switched page to ${page} with sort ${sortType.value}`);
}, },

@ -45,7 +45,7 @@ export default function SearchPlayer() {
// Take the user to the first account // Take the user to the first account
if (players.length > 0) { if (players.length > 0) {
window.location.href = `/player/${players[0].id}`; window.location.href = `/player/${players[0].id}/top/1`;
} }
} }
@ -72,7 +72,7 @@ export default function SearchPlayer() {
<a <a
key={player.id} key={player.id}
className="flex min-w-[14rem] items-center gap-2 rounded-md p-2 transition-all hover:bg-gray-600" className="flex min-w-[14rem] items-center gap-2 rounded-md p-2 transition-all hover:bg-gray-600"
href={`/player/${player.id}`} href={`/player/${player.id}/top/1`}
> >
<Avatar label="Account" size={40} url={player.profilePicture} /> <Avatar label="Account" size={40} url={player.profilePicture} />

@ -9,7 +9,7 @@ export function middleware(request: NextRequest) {
if (pathname == "/") { if (pathname == "/") {
if (playerIdCookie) { if (playerIdCookie) {
return NextResponse.redirect( return NextResponse.redirect(
new URL(`/player/${playerIdCookie.value}`, request.url), new URL(`/player/${playerIdCookie.value}/top/1`, request.url),
); );
} else { } else {
return NextResponse.redirect(new URL("/search", request.url)); return NextResponse.redirect(new URL("/search", request.url));