Refactor how partner generators work + prefix generator translation keys

This commit is contained in:
Misode
2024-01-18 03:22:10 +01:00
parent acc55ae7a3
commit b4e9d86c43
27 changed files with 429 additions and 415 deletions

View File

@@ -5,7 +5,7 @@ import '../styles/nodes.css'
import { Analytics } from './Analytics.js'
import { cleanUrl } from './Utils.js'
import { Header } from './components/index.js'
import { Changelog, Customized, Generator, Generators, Guide, Guides, Home, Partners, Sounds, Transformation, Versions, WhatsNew, Worldgen } from './pages/index.js'
import { Changelog, Customized, Generator, Generators, Guide, Guides, Home, LegacyPartners, Partners, Sounds, Transformation, Versions, WhatsNew, Worldgen } from './pages/index.js'
export function App() {
const changeRoute = (e: RouterOnChangeArgs) => {
@@ -21,6 +21,7 @@ export function App() {
<Generators path="/generators" />
<Worldgen path="/worldgen" />
<Partners path="/partners" />
<LegacyPartners path="/partners/:id" />
<Sounds path="/sounds" />
<Changelog path="/changelog" />
<Versions path="/versions" />

View File

@@ -28,7 +28,7 @@ export function Header() {
{config.generators
.filter(g => g.tags?.[0] === gen?.tags?.[0] && checkVersion(version, g.minVersion))
.map(g =>
<Btn label={locale(g.partner ? `partner.${g.partner}.${g.id}` : g.id)} active={g.id === gen.id} onClick={() => route(cleanUrl(g.url))} />
<Btn label={locale(`generator.${g.id}`)} active={g.id === gen.id} onClick={() => route(cleanUrl(g.url))} />
)}
</BtnMenu>}
{!gen && url.match(/\/?project\/?$/) && <BtnMenu icon="chevron_down" tooltip={locale('switch_project')}>

View File

@@ -24,7 +24,7 @@ export function GeneratorCard({ id, minimal }: Props) {
return gen
}, [id])
const title = locale(gen.partner ? `partner.${gen.partner}.${gen.id}` : gen.id)
const title = locale(`generator.${gen.id}`)
const icon = Object.keys(Icons).includes(id) ? id as keyof typeof Icons : undefined
@@ -53,7 +53,7 @@ export function GeneratorCard({ id, minimal }: Props) {
return []
}, [gen])
return <Card title={<>{title}{icon && Icons[icon]}</>} overlay={gen.partner ? locale(`partner.${gen.partner}`) : versionText} link={cleanUrl(gen.url)}>
return <Card title={<>{title}{icon && Icons[icon]}</>} overlay={gen.tags?.includes('partners') ? locale(`partner.${gen.id.substring(0, gen.id.indexOf('.'))}`) : versionText} link={cleanUrl(gen.url)}>
{!gen.noPath && <p class="card-subtitle">/{gen.path ?? gen.id}</p>}
{tags.length > 0 && <div class="badges-list">
{tags.sort().map(tag => <Badge label={tag} />)}

View File

@@ -28,7 +28,7 @@ export function GeneratorList({ predicate }: Props) {
const filteredGenerators = useMemo(() => {
const query = search.split(' ').map(q => q.trim().toLowerCase()).filter(q => q.length > 0)
return versionedGenerators.filter(gen => {
const content = `${gen.id} ${gen.tags?.join(' ') ?? ''} ${gen.path ?? ''} ${gen.partner ?? ''} ${locale(gen.id).toLowerCase()}`
const content = `${gen.id} ${gen.tags?.join(' ') ?? ''} ${gen.path ?? ''} ${locale(`generator.${gen.id}`).toLowerCase()}`
return query.every(q => {
if (q.startsWith('!')) {
return q.length === 1 || !content.includes(q.slice(1))

View File

@@ -315,7 +315,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
return <>
<main class={`generator${previewShown ? ' has-preview' : ''}${projectShown ? ' has-project' : ''}`}>
{!gen.partner && <Ad id="data-pack-generator" type="text" />}
{!gen.tags?.includes('partners') && <Ad id="data-pack-generator" type="text" />}
<div class="controls generator-controls">
{gen.wiki && <a class="btn btn-link tooltipped tip-se" aria-label={locale('learn_on_the_wiki')} href={`https://minecraft.wiki/w/${gen.wiki}`} target="_blank">
{Octicon.mortar_board}
@@ -336,7 +336,7 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) {
</div>
{error && <ErrorPanel error={error} onDismiss={() => setError(null)} />}
<Tree {...{model, version, blockStates}} onError={setError} />
<Footer donate={!gen.partner} />
<Footer donate={!gen.tags?.includes('partners')} />
</main>
<div class="popup-actions right-actions" style={`--offset: -${8 + actionsShown * 50}px;`}>
<div class={`popup-action action-preview${hasPreview ? ' shown' : ''} tooltipped tip-nw`} aria-label={locale(previewShown ? 'hide_preview' : 'show_preview')} onClick={togglePreview}>

View File

@@ -1,12 +1,12 @@
import { getCurrentUrl, route } from 'preact-router'
import { useMemo } from 'preact/hooks'
import config from '../Config.js'
import { getGenerator } from '../Utils.js'
import { SchemaGenerator } from '../components/generator/SchemaGenerator.jsx'
import { ErrorPanel, Octicon } from '../components/index.js'
import config from '../Config.js'
import { useLocale, useTitle, useVersion } from '../contexts/index.js'
import type { VersionId } from '../services/index.js'
import { checkVersion } from '../services/index.js'
import { getGenerator } from '../Utils.js'
export const SHARE_KEY = 'share'
@@ -29,7 +29,7 @@ export function Generator({}: Props) {
.reverse()
}, [gen.minVersion, gen.maxVersion])
useTitle(locale('title.generator', locale(gen.partner ? `partner.${gen.partner}.${gen.id}` : gen.id)), allowedVersions)
useTitle(locale('title.generator', locale(`generator.${gen.id}`)), allowedVersions)
if (!checkVersion(version, gen.minVersion, gen.maxVersion)) {
const lower = !checkVersion(version, gen.minVersion)

View File

@@ -10,7 +10,7 @@ export function Generators({}: Props) {
return <main>
<div class="legacy-container">
<GeneratorList predicate={gen => !gen.partner} />
<GeneratorList predicate={gen => !gen.tags?.includes('partners')} />
</div>
<Footer />
</main>

View File

@@ -24,20 +24,27 @@ export function Home({}: Props) {
return <main>
<div class="legacy-container">
<div class="card-group">
<div class="card-column">
{smallScreen ? /* mobile */ <>
<PopularGenerators />
{smallScreen && <FavoriteGenerators />}
{smallScreen && <WhatsNew />}
<Changelog />
<Versions />
{smallScreen && <Tools />}
<Guides />
</div>
{!smallScreen && <div class="card-column">
<FavoriteGenerators />
<WhatsNew />
<Changelog />
<Versions />
<Tools />
</div>}
<Guides />
</> : /* desktop */ <>
<div class="card-column">
<PopularGenerators />
<Changelog />
<Versions />
<Guides />
</div>
{!smallScreen && <div class="card-column">
<FavoriteGenerators />
<WhatsNew />
<Tools />
</div>}
</>}
</div>
<Contributors />
<Giscus />
@@ -54,6 +61,7 @@ function PopularGenerators() {
<GeneratorCard minimal id="predicate" />
<ToolCard title={locale('worldgen')} link="/worldgen/" titleIcon="worldgen" />
<ToolCard title={locale('generators.all')} link="/generators/" titleIcon="arrow_right" />
<ToolCard title={locale('generators.partners')} link="/partners/" titleIcon="arrow_right" />
</ToolGroup>
}

View File

@@ -0,0 +1,10 @@
import { route } from 'preact-router'
interface Props {
path: string
}
export function LegacyPartners({ path }: Props) {
route(path.replace('/partners/', '/'))
return null
}

View File

@@ -10,7 +10,7 @@ export function Partners({}: Props) {
return <main>
<div class="legacy-container">
<GeneratorList predicate={gen => gen.partner !== undefined} />
<GeneratorList predicate={gen => gen.tags?.includes('partners')} />
</div>
<Footer donate={false} />
</main>

View File

@@ -5,6 +5,7 @@ export * from './Generators.jsx'
export * from './Guide.js'
export * from './Guides.js'
export * from './Home.js'
export * from './LegacyPartners.jsx'
export * from './Partners.js'
export * from './Sounds.js'
export * from './Transformation.jsx'