Merged in feat/LOY-354-L7-Progress-Card (pull request #2786)

Feat/LOY-354 L7 Progress Card

* feat(LOY-354): Add Trophy icon

* fix(LOY-354): include new tierPoints value

* feat(LOY-354): L7 Progress Level Card support

* refactor(LOY-354): Refactoring of component structure

* fix(LOY-354): Remove intl prop drilling

* fix(LOY-354): cleanup progress section code


Approved-by: Erik Tiekstra
This commit is contained in:
Chuma Mcphoy (We Ahead)
2025-09-15 11:48:18 +00:00
parent 295e98a560
commit 0737f4fb78
29 changed files with 388 additions and 285 deletions
@@ -0,0 +1,57 @@
import { MembershipLevelEnum } from "@scandic-hotels/common/constants/membershipLevels"
import { serverClient } from "@/lib/trpc/server"
import { isHighestMembership } from "@/utils/user"
import { type LevelProgressData, type ProgressCalculation } from "./types"
import type { FriendsMembership } from "@scandic-hotels/trpc/types/user"
export async function getLevelProgressData(
membership: NonNullable<FriendsMembership>
): Promise<LevelProgressData> {
const caller = await serverClient()
const currentLevel = await caller.contentstack.loyaltyLevels.byLevel({
level: MembershipLevelEnum[membership.membershipLevel],
})
const earned = membership.tierPoints ?? 0
// Check if user has points left to retain their current level.
const toKeepCurrent =
currentLevel?.required_points && earned < currentLevel.required_points
? currentLevel.required_points - earned
: undefined
if (isHighestMembership(membership.membershipLevel)) {
return toKeepCurrent
? {
type: "highest-incomplete",
earned,
toKeepCurrent,
required: currentLevel!.required_points,
}
: { type: "highest-complete", earned }
}
return {
type: "lower-level",
earned,
toNext: membership.pointsRequiredToNextlevel ?? 0,
toKeepCurrent,
}
}
export function calculateProgress(
earned: number,
total: number,
keepThreshold?: number
): ProgressCalculation {
const percentage = (earned / total) * 100
const markerPosition = keepThreshold
? ((earned + keepThreshold) / total) * 100
: undefined
return { percentage, markerPosition, total }
}