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

@@ -0,0 +1,48 @@
import { ChevronDown } from "react-feather"
import Title from "@/components/TempDesignSystem/Text/Title"
import RewardValue from "../../RewardValue"
import styles from "./rewardCard.module.css"
import type { RewardCardProps } from "@/types/components/overviewTable"
export default function RewardCard({
comparedValues,
title,
description,
}: RewardCardProps) {
return (
<div className={styles.rewardCard}>
<div className={styles.rewardInfo}>
<details className={styles.details}>
<summary className={styles.summary}>
<hgroup className={styles.rewardCardHeader}>
<Title as="h5" level="h2" textTransform={"regular"}>
{title}
</Title>
<span className={styles.chevron}>
<ChevronDown />
</span>
</hgroup>
</summary>
<p
className={styles.rewardCardDescription}
dangerouslySetInnerHTML={{ __html: description }}
/>
</details>
</div>
<div className={styles.rewardComparison}>
{comparedValues.map((reward, idx) => (
<div
key={`${reward?.reward_id}-${idx}`}
className={styles.comparisonItem}
>
<RewardValue reward={reward} />
</div>
))}
</div>
</div>
)
}

View File

@@ -0,0 +1,56 @@
.rewardCard {
padding-bottom: var(--Spacing-x-one-and-half);
z-index: 2;
grid-column: 1/3;
}
.rewardCardHeader {
display: grid;
grid-template-columns: 1fr auto;
}
.rewardCardDescription {
font-size: var(--typography-Caption-Regular-fontSize);
line-height: 150%;
padding-right: var(--Spacing-x4);
}
.rewardInfo {
padding-bottom: var(--Spacing-x-one-and-half);
}
.rewardComparison {
display: grid;
grid-template-columns: 1fr 1fr;
}
.comparisonItem {
display: flex;
justify-content: center;
align-items: center;
padding-top: var(--Spacing-x-one-and-half);
}
.details[open] .chevron {
transform: rotate(180deg);
}
.chevron {
display: flex;
align-items: center;
color: var(--UI-Grey-80);
}
.summary::-webkit-details-marker {
display: none;
}
.summary {
list-style: none;
}
@media screen and (min-width: 950px) {
.rewardComparison {
grid-template-columns: 1fr 1fr 1fr;
}
}

View File

@@ -0,0 +1,38 @@
import {
findAvailableRewards,
getGroupedLabelAndDescription,
getGroupedRewards,
} from "@/utils/loyaltyTable"
import RewardCard from "./Card"
import styles from "./rewardList.module.css"
import type { RewardListProps } from "@/types/components/overviewTable"
export default function RewardList({ levels }: RewardListProps) {
const groupedRewards = getGroupedRewards(levels)
return Object.values(groupedRewards).map((groupedRewards) => {
const rewardIdsInGroup = groupedRewards.map((b) => b.reward_id)
const { label, description } = getGroupedLabelAndDescription(groupedRewards)
const levelRewards = levels.map((level) => {
return findAvailableRewards(rewardIdsInGroup, level)
})
return (
<div
key={levelRewards[0]?.reward_id ?? ""}
className={styles.rewardCardWrapper}
>
<RewardCard
title={label}
description={description}
comparedValues={levelRewards}
/>
</div>
)
})
}

View File

@@ -0,0 +1,19 @@
.rewardCardWrapper {
border-bottom: 1px solid var(--Base-Border-Subtle);
position: relative;
display: grid;
grid-template-columns: 1fr 1fr;
grid-column: 1/3;
padding-top: 0;
margin: var(--Spacing-x1) var(--Spacing-x2);
}
.rewardCardWrapper:last-child {
border: none;
}
@media screen and (min-width: 950px) {
.rewardCardWrapper {
grid-column: 1/4;
}
}