diff --git a/src/app/(stats)/player/[ign]/page.tsx b/src/app/(stats)/player/[ign]/page.tsx index f3e0e51..efc35aa 100644 --- a/src/app/(stats)/player/[ign]/page.tsx +++ b/src/app/(stats)/player/[ign]/page.tsx @@ -89,6 +89,7 @@ async function SuspendedPage({ ign: pign }: { ign: string }) { specialRank={player.rank} lastLogin={player.lastLogin} lastLogout={player.lastLogout} + prefix={player.prefix} />

{player.uuid} diff --git a/src/components/player/displayname.tsx b/src/components/player/displayname.tsx index 4416106..40b1e14 100644 --- a/src/components/player/displayname.tsx +++ b/src/components/player/displayname.tsx @@ -9,7 +9,7 @@ type MonthlyPackageRank = Player["player"]["monthlyPackageRank"] type RankColor = Player["player"]["monthlyRankColor"] export default function DisplayName( - { ign, rank, monthly, rankColor, plusColor, guildTag, tagColor, specialRank, lastLogin, lastLogout }: { + { ign, rank, monthly, rankColor, plusColor, guildTag, tagColor, specialRank, lastLogin, lastLogout, prefix }: { ign: string rank: NewPackageRank monthly: MonthlyPackageRank @@ -20,6 +20,7 @@ export default function DisplayName( specialRank: string | undefined lastLogin: number | undefined lastLogout: number | undefined + prefix: string | undefined } ) { return ( @@ -35,8 +36,9 @@ export default function DisplayName( />

- {" "} - {" "} + + {" "} + {" "}

@@ -45,14 +47,19 @@ export default function DisplayName( } function PlayerIGN( - { ign, rank, monthly, rankColor, specialRank }: { + { ign, rank, monthly, rankColor, specialRank, prefix }: { ign: string rank: NewPackageRank monthly: MonthlyPackageRank rankColor: RankColor specialRank: string | undefined + prefix: string | undefined } ) { + if (prefix === "[PIG+++]") { + return {ign} + } + if (specialRank) { if (specialRank === "YOUTUBER") { return {ign} @@ -86,14 +93,25 @@ function PlayerIGN( } function PlayerRank( - { rank, monthly, plusColor, rankColor, specialRank }: { + { rank, monthly, plusColor, rankColor, specialRank, prefix }: { rank: NewPackageRank monthly: MonthlyPackageRank plusColor?: string rankColor: RankColor specialRank: string | undefined + prefix: string | undefined } ) { + if (prefix === "[PIG+++]") { + return ( + <> + [PIG + +++ + ] + + ) + } + if (specialRank) { if (specialRank === "YOUTUBER") { return ( diff --git a/src/components/search-bar.tsx b/src/components/search-bar.tsx index 27e68e7..95cd7e0 100644 --- a/src/components/search-bar.tsx +++ b/src/components/search-bar.tsx @@ -4,13 +4,31 @@ import { Input } from "@/components/ui/input" import { cn } from "@/lib/utils" import { Search } from "lucide-react" import { useRouter } from "next/navigation" -import { useState } from "react" +import { useEffect, useRef, useState } from "react" import { Button } from "./ui/button" export function SearchBar({ navbar }: { navbar?: boolean }) { const [input, setInput] = useState("") + const ref = useRef(null) const router = useRouter() + useEffect(() => { + const controller = new AbortController() + + window.addEventListener("keydown", (ev) => { + if (!ref.current) return + + if (ev.ctrlKey && ev.key === "k") { + ev.preventDefault() + ref.current.focus() + } + }, { signal: controller.signal }) + + return () => { + controller.abort() + } + }) + async function handleSearch(e: React.FormEvent) { e.preventDefault() @@ -30,6 +48,7 @@ export function SearchBar({ navbar }: { navbar?: boolean }) { type="text" placeholder={!navbar ? "Search for a player..." : ""} className="px-5" + ref={ref} value={input} onChange={(e) => setInput(e.target.value)} onKeyDown={(e) => { diff --git a/src/lib/schema/player.ts b/src/lib/schema/player.ts index 5669926..d9a1d14 100644 --- a/src/lib/schema/player.ts +++ b/src/lib/schema/player.ts @@ -66,7 +66,8 @@ export const playerSchema = z.looseObject({ }).optional() }).optional(), rank: z.string().optional(), - eulaCoins: z.boolean().optional() + eulaCoins: z.boolean().optional(), + prefix: z.string().transform(v => v.replaceAll(/ยง[a-z]/g, "")).optional() }) })