Merged in feat/LOY-134-add-informative-reward-modal (pull request #1307)

feat(LOY-134): display informative rewards and modal

Approved-by: Chuma Mcphoy (We Ahead)
This commit is contained in:
Christian Andolf
2025-02-13 10:13:35 +00:00
9 changed files with 78 additions and 59 deletions

View File

@@ -45,6 +45,8 @@ export default function Tier({
{reward.label} {reward.label}
</Title> </Title>
{reward.redeemLocation !== "Non-redeemable" ? (
<>
{redeemStep === "initial" && ( {redeemStep === "initial" && (
<Body textAlign="center">{reward.description}</Body> <Body textAlign="center">{reward.description}</Body>
)} )}
@@ -58,8 +60,14 @@ export default function Tier({
membershipNumber && ( membershipNumber && (
<MembershipNumberBadge membershipNumber={membershipNumber} /> <MembershipNumberBadge membershipNumber={membershipNumber} />
)} )}
</>
) : (
<Body textAlign="center">{reward.redeem_description}</Body>
)}
</div> </div>
{reward.redeemLocation !== "Non-redeemable" ? (
<>
{redeemStep === "initial" && ( {redeemStep === "initial" && (
<footer className={styles.modalFooter}> <footer className={styles.modalFooter}>
<Button <Button
@@ -92,5 +100,7 @@ export default function Tier({
</footer> </footer>
)} )}
</> </>
) : null}
</>
) )
} }

View File

@@ -51,7 +51,9 @@ export default function Redeem({ reward, membershipNumber }: RedeemProps) {
onOpenChange={(isOpen) => setAnimation(isOpen ? "visible" : "hidden")} onOpenChange={(isOpen) => setAnimation(isOpen ? "visible" : "hidden")}
> >
<Button intent="primary" fullWidth> <Button intent="primary" fullWidth>
{intl.formatMessage({ id: "Open" })} {reward.redeemLocation === "Non-redeemable"
? intl.formatMessage({ id: "How to use" })
: intl.formatMessage({ id: "Open" })}
</Button> </Button>
<MotionOverlay <MotionOverlay
className={styles.overlay} className={styles.overlay}

View File

@@ -255,6 +255,7 @@
"Hours": "Tider", "Hours": "Tider",
"How do you want to sleep?": "Hvordan vil du sove?", "How do you want to sleep?": "Hvordan vil du sove?",
"How it works": "Hvordan det virker", "How it works": "Hvordan det virker",
"How to use": "Sådan bruges",
"Hurry up and use them before they expire!": "Skynd dig og brug dem, før de udløber!", "Hurry up and use them before they expire!": "Skynd dig og brug dem, før de udløber!",
"I accept": "Jeg accepterer", "I accept": "Jeg accepterer",
"I accept the terms and conditions": "Jeg accepterer vilkårene", "I accept the terms and conditions": "Jeg accepterer vilkårene",

View File

@@ -256,6 +256,7 @@
"Hours": "Zeiten", "Hours": "Zeiten",
"How do you want to sleep?": "Wie möchtest du schlafen?", "How do you want to sleep?": "Wie möchtest du schlafen?",
"How it works": "Wie es funktioniert", "How it works": "Wie es funktioniert",
"How to use": "Wie zu verwenden",
"Hurry up and use them before they expire!": "Beeilen Sie sich und nutzen Sie sie, bevor sie ablaufen!", "Hurry up and use them before they expire!": "Beeilen Sie sich und nutzen Sie sie, bevor sie ablaufen!",
"I accept": "Ich akzeptiere", "I accept": "Ich akzeptiere",
"I accept the terms and conditions": "Ich akzeptiere die Geschäftsbedingungen", "I accept the terms and conditions": "Ich akzeptiere die Geschäftsbedingungen",

View File

@@ -259,6 +259,7 @@
"Hours": "Hours", "Hours": "Hours",
"How do you want to sleep?": "How do you want to sleep?", "How do you want to sleep?": "How do you want to sleep?",
"How it works": "How it works", "How it works": "How it works",
"How to use": "How to use",
"Hurry up and use them before they expire!": "Hurry up and use them before they expire!", "Hurry up and use them before they expire!": "Hurry up and use them before they expire!",
"I accept": "I accept", "I accept": "I accept",
"I accept the terms and conditions": "I accept the terms and conditions", "I accept the terms and conditions": "I accept the terms and conditions",

View File

@@ -255,6 +255,7 @@
"Hours": "Ajat", "Hours": "Ajat",
"How do you want to sleep?": "Kuinka haluat nukkua?", "How do you want to sleep?": "Kuinka haluat nukkua?",
"How it works": "Kuinka se toimii", "How it works": "Kuinka se toimii",
"How to use": "Kuinka käyttää",
"Hurry up and use them before they expire!": "Ole nopea ja käytä ne ennen kuin ne vanhenevat!", "Hurry up and use them before they expire!": "Ole nopea ja käytä ne ennen kuin ne vanhenevat!",
"I accept": "Hyväksyn", "I accept": "Hyväksyn",
"I accept the terms and conditions": "Hyväksyn käyttöehdot", "I accept the terms and conditions": "Hyväksyn käyttöehdot",

View File

@@ -254,6 +254,7 @@
"Hours": "Tider", "Hours": "Tider",
"How do you want to sleep?": "Hvordan vil du sove?", "How do you want to sleep?": "Hvordan vil du sove?",
"How it works": "Hvordan det fungerer", "How it works": "Hvordan det fungerer",
"How to use": "Hvordan bruke",
"Hurry up and use them before they expire!": "Skynd deg og bruk dem før de utløper!", "Hurry up and use them before they expire!": "Skynd deg og bruk dem før de utløper!",
"I accept": "Jeg aksepterer", "I accept": "Jeg aksepterer",
"I accept the terms and conditions": "Jeg aksepterer vilkårene", "I accept the terms and conditions": "Jeg aksepterer vilkårene",

View File

@@ -254,6 +254,7 @@
"Hours": "Tider", "Hours": "Tider",
"How do you want to sleep?": "Hur vill du sova?", "How do you want to sleep?": "Hur vill du sova?",
"How it works": "Hur det fungerar", "How it works": "Hur det fungerar",
"How to use": "Hur man använder",
"Hurry up and use them before they expire!": "Skynda dig och använd dem innan de går ut!", "Hurry up and use them before they expire!": "Skynda dig och använd dem innan de går ut!",
"I accept": "Jag accepterar", "I accept": "Jag accepterar",
"I accept the terms and conditions": "Jag accepterar villkoren", "I accept the terms and conditions": "Jag accepterar villkoren",

View File

@@ -181,17 +181,21 @@ export type RewardWithRedeem = CMSRewardWithRedeem & {
} }
// New endpoint related types and schemas. // New endpoint related types and schemas.
const BaseReward = z.object({
const BenefitReward = z.object({
title: z.string().optional(), title: z.string().optional(),
id: z.string().optional(), id: z.string().optional(),
redeemLocation: z.string().optional(),
rewardId: z.string().optional(), rewardId: z.string().optional(),
rewardType: z.string().optional(), // TODO: Should be "Tier" but can't because of backwards compatibility redeemLocation: z.string().optional(),
rewardTierLevel: z.string().optional(),
status: z.string().optional(), status: z.string().optional(),
}) })
const BenefitReward = BaseReward.merge(
z.object({
rewardType: z.string().optional(), // TODO: Should be "Tier" but can't because of backwards compatibility
rewardTierLevel: z.string().optional(),
})
)
const CouponData = z.object({ const CouponData = z.object({
couponCode: z.string().optional(), couponCode: z.string().optional(),
unwrapped: z.boolean().default(false), unwrapped: z.boolean().default(false),
@@ -199,19 +203,16 @@ const CouponData = z.object({
expiresAt: z.string().datetime({ offset: true }).optional(), expiresAt: z.string().datetime({ offset: true }).optional(),
}) })
const CouponReward = z.object({ const CouponReward = BaseReward.merge(
title: z.string().optional(), z.object({
id: z.string().optional(),
rewardId: z.string().optional(),
rewardType: z.enum(["Surprise", "Campaign", "Member-voucher"]), rewardType: z.enum(["Surprise", "Campaign", "Member-voucher"]),
redeemLocation: z.string().optional(),
operaRewardId: z.string().default(""), operaRewardId: z.string().default(""),
status: z.string().optional(),
coupon: z coupon: z
.array(CouponData) .array(CouponData)
.optional() .optional()
.transform((val) => val || []), .transform((val) => val || []),
}) })
)
/** /**
* Schema for the new /profile/v1/Reward endpoint. * Schema for the new /profile/v1/Reward endpoint.