From 523b19ee52f094a503c4af329dac188cc0091554 Mon Sep 17 00:00:00 2001 From: Z8MB1E Date: Thu, 27 Aug 2026 18:36:11 -0400 Subject: [PATCH] feat(xp): expose experience descriptions Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- src/app/(frontend)/layout.tsx | 8 +++----- src/app/(frontend)/page.tsx | 2 +- src/utils/xp/resolveLevel.ts | 13 +++++++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/app/(frontend)/layout.tsx b/src/app/(frontend)/layout.tsx index fde806f..206f2c9 100644 --- a/src/app/(frontend)/layout.tsx +++ b/src/app/(frontend)/layout.tsx @@ -58,6 +58,7 @@ export default async function RootLayout(props: { children: React.ReactNode }) { let xpLevel: ResolvedLevel = { levelName: "Recruit", + levelDesc: "", progress: 0, currentLevelXP: 0, nextLevelXP: null, @@ -96,6 +97,7 @@ export default async function RootLayout(props: { children: React.ReactNode }) { limit: 100, select: { name: true, + description: true, requiredPoints: true, }, }), @@ -156,11 +158,7 @@ export default async function RootLayout(props: { children: React.ReactNode }) { {user && } {isLogistics && } - + ); diff --git a/src/app/(frontend)/page.tsx b/src/app/(frontend)/page.tsx index 19b14ff..73b758d 100644 --- a/src/app/(frontend)/page.tsx +++ b/src/app/(frontend)/page.tsx @@ -38,7 +38,7 @@ export default async function HomePage() { collection: "experience", sort: "requiredPoints", limit: 100, - select: { name: true, requiredPoints: true }, + select: { name: true, description: true, requiredPoints: true }, }), payload.find({ collection: "assignments", diff --git a/src/utils/xp/resolveLevel.ts b/src/utils/xp/resolveLevel.ts index 6e33639..398131c 100644 --- a/src/utils/xp/resolveLevel.ts +++ b/src/utils/xp/resolveLevel.ts @@ -1,10 +1,14 @@ +import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext"; + export type ExperienceLevel = { name: string; + description: any; requiredPoints: number; }; export type ResolvedLevel = { levelName: string; + levelDesc: string; progress: number; currentLevelXP: number; nextLevelXP: number | null; @@ -19,13 +23,11 @@ export type ResolvedLevel = { * current bracket: (xp - currentLevelXP) / (nextLevelXP - currentLevelXP). * At the max level the bar sits at 100%. */ -export function resolveLevel( - xp: number, - levels: ExperienceLevel[], -): ResolvedLevel { +export function resolveLevel(xp: number, levels: ExperienceLevel[]): ResolvedLevel { if (levels.length === 0) { return { levelName: "Unknown", + levelDesc: "Could not retrieve description.", progress: 0, currentLevelXP: 0, nextLevelXP: null, @@ -60,6 +62,9 @@ export function resolveLevel( return { levelName: current.name, + levelDesc: + convertLexicalToPlaintext({ data: current.description }) || + "Failed to retrieve description!", progress: Math.min(Math.max(progress, 0), 100), currentLevelXP, nextLevelXP,