Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@ export async function generateMetadata(): Promise<Metadata> {
notFound()
}

const title = `${activity.name}: ${version.name} Community Race Leaderboard`
const description = `View community race placements for ${version.name} in ${activity.name}`
const title = `${activity.name}: ${version.name} Gauntlet Race Leaderboard`
const description = `View gauntlet race placements for ${version.name} in ${activity.name}`

return {
title,
description,
keywords: [
activity.name,
version.name,
"community race",
"gauntlet race",
"pantheon",
...baseMetadata.keywords
],
Expand Down Expand Up @@ -59,7 +59,7 @@ export default async function Page({ searchParams }: { searchParams: Record<stri
<Splash
tertiaryTitle={activity.name}
title={version.name}
subtitle="Community Race Leaderboard">
subtitle="Gauntlet Race Leaderboard">
<CloudflareActivitySplash
activityId={version.associatedActivityId}
versionId={version.id}
Expand Down
17 changes: 15 additions & 2 deletions src/app/pgcr/[instanceId]/opengraph-image.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { notFound } from "next/navigation"
import { ImageResponse } from "next/og"
import { FallbackSplash } from "~/components/CloudflareImage"
import { formatLeaderboardRaceLabel } from "~/lib/pgcr/leaderboard-tag"
import { getMetaData, prefetchActivity } from "~/lib/pgcr/server"
import { type PGCRPageProps } from "~/lib/pgcr/types"
import { saferFetch } from "~/lib/server/saferFetch"
Expand Down Expand Up @@ -30,6 +31,18 @@ export default async function Image({ params: { instanceId } }: PGCRPageProps) {
}

const { ogTitle, dateString } = getMetaData(activity)
const raceLabel = formatLeaderboardRaceLabel(
{
isGauntletRace: activity.isGauntletRace,
isDayOne: activity.isDayOne,
isContest: activity.isContest,
isPantheon: activity.isPantheon,
versionId: activity.versionId,
leaderboardRank: activity.leaderboardRank,
versionName: activity.metadata.versionName
},
versionId => manifest.versionDefinitions[versionId]?.isChallengeMode ?? false
)
const imageVariants = manifest.splashUrls[activity.activityId]
const backgroundImageUrl =
imageVariants?.find(v => v.size === "medium")?.url ??
Expand Down Expand Up @@ -225,15 +238,15 @@ export default async function Image({ params: { instanceId } }: PGCRPageProps) {
justifyContent: "center",
alignItems: "center"
}}>
{activity.leaderboardRank && (
{raceLabel && (
<div
style={{
backgroundColor: "rgb(201, 125, 2)",
color: "white",
padding: 4,
borderRadius: 4
}}>
{activity.metadata.versionName + " #" + activity.leaderboardRank}
{raceLabel}
</div>
)}
</div>
Expand Down
17 changes: 16 additions & 1 deletion src/app/pgcr/[instanceId]/server.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { notFound } from "next/navigation"
import { getPgcrShortActivityName } from "~/lib/pgcr/formatting"
import { formatLeaderboardRaceLabel } from "~/lib/pgcr/leaderboard-tag"
import { Tag } from "~/models/tag"
import { RaidHubError } from "~/services/raidhub/RaidHubError"
import { getRaidHubApi } from "~/services/raidhub/common"
Expand Down Expand Up @@ -48,7 +49,21 @@ export const getMetaData = (activity: RaidHubInstanceExtended) => {
: "completed on"
: "attempted on"

const placementSuffix = activity.leaderboardRank ? `#${activity.leaderboardRank}` : null
const raceLabel = formatLeaderboardRaceLabel(
{
isGauntletRace: activity.isGauntletRace,
isDayOne: activity.isDayOne,
isContest: activity.isContest,
isPantheon: activity.isPantheon,
versionId: activity.versionId,
leaderboardRank: activity.leaderboardRank,
versionName: activity.metadata.versionName
},
() => false
)

const placementSuffix =
raceLabel ?? (activity.leaderboardRank ? `#${activity.leaderboardRank}` : null)

const dateCompleted = new Date(activity.dateCompleted)

Expand Down
23 changes: 21 additions & 2 deletions src/components/__deprecated__/profile/raids/RaceTagLabel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import styles from "./raids.module.css"
/** @deprecated */
const RaceTagLabel = ({
rank,
isGauntletRace,
versionLabel,
isChallenge,
isDayOne,
isContest,
Expand All @@ -16,6 +18,8 @@ const RaceTagLabel = ({
}: {
rank: number | null
instanceId: string
isGauntletRace?: boolean
versionLabel?: string | null
isChallenge: boolean
isDayOne: boolean
isContest: boolean
Expand All @@ -24,6 +28,8 @@ const RaceTagLabel = ({
}) => {
const label = useRaceLabel({
rank,
isGauntletRace,
versionLabel,
isChallenge,
isDayOne,
isContest,
Expand All @@ -49,24 +55,37 @@ const RaceTagLabel = ({

const useRaceLabel = (props: {
rank: number | null
isGauntletRace?: boolean
versionLabel?: string | null
isChallenge: boolean
isDayOne: boolean
isContest: boolean
isWeekOne: boolean
}): string | null => {
const tag = useMemo(() => {
if (props.isChallenge) {
if (props.isGauntletRace) {
return Tag.GAUNTLET_RACE
} else if (props.isChallenge) {
return Tag.CHALLENGE
} else if (props.isDayOne) {
return Tag.DAY_ONE
} else if (props.isContest) {
return Tag.CONTEST
} else if (props.isWeekOne) {
return Tag.WEEK_ONE
} else if (props.versionLabel) {
return props.versionLabel
} else {
return null
}
}, [props.isChallenge, props.isDayOne, props.isContest, props.isWeekOne])
}, [
props.isGauntletRace,
props.versionLabel,
props.isChallenge,
props.isDayOne,
props.isContest,
props.isWeekOne
])

if (tag) {
return `${tag}${props.rank ? ` #${props.rank}` : ""}`
Expand Down
14 changes: 13 additions & 1 deletion src/components/__deprecated__/profile/raids/RaidCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,12 @@ export default function RaidCard({
leaderboardEntry,
isExpanded
}: {
leaderboardEntry: RaidHubWorldFirstEntry | null
leaderboardEntry:
| (Omit<RaidHubWorldFirstEntry, "rank"> & {
rank: number | null
versionLabel?: string | null
})
| null
isExpanded?: boolean
}) {
const { activities, isLoadingActivities, raidId, versionId } = useRaidCardContext()
Expand Down Expand Up @@ -90,6 +95,7 @@ export default function RaidCard({

return {
instanceId: instance.instanceId,
isGauntletRace: false,
isDayOne: instance.isDayOne,
isWeekOne: instance.isWeekOne,
isContest: instance.isContest,
Expand Down Expand Up @@ -173,6 +179,12 @@ export default function RaidCard({
<RaceTagLabel
rank={firstContestClear.rank}
instanceId={firstContestClear.instanceId}
isGauntletRace={firstContestClear.isGauntletRace}
versionLabel={
"versionLabel" in firstContestClear
? firstContestClear.versionLabel
: null
}
isChallenge={firstContestClear.isChallengeMode}
isDayOne={firstContestClear.isDayOne}
isContest={firstContestClear.isContest}
Expand Down
2 changes: 1 addition & 1 deletion src/components/home/HomeBuckets.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ function RaidCard({ raid }: { raid: RaidHubActivityDefinition }) {

const PANTHEON_COMMUNITY_RACE_LINK: LinkItem = {
href: "/leaderboards/team/custom/pantheon-community-race",
label: "Community Race",
label: "Gauntlet Race",
accent: "gold"
}

Expand Down
6 changes: 3 additions & 3 deletions src/components/pgcr/pgcr-tags.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ export const PGCRTags = () => {
return (
!!tags.length && (
<div className="flex gap-1 md:gap-2">
{tags.map(({ tag, placement }) => (
{tags.map(({ tag, placement, key }) => (
<Badge
key={tag}
key={key}
variant="secondary"
className="bg-raidhub/90 text-sm text-gray-200">
{tag}
{placement && (
{placement != null && (
<span className="text text-foreground text-sm font-medium">{` #${placement}`}</span>
)}
</Badge>
Expand Down
107 changes: 102 additions & 5 deletions src/components/profile/raids/PantheonLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,98 @@ import { useCallback, useMemo } from "react"
import { Grid } from "~/components/__deprecated__/layout/Grid"
import RaidCard from "~/components/__deprecated__/profile/raids/RaidCard"
import { useRaidHubManifest } from "~/components/providers/RaidHubManifestManager"
import { type RaidHubInstanceForPlayer } from "~/services/raidhub/types"
import { suppressesDayOnePlacement } from "~/lib/pgcr/leaderboard-tag"
import {
type RaidHubGauntletRaceEntry,
type RaidHubInstanceForPlayer,
type RaidHubPantheonVersionFirstEntry,
type RaidHubWorldFirstEntry
} from "~/services/raidhub/types"
import { RaidCardContext } from "./RaidCardContext"

const toGauntletRaceLeaderboardEntry = (
entry: RaidHubGauntletRaceEntry,
activityId: number
): RaidHubWorldFirstEntry => ({
activityId,
instanceId: entry.instanceId,
timeAfterLaunch: 0,
rank: entry.rank,
isDayOne: false,
isContest: false,
isWeekOne: false,
isChallengeMode: false,
isGauntletRace: true
})

const toPantheonVersionFirstLeaderboardEntry = (
entry: RaidHubPantheonVersionFirstEntry,
activityId: number,
versionLabel: string
): Omit<RaidHubWorldFirstEntry, "rank"> & {
rank: number | null
versionLabel?: string | null
} => ({
activityId,
instanceId: entry.instanceId,
timeAfterLaunch: 0,
rank: entry.isDayOne && suppressesDayOnePlacement(entry.versionId) ? null : entry.rank,
isDayOne: entry.isDayOne,
isContest: false,
isWeekOne: false,
isChallengeMode: false,
isGauntletRace: false,
versionLabel: entry.isDayOne ? null : versionLabel
})

const resolvePantheonLeaderboardEntry = (
mode: number,
activityId: number,
gauntletRaceEntry: RaidHubGauntletRaceEntry | null,
pantheonVersionFirstEntries: Collection<number, RaidHubPantheonVersionFirstEntry>,
getVersionString: (versionId: number) => string
):
| (Omit<RaidHubWorldFirstEntry, "rank"> & {
rank: number | null
versionLabel?: string | null
})
| null => {
const versionFirst = pantheonVersionFirstEntries.get(mode) ?? null
const gauntlet = gauntletRaceEntry?.versionId === mode ? gauntletRaceEntry : null

if (gauntlet) {
return toGauntletRaceLeaderboardEntry(gauntlet, activityId)
}

if (versionFirst) {
return toPantheonVersionFirstLeaderboardEntry(
versionFirst,
activityId,
getVersionString(mode)
)
}

return null
}

const PantheonModeGrid = ({
modes,
instancesByMode,
isLoading,
isExpanded,
getActivityIdForVersion
getActivityIdForVersion,
gauntletRaceEntry,
pantheonVersionFirstEntries,
getVersionString
}: {
modes: readonly number[]
instancesByMode: Collection<number, Collection<string, RaidHubInstanceForPlayer>> | null
isLoading: boolean
isExpanded: boolean
getActivityIdForVersion: (versionId: number) => number
gauntletRaceEntry: RaidHubGauntletRaceEntry | null
pantheonVersionFirstEntries: Collection<number, RaidHubPantheonVersionFirstEntry>
getVersionString: (versionId: number) => string
}) => (
<Grid as="section" $minCardWidth={325} $minCardWidthMobile={300} $fullWidth $relative>
{modes
Expand All @@ -29,7 +106,16 @@ const PantheonModeGrid = ({
isLoadingActivities={isLoading}
raidId={getActivityIdForVersion(mode)}
versionId={mode}>
<RaidCard leaderboardEntry={null} isExpanded={isExpanded} />
<RaidCard
leaderboardEntry={resolvePantheonLeaderboardEntry(
mode,
getActivityIdForVersion(mode),
gauntletRaceEntry,
pantheonVersionFirstEntries,
getVersionString
)}
isExpanded={isExpanded}
/>
</RaidCardContext>
))}
</Grid>
Expand All @@ -38,17 +124,22 @@ const PantheonModeGrid = ({
export const PantheonLayout = ({
instances,
isLoading,
isExpanded
isExpanded,
gauntletRaceEntry,
pantheonVersionFirstEntries
}: {
instances: Collection<string, RaidHubInstanceForPlayer>[]
isExpanded: boolean
isLoading: boolean
gauntletRaceEntry: RaidHubGauntletRaceEntry | null
pantheonVersionFirstEntries: Collection<number, RaidHubPantheonVersionFirstEntry>
}) => {
const {
activePantheonVersions,
pantheonSunsetVersions,
versionDefinitions,
activePantheonIds
activePantheonIds,
getVersionString
} = useRaidHubManifest()

const getActivityIdForVersion = useCallback(
Expand Down Expand Up @@ -78,6 +169,9 @@ export const PantheonLayout = ({
isLoading={isLoading}
isExpanded={isExpanded}
getActivityIdForVersion={getActivityIdForVersion}
gauntletRaceEntry={gauntletRaceEntry}
pantheonVersionFirstEntries={pantheonVersionFirstEntries}
getVersionString={getVersionString}
/>
{pantheonSunsetVersions.length > 0 && (
<div>
Expand All @@ -90,6 +184,9 @@ export const PantheonLayout = ({
isLoading={isLoading}
isExpanded={isExpanded}
getActivityIdForVersion={getActivityIdForVersion}
gauntletRaceEntry={gauntletRaceEntry}
pantheonVersionFirstEntries={pantheonVersionFirstEntries}
getVersionString={getVersionString}
/>
</div>
)}
Expand Down
Loading
Loading