1
0
Fork 0

feat(xp): expose experience descriptions

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Jason Fraley 2026-08-27 18:36:11 -04:00
parent 21f61ca33f
commit 523b19ee52
3 changed files with 13 additions and 10 deletions

View file

@ -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 && <GameTickRealtime />}
{isLogistics && <ShipmentToasts />}
<Toaster />
<ShimLoader
shims={shimEntries}
userId={user?.id ?? null}
userRoles={user?.roles ?? []}
/>
<ShimLoader shims={shimEntries} userId={user?.id ?? null} userRoles={user?.roles ?? []} />
</body>
</html>
);

View file

@ -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",

View file

@ -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,