diff --git a/package-lock.json b/package-lock.json index b0bfef4..8edb647 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "react-chartjs-2": "^5.2.0", "react-country-flag": "^3.1.0", "react-dom": "^18", + "react-toastify": "^9.1.3", "sharp": "^0.32.6", "zustand": "^4.4.3" }, @@ -4635,6 +4636,26 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-toastify": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", + "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-toastify/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", diff --git a/package.json b/package.json index 30d9eac..70fa296 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "react-chartjs-2": "^5.2.0", "react-country-flag": "^3.1.0", "react-dom": "^18", + "react-toastify": "^9.1.3", "sharp": "^0.32.6", "zustand": "^4.4.3" }, diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 72dad9d..76e90e7 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ import { Metadata } from "next"; import { Inter } from "next/font/google"; import Image from "next/image"; +import "react-toastify/dist/ReactToastify.css"; import "./globals.css"; const font = Inter({ subsets: ["latin-ext"], weight: "500" }); diff --git a/src/app/player/[id]/page.tsx b/src/app/player/[id]/page.tsx index 418721e..16a714e 100644 --- a/src/app/player/[id]/page.tsx +++ b/src/app/player/[id]/page.tsx @@ -10,17 +10,20 @@ import Score from "@/components/Score"; import { Spinner } from "@/components/Spinner"; import { ScoresaberPlayer } from "@/schemas/scoresaber/player"; import { ScoresaberPlayerScore } from "@/schemas/scoresaber/playerScore"; +import { useSettingsStore } from "@/store/settingsStore"; import { formatNumber } from "@/utils/number"; import { fetchScores, getPlayerInfo } from "@/utils/scoresaber/api"; import { ClockIcon, GlobeAsiaAustraliaIcon, + HomeIcon, TrophyIcon, } from "@heroicons/react/20/solid"; import Image from "next/image"; import { useRouter, useSearchParams } from "next/navigation"; import { useCallback, useEffect, useState } from "react"; import ReactCountryFlag from "react-country-flag"; +import { toast } from "react-toastify"; type PageInfo = { loading: boolean; @@ -56,6 +59,7 @@ const sortTypes: { [key: string]: SortType } = { const DEFAULT_SORT_TYPE = sortTypes.top; export default function Player({ params }: { params: { id: string } }) { + const settingsStore = useSettingsStore(); const searchParams = useSearchParams(); const router = useRouter(); @@ -70,6 +74,7 @@ export default function Player({ params }: { params: { id: string } }) { let sortType; const sortTypeString = searchParams.get("sort"); if (sortTypeString == null) { + // todo: check settings to get last used sort type sortType = DEFAULT_SORT_TYPE; } else { sortType = sortTypes[sortTypeString] || DEFAULT_SORT_TYPE; @@ -129,6 +134,11 @@ export default function Player({ params }: { params: { id: string } }) { [params.id, router, scores], ); + function claimProfile() { + settingsStore.setUserId(params.id); + toast.success("Successfully claimed profile"); + } + useEffect(() => { if (!params.id) { setError(true); @@ -187,13 +197,29 @@ export default function Player({ params }: { params: { id: string } }) { {/* Player Info */} -
-
+
+
+ {/* Avatar */}
+ + {/* Settings Buttons */} +
+ {settingsStore.userId !== params.id && ( + + )} +
-
+
+ {/* Name */}

{playerData.name}

@@ -219,7 +245,7 @@ export default function Player({ params }: { params: { id: string } }) {
{/* Labels */} -
+