From c2790054db10754a84f0ad3bd38516461c056ded Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 22 Apr 2024 21:08:44 +0100 Subject: [PATCH] start work on cleaning up types and add try a player and server to their pages --- public/media/platform/bedrock.png | Bin 0 -> 2305 bytes public/media/platform/java.png | Bin 0 -> 2978 bytes src/app/(pages)/page.tsx | 31 +--------- src/app/(pages)/player/[[...id]]/page.tsx | 21 ++++--- .../[platform]/[[...hostname]]/page.tsx | 27 +++++---- src/app/components/player/try-a-player.tsx | 49 ++++++++++++++++ src/app/components/server/try-a-server.tsx | 54 ++++++++++++++++++ src/app/types/landing/landing-button.tsx | 27 +++++++++ src/app/types/player/page-params.ts | 5 ++ src/app/types/server/page-params.ts | 8 +++ src/app/types/server/try-me-server.ts | 13 +++++ 11 files changed, 186 insertions(+), 49 deletions(-) create mode 100644 public/media/platform/bedrock.png create mode 100644 public/media/platform/java.png create mode 100644 src/app/components/player/try-a-player.tsx create mode 100644 src/app/components/server/try-a-server.tsx create mode 100644 src/app/types/landing/landing-button.tsx create mode 100644 src/app/types/player/page-params.ts create mode 100644 src/app/types/server/page-params.ts create mode 100644 src/app/types/server/try-me-server.ts diff --git a/public/media/platform/bedrock.png b/public/media/platform/bedrock.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4feb8398f17eecfb57e4b63f76babc728a1640 GIT binary patch literal 2305 zcmV+c3I6tpP)=r3kwS$A0I|6Ff=qYMn*;~EG#fEFgG_h9v&VkDJdr>CtY1#LPA0#BO^XOK21$c zRaI3=N=igTL{Lyrb8~Zecz8QIJ0Kt+SXfv&IXO~NQfFspY;0_LdU|4FVj3D62L}fZ z4h~vcT9cEL6ciMWj*fzYf{BTVM{rDSv!F5n002F7QchC<(v#AYa&j7zanh608gY}- zQ_|AX(EtDc|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|Ns902S*0J000NP zNklzRtea zvmtfp-C=nu1kcB}H_r$ks-e|$+v+wiP=Sz}HG&(k8J6SoPqRqj0dJlzgEwJM2#({S zdpXA9GP`{`T|fS-v~J%1Df*n�-^NG9suqgb)A_T3+VyGNeK-L-^;8;B+GEJRdJ( z&H2K{(s06Q1v)ukTmZJ9b9FwIj{hAZ$wo(Ed_GrmheO?fF#+VZC1L~QFwx!FK&DW_A>G$Abfghege1C~<Erf75 zxxbu8oL97YKt00uPIz5jPg4(Fm8XjayQcsA{eJ-O4dJQbG+eIUGA@8NoiBkFj`)2R z+hY1Q&-;G9B#1i4KS6L&zqtpXBx9U(KzGN{IYPjNE`(avO^oOB7>J1dT;`tB}j-x zBs@$|?q#RtG*gOJR9+ZNM9CJ~9fxfi#hH8rFrgeGQ{d-R1(MVgN{Ih5>IoG@lGIrh zQCA~d3}sRt3h%JT60Du4YKShB*GUHx3P{iotxJ6e#Nc?sz6@=!4D=DXs#=gI95gHQ z<5Z1%S(V!7cnY6w2bcw&!)5GgemPywr>S20HWs_xT;4qe$m>jT=oHVCA8v=D&lhO8 zt4VT}YpL}(v~xMgt=C%Tg!etmo&XFb6>QneSWQ#Da`;caS8$a+b)?%b=Uw=s*!Nw@ zT;~)G7n!u`(-Qz64cpMQaniD`+6bM5qKB6BPzc(~)e58a&TVi4^jX<(zTN}8F~c+z zl-AZNG(Mx%99fbUUKJVw9tyHFBmkhUv*s?G?rysWc*W>A&BRf;ai(0}SJg;?z=#RX zwbey4X+@!R(SnZMP2s)R z4t_7BZv*9qb}Unk@Z~V)%II>~7LsMoQz9FTl=cX>HAK#7tNYF_+wxGtx2l3(sR2YL z=7C1xs4tc!I^v>0QM)d{aFbCD#j`f2DW}jqkodkGOHTu(L}iNAE>a;3b*=yuIz}Rr zUsq)0J!_;j9m!Hj&OYcMh8(sP5+z+sq6N@s-0ur<4T%jP45}ZPp|;7@`(=7Y@&Raf^#2VyDQihCxJTyP4BIACj_(IH%m4w6_vV*#1V=0_T z1=D$uvcq{IV@@z*1k2>o0Ra{#gBxhWKdn5>8XAI>Insw|D`>i^G#AFg2=Fp+ z5KefO%*5n6($+mn8CFhVNm<{bh>o|@=%K|32*I$^JV^>}V8jGDk$|g5D0EwAPc{>; zBki(wDs#hEHdJ>IepK+l-Vr6cV6pVbv0B!)p%$J(Xiqm&#_J9$C`<4rX@3XN1=0j) zzH7F=w@HWFx-eWp2!kwmcvPa!8FZL+wAhj5Vq$bq(ztt?!f9?dxQb*9qttnU@j@Hi z|4F%o`=u<<1ace!z6CM{H|Dg-c!Fl44I`r4sUtPoJ9) zfXK%RshFXhy{Ov=yKS(M+xWaMr&|cBL(P17D`mr#JeFR6eD+5uAaFS#sS%@toso2B z{rpScuy@kJNQUlqlPrI}{pBx5Ky?3|l7bqzRuW((tMAIn2&x{))ea2{1w~O-iu&)I bgtP+yLJfN)mno(k00000NkvXXu0mjfK4mq6 literal 0 HcmV?d00001 diff --git a/public/media/platform/java.png b/public/media/platform/java.png new file mode 100644 index 0000000000000000000000000000000000000000..3036471e73429eec2ed4c1904d5aa9f2fc38e7fc GIT binary patch literal 2978 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 { +export async function generateViewport({ params: { id } }: PlayerPageParams): Promise { const validPlayer = await isValidPlayer(id); return { themeColor: validPlayer ? Colors.green : Colors.red, }; } -export async function generateMetadata({ params: { id } }: Params): Promise { +export async function generateMetadata({ params: { id } }: PlayerPageParams): Promise { // No id provided if (!id || id.length === 0) { return generateEmbed({ @@ -55,7 +55,7 @@ export async function generateMetadata({ params: { id } }: Params): Promise { +export default async function Page({ params: { id } }: PlayerPageParams): Promise { let error: string | undefined = undefined; // The error to display let player: CachedPlayer | undefined = undefined; // The player to display @@ -98,6 +98,9 @@ export default async function Page({ params: { id } }: Params): Promise )} + + {/* Try a Player */} + {player == null && !error && } ); } diff --git a/src/app/(pages)/server/[platform]/[[...hostname]]/page.tsx b/src/app/(pages)/server/[platform]/[[...hostname]]/page.tsx index 4994e59..615d2e7 100644 --- a/src/app/(pages)/server/[platform]/[[...hostname]]/page.tsx +++ b/src/app/(pages)/server/[platform]/[[...hostname]]/page.tsx @@ -5,7 +5,6 @@ import { ServerView } from "@/app/components/server/server-view"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger } from "@/app/components/ui/context-menu"; import { Colors } from "@/app/common/colors"; import { generateEmbed } from "@/app/common/embed"; -import { formatNumber } from "@/app/common/number-utils"; import { isValidServer } from "@/app/common/server"; import { capitalizeFirstLetter } from "@/app/common/string-utils"; import config from "@root/config.json"; @@ -19,16 +18,16 @@ import { import { Metadata, Viewport } from "next"; import { ReactElement } from "react"; import { Title } from "@/app/components/title"; +import { Card } from "@/app/components/card"; +import Link from "next/link"; +import Image from "next/image"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/app/components/ui/tooltip"; +import { TryMeServer } from "@/app/types/server/try-me-server"; +import { ServerPageParams } from "@/app/types/server/page-params"; +import { TryAServer } from "@/app/components/server/try-a-server"; export const revalidate = 60; -type Params = { - params: { - platform: ServerPlatform; - hostname: string; - }; -}; - /** * Gets the favicon for a server * @@ -57,14 +56,14 @@ function checkPlatform(platform: ServerPlatform): boolean { return platform === ServerPlatform.Java || platform === ServerPlatform.Bedrock; } -export async function generateViewport({ params: { platform, hostname } }: Params): Promise { +export async function generateViewport({ params: { platform, hostname } }: ServerPageParams): Promise { const validPlayer = await isValidServer(platform, hostname); return { themeColor: validPlayer || !platform ? Colors.green : Colors.red, }; } -export async function generateMetadata({ params: { platform, hostname } }: Params): Promise { +export async function generateMetadata({ params: { platform, hostname } }: ServerPageParams): Promise { if (!checkPlatform(platform)) { // Invalid platform return generateEmbed({ @@ -100,7 +99,7 @@ export async function generateMetadata({ params: { platform, hostname } }: Param } } -export default async function Page({ params: { platform, hostname } }: Params): Promise { +export default async function Page({ params: { platform, hostname } }: ServerPageParams): Promise { let error: string | undefined = undefined; // The error to display let server: CachedJavaMinecraftServer | CachedBedrockMinecraftServer | undefined = undefined; // The server to display let invalidPlatform: boolean = !checkPlatform(platform); // Whether the platform is invalid @@ -129,7 +128,10 @@ export default async function Page({ params: { platform, hostname } }: Params): + {/* An errored occurred when looking up the server */} {error && } + + {/* The server */} {server != null && ( @@ -147,6 +149,9 @@ export default async function Page({ params: { platform, hostname } }: Params): )} + + {/* Try a Server */} + {server == null && !error && } ); } diff --git a/src/app/components/player/try-a-player.tsx b/src/app/components/player/try-a-player.tsx new file mode 100644 index 0000000..e754e07 --- /dev/null +++ b/src/app/components/player/try-a-player.tsx @@ -0,0 +1,49 @@ +import { ReactElement } from "react"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/app/components/ui/tooltip"; +import Image from "next/image"; +import config from "@root/config.json"; +import Link from "next/link"; +import { Card } from "@/app/components/card"; + +/** + * The players to try out. + */ +const tryMePlayers: string[] = ["Notch", "jeb_", "Dinnerbone", "Grumm", "Mojang"]; + +export function TryAPlayer(): ReactElement { + return ( + +
+
+

