Updated sidebar to be ok like fr
This commit is contained in:
@@ -14,9 +14,17 @@ type SidebarProps = {
|
||||
ign: string
|
||||
player: Player["player"]
|
||||
guild: Guild["guild"] | undefined
|
||||
rank: string | undefined
|
||||
specialRank: string | undefined
|
||||
eulaCoins: boolean | undefined
|
||||
}
|
||||
|
||||
export default function Sidebar({ level, ign, player, guild }: SidebarProps) {
|
||||
export default function Sidebar({ level, ign, player, guild, rank, specialRank, eulaCoins }: SidebarProps) {
|
||||
const levelMultiplier = getCoinMultiplier(level, rank, specialRank, eulaCoins)
|
||||
|
||||
const levelMultiplierVal = levelMultiplier.value
|
||||
const levelMultiplierText = levelMultiplier.level === true ? `(Level ${level.toFixed(1).split(".")[0]})` : `(${levelMultiplier.name})`
|
||||
|
||||
return (
|
||||
<Card className="w-1/4">
|
||||
<CardContent>
|
||||
@@ -34,7 +42,7 @@ export default function Sidebar({ level, ign, player, guild }: SidebarProps) {
|
||||
<div>
|
||||
<p>
|
||||
<span className="font-bold">{"Coin multiplier: "}</span>
|
||||
<span>{`x${getCoinMultiplier(level)} (Level ${level.toFixed(1).split(".")[0]})`}</span>
|
||||
<span>{`x${levelMultiplierVal} ${levelMultiplierText}`}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Total coins: "}</span>
|
||||
|
||||
@@ -52,7 +52,6 @@ async function SuspendedPage({ ign: pign }: { ign: string }) {
|
||||
}
|
||||
|
||||
const guild = await getGuild(uuid)
|
||||
|
||||
const level = getExactLevel(player.networkExp)
|
||||
|
||||
return (
|
||||
@@ -73,7 +72,15 @@ async function SuspendedPage({ ign: pign }: { ign: string }) {
|
||||
{player.uuid}
|
||||
</h1>
|
||||
<div className="flex gap-6 px-6 mt-8 w-full max-w-7xl">
|
||||
<Sidebar level={level} ign={pign} player={player} guild={guild ?? undefined} />
|
||||
<Sidebar
|
||||
level={level}
|
||||
ign={pign}
|
||||
player={player}
|
||||
guild={guild ?? undefined}
|
||||
rank={player.newPackageRank}
|
||||
specialRank={player.rank}
|
||||
eulaCoins={player.eulaCoins}
|
||||
/>
|
||||
{player.stats !== undefined ?
|
||||
(
|
||||
<div className="pb-4 space-y-4 w-3/4">
|
||||
|
||||
@@ -12,5 +12,14 @@ export const MULTIPLIER = [
|
||||
{ level: 125, value: 6 },
|
||||
{ level: 150, value: 6.5 },
|
||||
{ level: 200, value: 7 },
|
||||
{ level: 250, value: 8 },
|
||||
{ level: 250, value: 8 }
|
||||
]
|
||||
|
||||
export const RANKMULTIPLIER = {
|
||||
VIP: { value: 2, name: "VIP" },
|
||||
VIP_PLUS: { value: 3, name: "VIP+" },
|
||||
MVP: { value: 4, name: "MVP" },
|
||||
MVP_PLUS: { value: 5, name: "MVP+" },
|
||||
YOUTUBER: { value: 7, name: "YouTuber" }
|
||||
}
|
||||
|
||||
|
||||
@@ -1,18 +1,69 @@
|
||||
import { MULTIPLIER } from "@/data/hypixel/general"
|
||||
import { MULTIPLIER, RANKMULTIPLIER } from "@/data/hypixel/general"
|
||||
import { Player } from "@/lib/schema/player"
|
||||
|
||||
export function getCoinMultiplier(level: number) {
|
||||
if (level > MULTIPLIER[MULTIPLIER.length - 1].level) {
|
||||
return MULTIPLIER[MULTIPLIER.length - 1].value
|
||||
type ReturnType = {
|
||||
level: true
|
||||
value: number
|
||||
} | {
|
||||
level: false
|
||||
value: number
|
||||
name: string
|
||||
}
|
||||
|
||||
export function getCoinMultiplier(level: number, rank?: string, specialRank?: string, eulaCoins?: boolean): ReturnType {
|
||||
if (level > MULTIPLIER[MULTIPLIER.length - 1].level) {
|
||||
return {
|
||||
value: MULTIPLIER.at(-1)!.value,
|
||||
level: true
|
||||
} as const
|
||||
}
|
||||
|
||||
function getLevelMultiplier() {
|
||||
for (let i = MULTIPLIER.length - 1; i >= 0; i--) {
|
||||
if (level >= MULTIPLIER[i].level) {
|
||||
return MULTIPLIER[i].value
|
||||
return {
|
||||
value: MULTIPLIER.at(i)!.value,
|
||||
level: true
|
||||
} as const
|
||||
}
|
||||
}
|
||||
return {
|
||||
value: MULTIPLIER.at(0)!.value,
|
||||
level: true
|
||||
} as const
|
||||
}
|
||||
|
||||
function getSpecialMultiplier() {
|
||||
if (specialRank === "YOUTUBER") return RANKMULTIPLIER.YOUTUBER
|
||||
if (!eulaCoins) return null
|
||||
switch (rank) {
|
||||
case "VIP":
|
||||
return RANKMULTIPLIER.VIP
|
||||
case "VIP_PLUS":
|
||||
return RANKMULTIPLIER.VIP_PLUS
|
||||
case "MVP":
|
||||
return RANKMULTIPLIER.MVP
|
||||
case "MVP_PLUS":
|
||||
return RANKMULTIPLIER.MVP_PLUS
|
||||
default:
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
return MULTIPLIER[0].value
|
||||
const specialMulti = getSpecialMultiplier()
|
||||
const levelMulti = getLevelMultiplier()
|
||||
|
||||
if (!specialMulti) {
|
||||
return levelMulti
|
||||
}
|
||||
|
||||
const max = Math.max(specialMulti.value, levelMulti.value)
|
||||
|
||||
if (max === specialMulti.value) {
|
||||
return { ...specialMulti, level: false }
|
||||
} else {
|
||||
return levelMulti
|
||||
}
|
||||
}
|
||||
|
||||
export function getTotalCoins(stats: Record<string, Record<"coins", number | undefined>> | undefined) {
|
||||
|
||||
@@ -48,7 +48,8 @@ export const playerSchema = z.looseObject({
|
||||
YOUTUBE: z.string().optional()
|
||||
}).optional()
|
||||
}).optional(),
|
||||
rank: z.string().optional()
|
||||
rank: z.string().optional(),
|
||||
eulaCoins: z.boolean().optional()
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user