feat(LOY-10): dynamic icons based on reward id

This commit is contained in:
Chuma McPhoy
2024-12-04 18:51:12 +01:00
parent 4210218852
commit 13551417ed
23 changed files with 829 additions and 17 deletions

View File

@@ -0,0 +1,42 @@
import { FC } from "react"
import { getIconByIconName } from "@/components/Icons/get-icon-by-icon-name"
import { IconName , IconProps } from "@/types/components/icon"
import { RewardId } from "@/types/enums/rewards"
const rewardToIconMap: Record<RewardId, IconName> = {
// Food & beverage.
[RewardId.TenPercentFood]: IconName.CroissantCoffeeEgg,
[RewardId.FifteenPercentFood]: IconName.CroissantCoffeeEgg,
[RewardId.TwoForOneBreakfast]: IconName.CutleryTwo,
[RewardId.FreeBreakfast]: IconName.CutleryOne,
[RewardId.FreeKidsDrink]: IconName.KidsMocktail,
// Monetary (or exchange for points) vouchers all use the same icon.
[RewardId.Bonus50SEK]: IconName.Voucher,
[RewardId.Bonus75SEK]: IconName.Voucher,
[RewardId.Bonus100SEK]: IconName.Voucher,
[RewardId.Bonus150SEK]: IconName.Voucher,
[RewardId.Bonus200SEK]: IconName.Voucher,
// Hotel perks.
[RewardId.EarlyCheckin]: IconName.HandKey,
[RewardId.LateCheckout]: IconName.HotelNight,
[RewardId.FreeUpgrade]: IconName.MagicWand,
[RewardId.RoomGuarantee48H]: IconName.Bed,
// Earnings.
[RewardId.EarnRate25Percent]: IconName.MoneyHand,
[RewardId.EarnRate50Percent]: IconName.MoneyHand,
[RewardId.StayBoostForKids]: IconName.Kids,
[RewardId.MemberRate]: IconName.Coin,
// Special
[RewardId.YearlyExclusiveGift]: IconName.GiftOpen,
}
export function mapRewardToIcon(rewardId: string): FC<IconProps> | null {
const iconName = rewardToIconMap[rewardId as RewardId]
return getIconByIconName(iconName) || null
}

View File

@@ -0,0 +1,32 @@
import { mapRewardToIcon } from "./data"
import { IconProps } from "@/types/components/icon"
interface RewardIconProps extends IconProps {
rewardId: string
size?: "small" | "medium" | "large"
}
// Original SVG aspect ratio is 358:202 (≈1.77:1)
const sizeMap = {
small: { width: 120, height: 68 }, // 40% of card width
medium: { width: 180, height: 102 }, // 60% of card width
large: { width: 240, height: 135 }, // 80% of card width
} as const
export function RewardIcon({
rewardId,
size = "medium",
...props
}: RewardIconProps) {
const IconComponent = mapRewardToIcon(rewardId)
if (!IconComponent) return null
return (
<IconComponent
{...props}
width={sizeMap[size].width}
height={sizeMap[size].height}
/>
)
}