fix(LOY-64): abstract membershipbadge to its own component

This commit is contained in:
Chuma McPhoy
2024-12-13 10:43:36 +01:00
parent 839655d4df
commit 9247ea0e9c
5 changed files with 37 additions and 24 deletions

View File

@@ -17,7 +17,7 @@ export default function ClientCurrentRewards({
rewards, rewards,
pageSize, pageSize,
showRedeem, showRedeem,
memberId, membershipNumber,
}: CurrentRewardsClientProps) { }: CurrentRewardsClientProps) {
const containerRef = useRef<HTMLDivElement>(null) const containerRef = useRef<HTMLDivElement>(null)
const [currentPage, setCurrentPage] = useState(1) const [currentPage, setCurrentPage] = useState(1)
@@ -56,7 +56,7 @@ export default function ClientCurrentRewards({
</div> </div>
{showRedeem && "redeem_description" in reward && ( {showRedeem && "redeem_description" in reward && (
<div className={styles.btnContainer}> <div className={styles.btnContainer}>
<Redeem reward={reward} memberId={memberId} /> <Redeem reward={reward} membershipNumber={membershipNumber} />
</div> </div>
)} )}
</article> </article>

View File

@@ -11,7 +11,6 @@ import {
import { useIntl } from "react-intl" import { useIntl } from "react-intl"
import { trpc } from "@/lib/trpc/client" import { trpc } from "@/lib/trpc/client"
import { Reward } from "@/server/routers/contentstack/reward/output"
import Countdown from "@/components/Countdown" import Countdown from "@/components/Countdown"
import { CheckCircleIcon, CloseLargeIcon } from "@/components/Icons" import { CheckCircleIcon, CloseLargeIcon } from "@/components/Icons"
@@ -30,11 +29,12 @@ import type {
RedeemProps, RedeemProps,
RedeemStep, RedeemStep,
} from "@/types/components/myPages/myPage/accountPage" } from "@/types/components/myPages/myPage/accountPage"
import type { Reward } from "@/server/routers/contentstack/reward/output"
const MotionOverlay = motion(ModalOverlay) const MotionOverlay = motion(ModalOverlay)
const MotionModal = motion(Modal) const MotionModal = motion(Modal)
export default function Redeem({ reward, memberId }: RedeemProps) { export default function Redeem({ reward, membershipNumber }: RedeemProps) {
const [animation, setAnimation] = useState<RedeemModalState>("unmounted") const [animation, setAnimation] = useState<RedeemModalState>("unmounted")
const intl = useIntl() const intl = useIntl()
const update = trpc.contentstack.rewards.redeem.useMutation() const update = trpc.contentstack.rewards.redeem.useMutation()
@@ -121,16 +121,10 @@ export default function Redeem({ reward, memberId }: RedeemProps) {
)} )}
{redeemStep === "redeemed" && {redeemStep === "redeemed" &&
isRestaurantOnSiteTierReward(reward) && isRestaurantOnSiteTierReward(reward) &&
memberId && ( membershipNumber && (
<div className={styles.memberIdBadge}> <MemberShipNumberBadge
<Caption membershipNumber={membershipNumber}
textTransform="uppercase" />
textAlign="center"
color="uiTextHighContrast"
>
{intl.formatMessage({ id: "Member ID:" })} {memberId}
</Caption>
</div>
)} )}
</div> </div>
{redeemStep === "initial" && ( {redeemStep === "initial" && (
@@ -246,3 +240,23 @@ function TimedRedeemedBadge() {
</> </>
) )
} }
function MemberShipNumberBadge({
membershipNumber,
}: {
membershipNumber: string
}) {
const intl = useIntl()
return (
<div className={styles.memberShipNumberBadge}>
<Caption
textTransform="uppercase"
textAlign="center"
color="uiTextHighContrast"
>
{intl.formatMessage({ id: "Membership ID:" })} {membershipNumber}
</Caption>
</div>
)
}

View File

@@ -138,8 +138,8 @@
color: var(--UI-Semantic-Success); color: var(--UI-Semantic-Success);
} }
.memberIdBadge { .memberShipNumberBadge {
border-radius: var(--Small); border-radius: var(--Small);
padding: var(--Spacing-x1) var(--Spacing-x-one-and-half); padding: var(--Spacing-x1) var(--Spacing-x-one-and-half);
background: var(--Base-Surface-Secondary-light-Normal); background: var(--Base-Surface-Secondary-light-Normal);
} }

View File

@@ -31,7 +31,7 @@ export default async function CurrentRewardsBlock({
rewards={rewardsResponse.rewards} rewards={rewardsResponse.rewards}
pageSize={6} pageSize={6}
showRedeem={env.USE_NEW_REWARDS_ENDPOINT && env.USE_NEW_REWARD_MODEL} showRedeem={env.USE_NEW_REWARDS_ENDPOINT && env.USE_NEW_REWARD_MODEL}
memberId={membershipLevel?.membershipNumber} membershipNumber={membershipLevel?.membershipNumber}
/> />
<SectionLink link={link} variant="mobile" /> <SectionLink link={link} variant="mobile" />
</SectionContainer> </SectionContainer>

View File

@@ -1,13 +1,12 @@
import { z } from "zod" import type { z } from "zod"
import { blocksSchema } from "@/server/routers/contentstack/accountPage/output" import type { DynamicContent } from "@/types/trpc/routers/contentstack/blocks"
import { import type { blocksSchema } from "@/server/routers/contentstack/accountPage/output"
import type {
Reward, Reward,
RewardWithRedeem, RewardWithRedeem,
} from "@/server/routers/contentstack/reward/output" } from "@/server/routers/contentstack/reward/output"
import { DynamicContent } from "@/types/trpc/routers/contentstack/blocks"
export interface AccountPageContentProps export interface AccountPageContentProps
extends Pick<DynamicContent, "dynamic_content"> {} extends Pick<DynamicContent, "dynamic_content"> {}
@@ -27,12 +26,12 @@ export interface CurrentRewardsClientProps {
rewards: (Reward | RewardWithRedeem)[] rewards: (Reward | RewardWithRedeem)[]
pageSize: number pageSize: number
showRedeem: boolean showRedeem: boolean
memberId?: string | null membershipNumber?: string | null
} }
export interface RedeemProps { export interface RedeemProps {
reward: RewardWithRedeem reward: RewardWithRedeem
memberId?: string | null membershipNumber?: string | null
} }
export type RedeemModalState = "unmounted" | "hidden" | "visible" export type RedeemModalState = "unmounted" | "hidden" | "visible"