Try a Player

+

Try one of these players to see how the player view works.

+
+ +
+ {tryMePlayers.map(playerName => ( + + +
+ {"The + + {playerName} + +
+
+ +

+ Click to try the player {playerName}. +

+
+
+ ))} +
+
+
+ ); +} diff --git a/src/app/components/server/try-a-server.tsx b/src/app/components/server/try-a-server.tsx new file mode 100644 index 0000000..19bdbd4 --- /dev/null +++ b/src/app/components/server/try-a-server.tsx @@ -0,0 +1,54 @@ +import { ReactElement } from "react"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/app/components/ui/tooltip"; +import Image from "next/image"; +import Link from "next/link"; +import { capitalizeFirstLetter } from "@/app/common/string-utils"; +import { Card } from "@/app/components/card"; +import { ServerPlatform } from "mcutils-library"; +import { TryMeServer } from "@/app/types/server/try-me-server"; + +/** + * The servers to try out. + */ +const tryMeServers: TryMeServer[] = [ + { platform: ServerPlatform.Java, hostname: "mc.hypixel.net" }, + { platform: ServerPlatform.Java, hostname: "wildprison.net" }, + { platform: ServerPlatform.Java, hostname: "cubecraft.net" }, + { platform: ServerPlatform.Bedrock, hostname: "geo.hivebedrock.network" }, +]; + +export function TryAServer(): ReactElement { + return ( + +
+
+

