chore: remove unused filter modal

remove old cms model

refactor reward types
This commit is contained in:
Christian Andolf
2025-03-18 09:19:05 +01:00
parent 45d57a9c89
commit f272dde1ef
23 changed files with 345 additions and 891 deletions

View File

@@ -10,24 +10,14 @@ import Title from "@/components/TempDesignSystem/Text/Title"
import { toast } from "@/components/TempDesignSystem/Toasts"
import { RewardIcon } from "../../RewardIcon"
import useRedeemFlow from "../useRedeemFlow"
import styles from "../redeem.module.css"
export default function Campaign() {
const { reward } = useRedeemFlow()
import type { Campaign } from "@/types/components/myPages/rewards"
export default function Campaign({ reward }: { reward: Campaign }) {
const intl = useIntl()
if (!reward) {
return null
}
if (reward.data.rewardType !== "Campaign") {
return null
}
const operaRewardId = reward.data.operaRewardId
return (
<>
<div className={styles.modalContent}>
@@ -41,7 +31,7 @@ export default function Campaign() {
{intl.formatMessage({ id: "Promo code" })}
</Caption>
<Caption textAlign="center" color="uiTextHighContrast">
{operaRewardId}
{reward.operaRewardId}
</Caption>
</div>
</div>
@@ -49,7 +39,7 @@ export default function Campaign() {
<Button
onClick={() => {
try {
navigator.clipboard.writeText(operaRewardId)
navigator.clipboard.writeText(reward.operaRewardId)
toast.success(intl.formatMessage({ id: "Copied to clipboard" }))
} catch {
toast.error(intl.formatMessage({ id: "Failed to copy" }))

View File

@@ -16,26 +16,25 @@ import useRedeemFlow from "../useRedeemFlow"
import styles from "../redeem.module.css"
import type { Surprise, Tier } from "@/types/components/myPages/rewards"
export default function Tier({
reward,
membershipNumber,
}: {
reward: Tier | Surprise
membershipNumber: string
}) {
const { reward, onRedeem, redeemStep, setRedeemStep, isRedeeming } =
useRedeemFlow()
const { onRedeem, redeemStep, setRedeemStep, isRedeeming } = useRedeemFlow()
const intl = useIntl()
if (!reward) {
return null
}
return (
<>
<div className={styles.modalContent}>
{redeemStep === "redeemed" && (
<div className={styles.badge}>
{isRestaurantOnSiteTierReward(reward.data) ? (
{isRestaurantOnSiteTierReward(reward) ? (
<ActiveRedeemedBadge />
) : (
<TimedRedeemedBadge />
@@ -47,7 +46,7 @@ export default function Tier({
{reward.label}
</Title>
{reward.data.redeemLocation !== "Non-redeemable" ? (
{reward.redeemLocation !== "Non-redeemable" ? (
<>
{redeemStep === "initial" && (
<Body textAlign="center">{reward.description}</Body>
@@ -63,7 +62,7 @@ export default function Tier({
)}
{redeemStep === "redeemed" &&
isRestaurantOnSiteTierReward(reward.data) &&
isRestaurantOnSiteTierReward(reward) &&
membershipNumber && (
<MembershipNumberBadge membershipNumber={membershipNumber} />
)}
@@ -76,7 +75,7 @@ export default function Tier({
)}
</div>
{reward.data.redeemLocation !== "Non-redeemable" ? (
{reward.redeemLocation !== "Non-redeemable" ? (
<>
{redeemStep === "initial" && (
<footer className={styles.modalFooter}>
@@ -93,7 +92,7 @@ export default function Tier({
{redeemStep === "confirmation" && (
<footer className={styles.modalFooter}>
<Button
onClick={onRedeem}
onClick={() => onRedeem(reward)}
disabled={isRedeeming}
intent="primary"
theme="base"

View File

@@ -17,8 +17,8 @@ import Button from "@/components/TempDesignSystem/Button"
import useLang from "@/hooks/useLang"
import { isRestaurantOnSiteTierReward } from "@/utils/rewards"
import Campaign from "./Flows/Campaign"
import Tier from "./Flows/Tier"
import RedeemCampaign from "./Flows/Campaign"
import RedeemTier from "./Flows/Tier"
import { ConfirmClose } from "./ConfirmClose"
import { RedeemContext } from "./useRedeemFlow"
@@ -29,7 +29,7 @@ import type {
RedeemProps,
RedeemStep,
} from "@/types/components/myPages/myPage/accountPage"
import type { RewardWithRedeem } from "@/types/components/myPages/rewards"
import type { Reward } from "@/types/components/myPages/rewards"
const MotionOverlay = motion(ModalOverlay)
const MotionModal = motion(Modal)
@@ -58,7 +58,6 @@ export default function Redeem({ reward, membershipNumber }: RedeemProps) {
return (
<RedeemContext.Provider
value={{
reward,
redeemStep,
setRedeemStep,
defaultTimeRemaining: thirtyMinutesInMs,
@@ -70,7 +69,7 @@ export default function Redeem({ reward, membershipNumber }: RedeemProps) {
onOpenChange={(isOpen) => setAnimation(isOpen ? "visible" : "hidden")}
>
<Button intent="primary" fullWidth>
{reward.data.redeemLocation === "Non-redeemable"
{reward.redeemLocation === "Non-redeemable"
? intl.formatMessage({ id: "How to use" })
: intl.formatMessage({ id: "Open" })}
</Button>
@@ -108,7 +107,7 @@ export default function Redeem({ reward, membershipNumber }: RedeemProps) {
onClick={() => {
if (
redeemStep === "redeemed" &&
!isRestaurantOnSiteTierReward(reward.data)
!isRestaurantOnSiteTierReward(reward)
) {
setRedeemStep("confirm-close")
} else {
@@ -164,18 +163,16 @@ const variants = {
},
}
function getRedeemFlow(reward: RewardWithRedeem, membershipNumber: string) {
switch (reward.data.rewardType) {
function getRedeemFlow(reward: Reward, membershipNumber: string) {
const { rewardType } = reward
switch (rewardType) {
case "Campaign":
return <Campaign />
return <RedeemCampaign reward={reward} />
case "Surprise":
case "Tier":
return <Tier membershipNumber={membershipNumber} />
return <RedeemTier reward={reward} membershipNumber={membershipNumber} />
default:
console.warn(
"Unsupported reward type for redeem:",
reward.data.rewardType
)
console.warn("Unsupported reward type for redeem:", rewardType)
return null
}
}

View File

@@ -7,10 +7,9 @@ import { trpc } from "@/lib/trpc/client"
import { getFirstRedeemableCoupon } from "@/utils/rewards"
import type { RedeemFlowContext } from "@/types/components/myPages/myPage/accountPage"
import type { RewardWithRedeem } from "@/types/components/myPages/rewards"
import type { Reward } from "@/types/components/myPages/rewards"
export const RedeemContext = createContext<RedeemFlowContext>({
reward: null,
redeemStep: "initial",
setRedeemStep: () => undefined,
defaultTimeRemaining: 0,
@@ -20,7 +19,6 @@ export const RedeemContext = createContext<RedeemFlowContext>({
export default function useRedeemFlow() {
const {
reward,
redeemStep,
setRedeemStep,
defaultTimeRemaining,
@@ -29,14 +27,14 @@ export default function useRedeemFlow() {
} = useContext(RedeemContext)
const update = trpc.contentstack.rewards.redeem.useMutation<{
rewards: RewardWithRedeem[]
rewards: Reward[]
}>()
const onRedeem = useCallback(() => {
if (reward?.data.id) {
const coupon = getFirstRedeemableCoupon(reward.data)
const onRedeem = useCallback(
(reward: Reward) => {
const coupon = getFirstRedeemableCoupon(reward)
update.mutate(
{ rewardId: reward.data.id, couponCode: coupon.couponCode },
{ rewardId: reward.id, couponCode: coupon.couponCode },
{
onSuccess() {
setRedeemStep("redeemed")
@@ -46,8 +44,9 @@ export default function useRedeemFlow() {
},
}
)
}
}, [reward, update, setRedeemStep])
},
[update, setRedeemStep]
)
useEffect(() => {
if (redeemStep === "initial") {
@@ -56,7 +55,6 @@ export default function useRedeemFlow() {
}, [redeemStep, setTimeRemaining, defaultTimeRemaining])
return {
reward,
onRedeem,
redeemStep,
setRedeemStep,