Files
misode.github.io/src/app/pages/Versions.tsx
Misode ddd00dd731 Add version mcmeta diff page (#428)
* Add version mcmeta diff page

* Add toggle for word wrapping

* Fix diff view on mobile

* Use full layout width on version details

* Show image and audio diffs

* Add word_wrap locale
2023-10-09 22:09:36 +02:00

56 lines
2.1 KiB
TypeScript

import { BtnLink, ErrorPanel, Footer, VersionDetail, VersionList } from '../components/index.js'
import { useLocale, useTitle } from '../contexts/index.js'
import { useAsync, useSearchParam } from '../hooks/index.js'
import type { VersionMeta } from '../services/index.js'
import { fetchVersions } from '../services/index.js'
interface Props {
path?: string,
}
export function Versions({}: Props) {
const { locale } = useLocale()
const { value: versions, error } = useAsync(fetchVersions, [])
const [selectedId] = useSearchParam('id')
const selected = (versions ?? []).find(v => v.id === selectedId)
const [tab] = useSearchParam('tab')
useTitle(
selected ? `Minecraft ${selected.name}` : 'Versions Explorer',
selected ? [] : undefined,
selected ? 'Changes and metadata' : undefined)
const nextVersion = selected && getOffsetVersion(versions ?? [], selected, -1)
const previousVersion = selected && getOffsetVersion(versions ?? [], selected, 1)
return <main>
{error && <ErrorPanel error={error} />}
{selectedId ? <div class="p-4">
<div class="navigation">
<BtnLink link="/versions/" icon="three_bars" label={locale('versions.all')} />
<BtnLink link={previousVersion ? `/versions/?id=${previousVersion.id}${tab ? `&tab=${tab}` : ''}` : undefined}
icon="arrow_left" label={locale('versions.previous')} />
<BtnLink link={nextVersion ? `/versions/?id=${nextVersion.id}${tab ? `&tab=${tab}` : ''}` : undefined}
icon="arrow_right" label={locale('versions.next')} swapped />
</div>
<VersionDetail id={selectedId} version={selected} />
</div> : <div class="legacy-container">
<VersionList versions={versions} link={id => `/versions/?id=${id}`} navigation={(
<BtnLink link="/changelog" icon="git_commit" label={locale('versions.changelog')} />
)} />
</div>}
<Footer donate={false} />
</main>
}
function getOffsetVersion(versions: VersionMeta[], current: VersionMeta, offset: number) {
const currentIndex = versions.findIndex(v => v.id === current.id)
const offsetIndex = currentIndex + offset
if (offsetIndex < 0 || offsetIndex >= versions.length) {
return undefined
}
return versions[offsetIndex]
}