hensei-web/components/about/ContentUpdate/index.tsx
Justin Edmund 5a5457f10d
Add support for weapon transcendence images (#404)
Also adds new content from 2024/01 Flash Gala and My Hero Academia
collab.
2024-01-25 02:51:04 -08:00

191 lines
5 KiB
TypeScript

import React from 'react'
import { useTranslation } from 'next-i18next'
import classNames from 'classnames'
import ChangelogUnit from '~components/about/ChangelogUnit'
import styles from './index.module.scss'
interface UpdateObject {
character?: string[]
summon?: string[]
weapon?: string[]
}
interface Props {
version: string
dateString: string
event: string
newItems?: UpdateObject
uncappedItems?: UpdateObject
transcendedItems?: UpdateObject
numNotes: number
}
const ContentUpdate = ({
version,
dateString,
event,
newItems,
uncappedItems,
transcendedItems,
numNotes,
}: Props) => {
const { t: updates } = useTranslation('updates')
const date = new Date(dateString)
function newItemElements(key: 'character' | 'weapon' | 'summon') {
let elements: React.ReactNode[] = []
if (newItems && newItems[key]) {
const items = newItems[key]
elements = items
? items.map((id, i) => {
return <ChangelogUnit id={id} type={key} key={`${key}-${i}`} />
})
: []
}
return elements
}
function newItemSection(key: 'character' | 'weapon' | 'summon') {
let section: React.ReactNode = ''
if (newItems && newItems[key]) {
const items = newItems[key]
section =
items && items.length > 0 ? (
<section className={styles[`${key}s`]}>
<h4>{updates(`labels.${key}s`)}</h4>
<div className={styles.items}>{newItemElements(key)}</div>
</section>
) : (
''
)
}
return section
}
function uncapItemElements(key: 'character' | 'weapon' | 'summon') {
let elements: React.ReactNode[] = []
if (uncappedItems && uncappedItems[key]) {
const items = uncappedItems[key]
elements = items
? items.map((id) => {
return key === 'character' ? (
<ChangelogUnit id={id} type={key} key={id} image="03" />
) : (
<ChangelogUnit id={id} type={key} key={id} />
)
})
: []
}
return elements
}
function uncapItemSection(key: 'character' | 'weapon' | 'summon') {
let section: React.ReactNode = ''
if (uncappedItems && uncappedItems[key]) {
const items = uncappedItems[key]
section =
items && items.length > 0 ? (
<section className={styles[`${key}s`]}>
<h4>{updates(`labels.uncaps.${key}s`)}</h4>
<div className={styles.items}>{uncapItemElements(key)}</div>
</section>
) : (
''
)
}
return section
}
function transcendItemElements(key: 'character' | 'weapon' | 'summon') {
let elements: React.ReactNode[] = []
if (transcendedItems && transcendedItems[key]) {
const items = transcendedItems[key]
elements = items
? items.map((id) => {
return key === 'character' || key === 'summon' ? (
<ChangelogUnit id={id} type={key} key={id} image="04" />
) : (
<ChangelogUnit id={id} type={key} key={id} image="03" />
)
})
: []
}
return elements
}
function transcendItemSection(key: 'character' | 'weapon' | 'summon') {
let section: React.ReactNode = ''
if (transcendedItems && transcendedItems[key]) {
const items = transcendedItems[key]
section =
items && items.length > 0 ? (
<section className={styles[`${key}s`]}>
<h4>{updates(`labels.transcends.${key}s`)}</h4>
<div className={styles.items}>{transcendItemElements(key)}</div>
</section>
) : (
''
)
}
return section
}
return (
<section
className={classNames({
[styles.content]: true,
[styles.version]: true,
})}
data-version={version}
>
<div className={styles.header}>
<h3>{`${updates('events.date', {
year: date.getFullYear(),
month: `${date.getMonth() + 1}`.padStart(2, '0'),
})} ${updates(event)}`}</h3>
<time>{dateString}</time>
</div>
<div className={styles.contents}>
{newItemSection('character')}
{uncapItemSection('character')}
{transcendItemSection('character')}
{newItemSection('weapon')}
{uncapItemSection('weapon')}
{transcendItemSection('weapon')}
{newItemSection('summon')}
{uncapItemSection('summon')}
{transcendItemSection('summon')}
</div>
{numNotes > 0 ? (
<div className={styles.notes}>
<section>
<h4>{updates('labels.updates')}</h4>
<ul className={styles.list}>
{[...Array(numNotes)].map((e, i) => (
<li key={`${version}-${i}`}>
{updates(`versions.${version}.features.${i}`)}
</li>
))}
</ul>
</section>
</div>
) : (
''
)}
</section>
)
}
ContentUpdate.defaultProps = {
numNotes: 0,
}
export default ContentUpdate