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
58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
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 }
|
|
}
|