import { dt } from "@scandic-hotels/common/dt" import { getReedemableCoupons } from "@scandic-hotels/trpc/routers/contentstack/reward/helpers" import { RESTAURANT_REWARD_IDS, type RestaurantRewardId, REWARD_IDS, type RewardId, } from "@scandic-hotels/trpc/types/rewards" import type { ApiReward, RedeemableCoupon, RedeemLocation, } from "@scandic-hotels/trpc/types/reward" import type { Dayjs } from "dayjs" export { getEarliestExpirationDate, getFirstRedeemableCoupon, isRestaurantOnSiteTierReward, isValidRewardId, } function isValidRewardId(id: string): id is RewardId { return Object.values(REWARD_IDS).includes(id) } function isRestaurantReward(rewardId: string): rewardId is RestaurantRewardId { return RESTAURANT_REWARD_IDS.some((id) => id === rewardId) } function redeemLocationIsOnSite( location: RedeemLocation ): location is "On-site" { return location === "On-site" } export function isTierType(type: string): type is "Tier" { return type === "Tier" } function isOnSiteTierReward(reward: ApiReward): boolean { return ( redeemLocationIsOnSite(reward.redeemLocation) && isTierType(reward.rewardType) ) } function isRestaurantOnSiteTierReward(reward: ApiReward): boolean { return isOnSiteTierReward(reward) && isRestaurantReward(reward.rewardId) } function getFirstRedeemableCoupon(reward: ApiReward): RedeemableCoupon { const sortedCoupons = getReedemableCoupons(reward).sort((a, b) => { // null values used instead of undefined, otherwise it will return current time return dt(a.expiresAt ?? null).valueOf() - dt(b.expiresAt ?? null).valueOf() }) return sortedCoupons[0] } function getEarliestExpirationDate(reward: ApiReward) { return getReedemableCoupons(reward) .map(({ expiresAt }) => expiresAt) .filter((expiresAt): expiresAt is string => !!expiresAt) .reduce((earliestDate: Dayjs | null, expiresAt) => { const expiresAtDate = dt(expiresAt) if (!earliestDate) { return expiresAtDate } return earliestDate.isBefore(expiresAtDate) ? earliestDate : expiresAtDate }, null) }