feat(SW-312): fix "2-for-1-breakfast" only unlocked for level 5

This commit is contained in:
Matilda Landström
2024-08-29 14:36:26 +02:00
committed by Christel Westerberg
parent 00fc2af3dd
commit 41827f0fe0
15 changed files with 97 additions and 93 deletions

View File

@@ -6,7 +6,7 @@ import BenefitValue from "../BenefitValue"
import styles from "./benefitCard.module.css"
import { BenefitCardProps } from "@/types/components/loyalty/blocks"
import type { BenefitCardProps } from "@/types/components/loyalty/blocks"
export default function BenefitCard({
comparedValues,

View File

@@ -1,32 +1,31 @@
import { getHighestLevel } from "@/utils/loyaltyTable"
import { findBenefit, getUnlockedBenefits } from "@/utils/loyaltyTable"
import BenefitCard from "../BenefitCard"
import styles from "./benefitList.module.css"
import { BenefitListProps } from "@/types/components/loyalty/blocks"
import type { BenefitListProps } from "@/types/components/loyalty/blocks"
export default function BenefitList({ levels }: BenefitListProps) {
const highestLevel = getHighestLevel(levels)
return highestLevel?.benefits
.filter((benefit) => benefit.unlocked)
.map((benefit, idx) => {
const levelBenefits = levels.map((level) => level.benefits[idx])
return (
<div key={benefit.name} className={styles.benefitCardWrapper}>
<BenefitCard
title={benefit.name}
description={benefit.description}
comparedValues={levelBenefits.map((benefit, idx) => {
return {
key: `${benefit.name}-${idx}`,
value: benefit.value,
unlocked: benefit.unlocked,
valueDetails: benefit.valueDetails,
}
})}
/>
</div>
)
return getUnlockedBenefits(levels).map((benefit) => {
const levelBenefits = levels.map((level) => {
return findBenefit(benefit, level)
})
return (
<div key={benefit.name} className={styles.benefitCardWrapper}>
<BenefitCard
title={benefit.name}
description={benefit.description}
comparedValues={levelBenefits.map((benefit, idx) => {
return {
key: `${benefit.name}-${idx}`,
value: benefit.value,
unlocked: benefit.unlocked,
valueDetails: benefit.valueDetails,
}
})}
/>
</div>
)
})
}

View File

@@ -4,7 +4,7 @@ import CheckCircle from "@/components/Icons/CheckCircle"
import styles from "./benefitValue.module.css"
import { BenefitValueProps } from "@/types/components/loyalty/blocks"
import type { BenefitValueProps } from "@/types/components/loyalty/blocks"
export default function BenefitValue({ benefit }: BenefitValueProps) {
if (!benefit.unlocked) {

View File

@@ -5,7 +5,7 @@ import YourLevel from "../../YourLevelScript"
import styles from "./desktopHeader.module.css"
import {
import type {
DesktopSelectColumns,
LargeTableProps,
} from "@/types/components/loyalty/blocks"

View File

@@ -1,14 +1,14 @@
import { ChevronDown } from "react-feather"
import Title from "@/components/TempDesignSystem/Text/Title"
import { getHighestLevel } from "@/utils/loyaltyTable"
import { findBenefit, getUnlockedBenefits } from "@/utils/loyaltyTable"
import BenefitValue from "../BenefitValue"
import DesktopHeader from "./DesktopHeader"
import styles from "./largeTable.module.css"
import {
import type {
BenefitTableHeaderProps,
LargeTableProps,
} from "@/types/components/loyalty/blocks"
@@ -18,7 +18,6 @@ export default function LargeTable({
activeLevel,
Select,
}: LargeTableProps) {
const highestLevel = getHighestLevel(levels)
return (
<table className={styles.table}>
<DesktopHeader
@@ -27,27 +26,25 @@ export default function LargeTable({
Select={Select}
/>
<tbody className={styles.tbody}>
{highestLevel?.benefits
.filter((benefit) => benefit.unlocked)
.map((benefit, index) => {
return (
<tr key={benefit.name} className={styles.tr}>
<th scope={"row"} className={styles.benefitTh}>
<BenefitTableHeader
name={benefit.name}
description={benefit.description}
/>
</th>
{levels.map((level, idx) => {
return (
<td key={"icon" + level.level + idx} className={styles.td}>
<BenefitValue benefit={level.benefits[index]} />
</td>
)
})}
</tr>
)
})}
{getUnlockedBenefits(levels).map((benefit) => {
return (
<tr key={benefit.name} className={styles.tr}>
<th scope={"row"} className={styles.benefitTh}>
<BenefitTableHeader
name={benefit.name}
description={benefit.description}
/>
</th>
{levels.map((level, idx) => {
return (
<td key={"icon" + level.level + idx} className={styles.td}>
<BenefitValue benefit={findBenefit(benefit, level)} />
</td>
)
})}
</tr>
)
})}
</tbody>
</table>
)

View File

@@ -1,6 +1,6 @@
import styles from "./levelSummary.module.css"
import { LevelSummaryProps } from "@/types/components/loyalty/blocks"
import type { LevelSummaryProps } from "@/types/components/loyalty/blocks"
export default function LevelSummary({
level,

View File

@@ -433,7 +433,7 @@
{
"name": "2-for-1 morgenmad",
"description": "Uanset om du overnatter hos os eller ej, kan du invitere en ven på morgenmad, for I kan spise for to personer og kun betale for én! Men husk, at tjekke detaljerne først, så alt er klar til et hyggeligt morgenmøde.",
"unlocked": true
"unlocked": false
},
{
"name": "48-timers værelsesgaranti",
@@ -510,7 +510,7 @@
{
"name": "2-for-1 morgenmad",
"description": "Uanset om du overnatter hos os eller ej, kan du invitere en ven på morgenmad, for I kan spise for to personer og kun betale for én! Men husk, at tjekke detaljerne først, så alt er klar til et hyggeligt morgenmøde.",
"unlocked": true
"unlocked": false
},
{
"name": "48-timers værelsesgaranti",

View File

@@ -433,7 +433,7 @@
{
"name": "Frühstück für zwei zum Preis von einem",
"description": "Wenn das kein delikater Deal ist: Egal, ob Sie bei uns übernachten oder nicht, schnappen Sie sich einen Frühstückspartner, denn jetzt können Sie zu zweit zum Preis von einem bei uns essen! Informieren Sie sich einfach vorher über alle Details und genießen Sie ein gemütliches Frühstück zu zweit.",
"unlocked": true
"unlocked": false
},
{
"name": "48-Stunden-Zimmergarantie",
@@ -510,7 +510,7 @@
{
"name": "Frühstück für zwei zum Preis von einem",
"description": "Wenn das kein delikater Deal ist: Egal, ob Sie bei uns übernachten oder nicht, schnappen Sie sich einen Frühstückspartner, denn jetzt können Sie zu zweit zum Preis von einem bei uns essen! Informieren Sie sich einfach vorher über alle Details und genießen Sie ein gemütliches Frühstück zu zweit.",
"unlocked": true
"unlocked": false
},
{
"name": "48-Stunden-Zimmergarantie",

View File

@@ -35,7 +35,7 @@
},
{
"name": "Friendship point boost",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost on the boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"unlocked": false
},
{
@@ -110,7 +110,7 @@
},
{
"name": "Friendship point boost",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost on the boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"unlocked": false
},
{
@@ -186,7 +186,7 @@
},
{
"name": "Friendship point boost",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost on the boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"unlocked": false
},
{
@@ -262,7 +262,7 @@
},
{
"name": "Friendship point boost",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost on the boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"unlocked": true,
"value": "+25%"
},
@@ -339,7 +339,7 @@
},
{
"name": "Friendship point boost",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost on the boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"unlocked": true,
"value": "+25%"
},
@@ -416,7 +416,7 @@
},
{
"name": "Friendship point boost",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost on the boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"unlocked": true,
"value": "+50%"
},
@@ -433,7 +433,7 @@
{
"name": "2-for-1 breakfast",
"description": "Now, this is a delicious deal: regardless if youre staying with us or not, go grab a breakfast buddy because you're eating two for the price of one! Just make sure to check the details first so everything is in place for your yummy get-together.",
"unlocked": true
"unlocked": false
},
{
"name": "48hr room guarantee",
@@ -493,7 +493,7 @@
},
{
"name": "Friendship point boost",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost on the boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"description": "Now heres something pretty sweet: every time you get a boost of friendship points, you get 25% or 50% extra a boost! So you know, start racking up those points on stays, meals and more and youll get a free night in no time.",
"unlocked": true,
"value": "+50%"
},
@@ -510,7 +510,7 @@
{
"name": "2-for-1 breakfast",
"description": "Now, this is a delicious deal: regardless if youre staying with us or not, go grab a breakfast buddy because you're eating two for the price of one! Just make sure to check the details first so everything is in place for your yummy get-together.",
"unlocked": true
"unlocked": false
},
{
"name": "48hr room guarantee",

View File

@@ -433,7 +433,7 @@
{
"name": "Aamiainen kaksi yhden hinnalla",
"description": "Saat kaksi aamiaista yhden hinnalla, majoitut meillä tai et.",
"unlocked": true
"unlocked": false
},
{
"name": "48tunnin huonetakuu",
@@ -510,7 +510,7 @@
{
"name": "Aamiainen kaksi yhden hinnalla",
"description": "Saat kaksi aamiaista yhden hinnalla, majoitut meillä tai et.",
"unlocked": true
"unlocked": false
},
{
"name": "48tunnin huonetakuu",

View File

@@ -433,7 +433,7 @@
{
"name": "2-for-1 frokost",
"description": "Dette er virkelig et deilig tilbud: Uavhengig om du bor hos oss eller ikke, finn deg en frokostkompis, og dere kan spise for prisen av én! Bare sørg for å sjekke detaljene først, slik at alt er på plass for deres smakfulle sammenkomst.",
"unlocked": true
"unlocked": false
},
{
"name": "Romgaranti i 48timer",
@@ -510,7 +510,7 @@
{
"name": "2-for-1 frokost",
"description": "Dette er virkelig et deilig tilbud: Uavhengig om du bor hos oss eller ikke, finn deg en frokostkompis, og dere kan spise for prisen av én! Bare sørg for å sjekke detaljene først, slik at alt er på plass for deres smakfulle sammenkomst.",
"unlocked": true
"unlocked": false
},
{
"name": "Romgaranti i 48timer",

View File

@@ -433,7 +433,7 @@
{
"name": "Frukost 2 för 1",
"description": "Okej, nu snackar vi. Oavsett om du bor hos oss eller inte, ta med en frukostkompis eftersom du äter två frukostar till priset av en! Kom bara ihåg att dubbelkolla detaljerna först så att allt är i sin ordning för en maxad frukost.",
"unlocked": true
"unlocked": false
},
{
"name": "48timmars rumsgaranti",
@@ -510,7 +510,7 @@
{
"name": "Frukost 2 för 1",
"description": "Okej, nu snackar vi. Oavsett om du bor hos oss eller inte, ta med en frukostkompis eftersom du äter två frukostar till priset av en! Kom bara ihåg att dubbelkolla detaljerna först så att allt är i sin ordning för en maxad frukost.",
"unlocked": true
"unlocked": false
},
{
"name": "48timmars rumsgaranti",

View File

@@ -29,9 +29,9 @@ import type { Key } from "react-aria-components"
import {
ComparisonLevel,
DesktopSelectColumns,
MobileColumnHeaderProps,
type MobileColumnHeaderProps,
overviewTableActionsEnum,
OverviewTableProps,
type OverviewTableProps,
OverviewTableReducerAction,
} from "@/types/components/loyalty/blocks"
import type { User } from "@/types/user"

View File

@@ -30,7 +30,7 @@ export type CardsGridProps = Pick<CardsGrid, "cards_grid"> & {
export type Content = { content: RteBlockContent["content"]["content"] }
type Benefit = { title: string }
type BenefitTitle = { title: string }
export type OverviewTableProps = { activeMembership: MembershipLevel | null }
@@ -39,7 +39,7 @@ export type Level = {
name: string
requiredPoints: number
requiredNights?: number
benefits: Benefit[]
benefits: BenefitTitle[]
}
export type LevelCardProps = {
@@ -54,15 +54,15 @@ export type ComparisonLevel = {
description: string
requirement: string
icon: string
benefits: [
{
name: string
description: string
unlocked: boolean
value?: string
valueDetails?: string
},
]
benefits: Benefit[]
}
export type Benefit = {
name: string
description: string
unlocked: boolean
value?: string
valueDetails?: string
}
export type LevelSummaryProps = {

View File

@@ -1,13 +1,21 @@
import { ComparisonLevel } from "@/types/components/loyalty/blocks"
import type {
Benefit,
ComparisonLevel,
} from "@/types/components/loyalty/blocks"
export function getHighestLevel(levels: ComparisonLevel[]) {
return levels.reduce(
(acc: ComparisonLevel | null, level: ComparisonLevel) => {
if (!acc) {
return level
}
return level.level > acc.level ? level : acc
},
null
export function getUnlockedBenefits(levels: ComparisonLevel[]) {
const allBenefits = levels
.map((level) => {
return level.benefits.filter((benefit) => benefit.unlocked)
})
.flat()
/* Remove duplicate benefits based on the name property */
return Array.from(
new Map(allBenefits.map((benefit) => [benefit.name, benefit])).values()
)
}
export function findBenefit(benefit: Benefit, level: ComparisonLevel) {
return level.benefits.find((b) => b.name === benefit.name) as Benefit
}