Try a Server

+

Try one of these servers to see how the server view works.

+
+ +
+ {tryMeServers.map(({ platform, hostname }) => ( + + +
+ {"The + + {hostname} + +
+
+ +

+ Click to try the {capitalizeFirstLetter(platform)} server: {hostname} +

+
+
+ ))} +
+
+
+ ); +} diff --git a/src/app/types/landing/landing-button.tsx b/src/app/types/landing/landing-button.tsx new file mode 100644 index 0000000..245641a --- /dev/null +++ b/src/app/types/landing/landing-button.tsx @@ -0,0 +1,27 @@ +export type LandingButton = { + /** + * The title of the button. + */ + title: string; + + /** + * The tooltip to display for this statistic. + */ + tooltip: string; + + /** + * The URL to go to. + */ + url: string; + + /** + * Whether clicking the button will + * open the link in a new tab. + */ + openInNewTab?: boolean; + + /** + * The class name to apply to the button. + */ + className?: string; +}; diff --git a/src/app/types/player/page-params.ts b/src/app/types/player/page-params.ts new file mode 100644 index 0000000..1a1648f --- /dev/null +++ b/src/app/types/player/page-params.ts @@ -0,0 +1,5 @@ +export type PlayerPageParams = { + params: { + id: string; + }; +}; diff --git a/src/app/types/server/page-params.ts b/src/app/types/server/page-params.ts new file mode 100644 index 0000000..06fc758 --- /dev/null +++ b/src/app/types/server/page-params.ts @@ -0,0 +1,8 @@ +import { ServerPlatform } from "mcutils-library"; + +export type ServerPageParams = { + params: { + platform: ServerPlatform; + hostname: string; + }; +}; diff --git a/src/app/types/server/try-me-server.ts b/src/app/types/server/try-me-server.ts new file mode 100644 index 0000000..208852c --- /dev/null +++ b/src/app/types/server/try-me-server.ts @@ -0,0 +1,13 @@ +import { ServerPlatform } from "mcutils-library"; + +export type TryMeServer = { + /** + * The platform of the server. + */ + platform: ServerPlatform; + + /** + * The hostname of the server. + */ + hostname: string; +};