feat(SW-312): fix "2-for-1-breakfast" only unlocked for level 5
This commit is contained in:
committed by
Christel Westerberg
parent
00fc2af3dd
commit
41827f0fe0
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import YourLevel from "../../YourLevelScript"
|
||||
|
||||
import styles from "./desktopHeader.module.css"
|
||||
|
||||
import {
|
||||
import type {
|
||||
DesktopSelectColumns,
|
||||
LargeTableProps,
|
||||
} from "@/types/components/loyalty/blocks"
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Friendship point boost",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"unlocked": false
|
||||
},
|
||||
{
|
||||
@@ -110,7 +110,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Friendship point boost",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"unlocked": false
|
||||
},
|
||||
{
|
||||
@@ -186,7 +186,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Friendship point boost",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"unlocked": false
|
||||
},
|
||||
{
|
||||
@@ -262,7 +262,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Friendship point boost",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"unlocked": true,
|
||||
"value": "+25%"
|
||||
},
|
||||
@@ -339,7 +339,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Friendship point boost",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"unlocked": true,
|
||||
"value": "+25%"
|
||||
},
|
||||
@@ -416,7 +416,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Friendship point boost",
|
||||
"description": "Now here’s 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 you’ll get a free night in no time.",
|
||||
"description": "Now here’s 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 you’ll 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 you’re 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 here’s 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 you’ll get a free night in no time.",
|
||||
"description": "Now here’s 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 you’ll 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 you’re 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",
|
||||
|
||||
@@ -433,7 +433,7 @@
|
||||
{
|
||||
"name": "Aamiainen – kaksi yhden hinnalla",
|
||||
"description": "Saat kaksi aamiaista yhden hinnalla, majoitut meillä tai et.",
|
||||
"unlocked": true
|
||||
"unlocked": false
|
||||
},
|
||||
{
|
||||
"name": "48 tunnin 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": "48 tunnin huonetakuu",
|
||||
|
||||
@@ -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 48 timer",
|
||||
@@ -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 48 timer",
|
||||
|
||||
@@ -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": "48 timmars 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": "48 timmars rumsgaranti",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user