add perk comparison logic
This commit is contained in:
@@ -13,28 +13,56 @@ import levelsData from "./data/EN.json"
|
|||||||
|
|
||||||
import styles from "./overviewTable.module.css"
|
import styles from "./overviewTable.module.css"
|
||||||
|
|
||||||
const defaultCardProps = {
|
function getLevelByTier(tier: number) {
|
||||||
title: "title",
|
return levelsData.levels.find((level) => level.tier === tier) as Level
|
||||||
description: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
}
|
||||||
eiusmod tempor incididunt ut labore et dolore magna aliqua.`,
|
|
||||||
comparedValues: { a: false, b: true },
|
function createComparison(levelA: Level, levelB: Level) {
|
||||||
|
const comparedLevels = [levelA, levelB].sort(
|
||||||
|
(a, b) => a.benefits.length - b.benefits.length
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{comparedLevels[1].benefits
|
||||||
|
.filter((benefit) => benefit.unlocked)
|
||||||
|
.map((benefit, idx) => {
|
||||||
|
return (
|
||||||
|
<PerkCard
|
||||||
|
key={benefit.name}
|
||||||
|
title={benefit.name}
|
||||||
|
description={benefit.description}
|
||||||
|
comparedValues={{
|
||||||
|
a: comparedLevels[0].benefits[idx].unlocked,
|
||||||
|
b: comparedLevels[1].benefits[idx].unlocked,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function OverviewTable() {
|
export default function OverviewTable() {
|
||||||
const [selectedLevelA, setSelectedLevelA] = useState("1")
|
const [selectedLevelA, setSelectedLevelA] = useState(getLevelByTier(1))
|
||||||
const [selectedLevelB, setSelectedLevelB] = useState("2")
|
const [selectedLevelB, setSelectedLevelB] = useState(getLevelByTier(2))
|
||||||
|
|
||||||
|
// TODO Come up with a nice wat to make these two a single reusable function
|
||||||
function handleSelectChangeA(event: React.ChangeEvent<HTMLSelectElement>) {
|
function handleSelectChangeA(event: React.ChangeEvent<HTMLSelectElement>) {
|
||||||
setSelectedLevelA(event.target.value)
|
const tier = parseInt(event.target.value)
|
||||||
|
const level = getLevelByTier(tier)
|
||||||
|
setSelectedLevelA(level)
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleSelectChangeB(event: React.ChangeEvent<HTMLSelectElement>) {
|
function handleSelectChangeB(event: React.ChangeEvent<HTMLSelectElement>) {
|
||||||
setSelectedLevelB(event.target.value)
|
const tier = parseInt(event.target.value)
|
||||||
|
const level = getLevelByTier(tier)
|
||||||
|
setSelectedLevelB(level)
|
||||||
}
|
}
|
||||||
|
|
||||||
const levelOptions = levelsData.levels.map((level) => ({
|
const levelOptions = levelsData.levels.map((level) => ({
|
||||||
label: level.name,
|
label: level.name,
|
||||||
value: `${level.tier}`,
|
value: level.tier,
|
||||||
}))
|
}))
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
@@ -63,13 +91,13 @@ export default function OverviewTable() {
|
|||||||
<div className={styles.columnHeader}>
|
<div className={styles.columnHeader}>
|
||||||
<Select
|
<Select
|
||||||
options={levelOptions}
|
options={levelOptions}
|
||||||
defaultOption={selectedLevelA}
|
defaultOption={selectedLevelA.tier}
|
||||||
onChange={handleSelectChangeA}
|
onChange={handleSelectChangeA}
|
||||||
/>
|
/>
|
||||||
<LevelSummary
|
<LevelSummary
|
||||||
level={
|
level={
|
||||||
levelsData.levels.find(
|
levelsData.levels.find(
|
||||||
(level) => `${level.tier}` === selectedLevelA
|
(level) => level.tier === selectedLevelA.tier
|
||||||
) as Level
|
) as Level
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
@@ -77,21 +105,19 @@ export default function OverviewTable() {
|
|||||||
<div className={styles.columnHeader}>
|
<div className={styles.columnHeader}>
|
||||||
<Select
|
<Select
|
||||||
options={levelOptions}
|
options={levelOptions}
|
||||||
defaultOption={selectedLevelB}
|
defaultOption={selectedLevelB.tier}
|
||||||
onChange={handleSelectChangeB}
|
onChange={handleSelectChangeB}
|
||||||
/>
|
/>
|
||||||
<LevelSummary
|
<LevelSummary
|
||||||
level={
|
level={
|
||||||
levelsData.levels.find(
|
levelsData.levels.find(
|
||||||
(level) => `${level.tier}` === selectedLevelB
|
(level) => level.tier === selectedLevelB.tier
|
||||||
) as Level
|
) as Level
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<PerkCard {...defaultCardProps} />
|
{createComparison(selectedLevelA, selectedLevelB)}
|
||||||
<PerkCard {...defaultCardProps} />
|
|
||||||
<PerkCard {...defaultCardProps} />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@@ -100,9 +126,9 @@ export default function OverviewTable() {
|
|||||||
type SelectProps = {
|
type SelectProps = {
|
||||||
options: {
|
options: {
|
||||||
label: string
|
label: string
|
||||||
value: string
|
value: number
|
||||||
}[]
|
}[]
|
||||||
defaultOption: string
|
defaultOption: number
|
||||||
onChange: (event: React.ChangeEvent<HTMLSelectElement>) => void
|
onChange: (event: React.ChangeEvent<HTMLSelectElement>) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,6 +160,13 @@ type Level = {
|
|||||||
description: string
|
description: string
|
||||||
requirement: string
|
requirement: string
|
||||||
icon: string
|
icon: string
|
||||||
|
benefits: [
|
||||||
|
{
|
||||||
|
name: string
|
||||||
|
description: string
|
||||||
|
unlocked: boolean
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
type LevelSummaryProps = {
|
type LevelSummaryProps = {
|
||||||
|
|||||||
Reference in New Issue
Block a user