show players!
This commit is contained in:
parent
6dbbc50610
commit
83b2a96490
Binary file not shown.
@ -1,4 +1,13 @@
|
|||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {};
|
const nextConfig = {
|
||||||
|
images: {
|
||||||
|
remotePatterns: [
|
||||||
|
{
|
||||||
|
protocol: "https",
|
||||||
|
hostname: "mc.rainnny.club",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
"react": "^18",
|
"react": "^18",
|
||||||
"react-dom": "^18",
|
"react-dom": "^18",
|
||||||
"react-hook-form": "^7.51.3",
|
"react-hook-form": "^7.51.3",
|
||||||
"restfulmc-lib": "^1.0.9",
|
"restfulmc-lib": "^1.1.1",
|
||||||
"tailwind-merge": "^2.2.2",
|
"tailwind-merge": "^2.2.2",
|
||||||
"tailwindcss-animate": "^1.0.7"
|
"tailwindcss-animate": "^1.0.7"
|
||||||
},
|
},
|
||||||
|
@ -5,6 +5,7 @@ import { PageProps } from "@/types/page";
|
|||||||
import { Metadata } from "next";
|
import { Metadata } from "next";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import { CachedPlayer, getPlayer, type RestfulMCAPIError } from "restfulmc-lib";
|
import { CachedPlayer, getPlayer, type RestfulMCAPIError } from "restfulmc-lib";
|
||||||
|
import PlayerResult from "../../../components/player/player-result";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The page to lookup a player.
|
* The page to lookup a player.
|
||||||
@ -34,7 +35,7 @@ const PlayerPage = async ({ params }: PageProps): Promise<JSX.Element> => {
|
|||||||
<div className="flex gap-32">
|
<div className="flex gap-32">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<Image
|
<Image
|
||||||
className="pointer-events-none"
|
className="my-auto h-[28rem] pointer-events-none"
|
||||||
src="/media/players.webp"
|
src="/media/players.webp"
|
||||||
alt="Minecraft Players"
|
alt="Minecraft Players"
|
||||||
width={632}
|
width={632}
|
||||||
@ -56,6 +57,9 @@ const PlayerPage = async ({ params }: PageProps): Promise<JSX.Element> => {
|
|||||||
|
|
||||||
{/* Search */}
|
{/* Search */}
|
||||||
<PlayerSearch query={query} />
|
<PlayerSearch query={query} />
|
||||||
|
|
||||||
|
{/* Player Result */}
|
||||||
|
{result && <PlayerResult player={result} />}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
66
Frontend/src/app/components/player/player-result.tsx
Normal file
66
Frontend/src/app/components/player/player-result.tsx
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* eslint-disable @next/next/no-img-element */
|
||||||
|
import Image from "next/image";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { CachedPlayer, SkinPart } from "restfulmc-lib";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The result of a player search.
|
||||||
|
*
|
||||||
|
* @param player the player to display
|
||||||
|
* @returns the player result jsx
|
||||||
|
*/
|
||||||
|
const PlayerResult = ({
|
||||||
|
player: {
|
||||||
|
uniqueId,
|
||||||
|
username,
|
||||||
|
skin: { parts },
|
||||||
|
},
|
||||||
|
}: {
|
||||||
|
player: CachedPlayer;
|
||||||
|
}): JSX.Element => (
|
||||||
|
<div className="px-2 py-3 flex flex-col gap-3 items-center bg-muted rounded-xl divide-y divide-zinc-700">
|
||||||
|
{/* Details */}
|
||||||
|
<div className="flex gap-5 items-center">
|
||||||
|
{/* Player Head */}
|
||||||
|
<Image
|
||||||
|
src={parts[SkinPart.HEAD]}
|
||||||
|
alt={`${username}'s Head`}
|
||||||
|
width={128}
|
||||||
|
height={128}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* Name & Unique ID */}
|
||||||
|
<div className="flex flex-col gap-1.5">
|
||||||
|
<h1 className="text-xl font-bold text-minecraft-green-3">{username}</h1>
|
||||||
|
<code className="text-zinc-300">{uniqueId}</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Skin Parts */}
|
||||||
|
<div className="pt-3 w-[90%] flex flex-col gap-3">
|
||||||
|
{/* Header */}
|
||||||
|
<h1 className="font-semibold uppercase">Skin Parts</h1>
|
||||||
|
|
||||||
|
{/* Skin Parts */}
|
||||||
|
<div className="flex gap-5">
|
||||||
|
{Object.entries(parts)
|
||||||
|
.filter(
|
||||||
|
([part]) =>
|
||||||
|
part === SkinPart.HEAD ||
|
||||||
|
part === SkinPart.FACE ||
|
||||||
|
part === SkinPart.BODY_FLAT
|
||||||
|
)
|
||||||
|
.map(([part, url], index) => (
|
||||||
|
<Link key={index} href={url} target="_blank">
|
||||||
|
<img
|
||||||
|
className="h-28 hover:scale-[1.02] transition-all transform-gpu"
|
||||||
|
src={url}
|
||||||
|
alt={`${username}'s ${part}`}
|
||||||
|
/>
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
export default PlayerResult;
|
@ -19,7 +19,7 @@
|
|||||||
--secondary: 240 3.7% 15.9%;
|
--secondary: 240 3.7% 15.9%;
|
||||||
--secondary-foreground: 0 0% 98%;
|
--secondary-foreground: 0 0% 98%;
|
||||||
|
|
||||||
--muted: 240 3.7% 15.9%;
|
--muted: 20 4% 14%;
|
||||||
--muted-foreground: 240 5% 64.9%;
|
--muted-foreground: 240 5% 64.9%;
|
||||||
|
|
||||||
--accent: 240 3.7% 15.9%;
|
--accent: 240 3.7% 15.9%;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user