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()
})
})