feat(SW-353): dynamic rewards

This commit is contained in:
Christel Westerberg
2024-09-25 15:59:16 +02:00
parent 6a85cfd19c
commit 56cd02f90b
78 changed files with 1568 additions and 4587 deletions

View File

@@ -1,4 +1,4 @@
import Image from "@/components/Image"
import MembershipLevelIcon from "@/components/Levels/Icon"
import LevelSummary from "../../LevelSummary"
import YourLevel from "../../YourLevelScript"
@@ -21,13 +21,13 @@ export default function DesktopHeader({
<th className={styles.verticalTableHeader} />
{levels.map((level, idx) => {
return (
<th key={"image" + level.level + idx} className={styles.iconTh}>
{activeLevel === level.level ? <YourLevel /> : null}
<Image
height={50}
width={100}
alt={level.name}
src={level.icon}
<th key={"image" + level.level_id + idx} className={styles.iconTh}>
{activeLevel === level.level_id ? <YourLevel /> : null}
<MembershipLevelIcon
color="red"
level={level.level_id}
height="50"
width="100"
/>
</th>
)
@@ -38,7 +38,7 @@ export default function DesktopHeader({
{levels.map((level, idx) => {
return (
<th
key={"summary" + level.level + idx}
key={"summary" + level.level_id + idx}
className={styles.summaryTh}
>
<LevelSummary level={level} />

View File

@@ -1,16 +1,20 @@
import { ChevronDown } from "react-feather"
import Title from "@/components/TempDesignSystem/Text/Title"
import { findBenefit, getUnlockedBenefits } from "@/utils/loyaltyTable"
import {
findAvailableRewards,
getGroupedLabelAndDescription,
getGroupedRewards,
} from "@/utils/loyaltyTable"
import BenefitValue from "../BenefitValue"
import RewardValue from "../RewardValue"
import DesktopHeader from "./DesktopHeader"
import styles from "./largeTable.module.css"
import type {
BenefitTableHeaderProps,
LargeTableProps,
RewardTableHeaderProps,
} from "@/types/components/overviewTable"
export default function LargeTable({
@@ -18,6 +22,8 @@ export default function LargeTable({
activeLevel,
Select,
}: LargeTableProps) {
const groupedRewards = getGroupedRewards(levels)
return (
<table className={styles.table}>
<DesktopHeader
@@ -26,19 +32,21 @@ export default function LargeTable({
Select={Select}
/>
<tbody className={styles.tbody}>
{getUnlockedBenefits(levels).map((benefit) => {
{Object.entries(groupedRewards).map(([key, groupedRewards], idx) => {
const { label, description } =
getGroupedLabelAndDescription(groupedRewards)
return (
<tr key={benefit.name} className={styles.tr}>
<th scope={"row"} className={styles.benefitTh}>
<BenefitTableHeader
name={benefit.name}
description={benefit.description}
/>
<tr key={key + idx} className={styles.tr}>
<th scope={"row"} className={styles.rewardTh}>
<RewardTableHeader name={label} description={description} />
</th>
{levels.map((level, idx) => {
const rewardIdsInGroup = groupedRewards.map((b) => b.reward_id)
const reward = findAvailableRewards(rewardIdsInGroup, level)
return (
<td key={"icon" + level.level + idx} className={styles.td}>
<BenefitValue benefit={findBenefit(benefit, level)} />
<td key={`${reward?.reward_id}-${idx}`} className={styles.td}>
<RewardValue reward={reward} />
</td>
)
})}
@@ -50,17 +58,12 @@ export default function LargeTable({
)
}
function BenefitTableHeader({ name, description }: BenefitTableHeaderProps) {
function RewardTableHeader({ name, description }: RewardTableHeaderProps) {
return (
<details className={styles.details}>
<summary className={styles.summary}>
<hgroup className={styles.benefitHeader}>
<Title
as="h5"
level="h2"
textTransform={"regular"}
className={styles.benefitTitle}
>
<hgroup className={styles.rewardHeader}>
<Title as="h5" level="h2" textTransform={"regular"}>
{name}
</Title>
<span className={styles.chevron}>
@@ -69,7 +72,7 @@ function BenefitTableHeader({ name, description }: BenefitTableHeaderProps) {
</hgroup>
</summary>
<p
className={styles.benefitDescription}
className={styles.rewardDescription}
dangerouslySetInnerHTML={{ __html: description }}
/>
</details>

View File

@@ -19,7 +19,7 @@
text-align: center;
}
.benefitTh {
.rewardTh {
padding: var(--Spacing-x3) var(--Spacing-x2);
font-size: var(--typography-Caption-Regular-fontSize);
font-weight: var(--typography-Caption-Regular-fontWeight);
@@ -29,14 +29,14 @@
transform: rotate(180deg);
}
.benefitHeader {
.rewardHeader {
display: grid;
gap: var(--Spacing-x1);
grid-template-columns: 1fr auto;
text-align: start;
}
.benefitDescription {
.rewardDescription {
margin: 0;
padding-top: var(--Spacing-x1);
text-align: start;