Files
web/apps/scandic-web/components/MyPages/LevelProgressCard/utils.ts
Chuma Mcphoy (We Ahead) 5bbd7eb9ab Merged in fix/LOY-359-use-scandic-native-tier-data (pull request #2846)
fix(LOY-359): Always use scandic native tier data for all level related data

* fix(LOY-359): Always use scandic native tier data for all level related data


Approved-by: Erik Tiekstra
Approved-by: Matilda Landström
2025-09-24 13:50:32 +00:00

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 { NativeFriendsMembership } from "@scandic-hotels/trpc/types/user"
export async function getLevelProgressData(
membership: NonNullable<NativeFriendsMembership>
): Promise<LevelProgressData> {
const caller = await serverClient()
const currentLevel = await caller.contentstack.loyaltyLevels.byLevel({
level: MembershipLevelEnum[membership.tier],
})
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.tier)) {
return toKeepCurrent
? {
type: "highest-incomplete",
earned,
toKeepCurrent,
required: currentLevel!.required_points,
}
: { type: "highest-complete", earned }
}
return {
type: "lower-level",
earned,
toNext: membership.pointsToNextTier ?? 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 }
}