Skip to content

Commit 78ee10b

Browse files
committed
refactor: Mostly works
1 parent 067193a commit 78ee10b

31 files changed

Lines changed: 775 additions & 1108 deletions

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"node": ">=20"
88
},
99
"scripts": {
10-
"dev": "vite --port 8080",
11-
"server": "vite preview --port 8080",
10+
"serve:dev": "vite --port 3000",
11+
"serve:prod": "vite preview --port 3000",
1212
"build": "vite build",
1313
"lint": "eslint src test",
1414
"format": "prettier --write \"{src,test}/**/*.{css,js,json}\"",
Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,37 @@
1-
import config from '../../config.json';
2-
import { useLanguage, useTranslation } from '../../lib/i18n';
1+
import { blogPosts } from '../../route-config.js';
2+
import { useTranslate, useBlogTranslate } from '../../lib/i18n';
33
import { Time } from '../time';
44
import s from './style.module.css';
55

66
export default function BlogOverview() {
7-
const [lang] = useLanguage();
8-
const continueReading = useTranslation('continueReading');
7+
const translate = useTranslate();
8+
const translateBlog = useBlogTranslate();
9+
10+
const posts = [];
11+
for (const post in blogPosts) {
12+
const translatedBlog = translateBlog(
13+
/** @type {keyof typeof blogPosts} */ (post)
14+
);
15+
16+
posts.push(
17+
<article class={s.post}>
18+
<div class={s.meta}>
19+
<Time value={blogPosts[post].date} />
20+
</div>
21+
<h2 class={s.title}>
22+
<a href={post}>{translatedBlog.label}</a>
23+
</h2>
24+
<p class={s.excerpt}>{translatedBlog.excerpt}</p>
25+
<a href={post} class="btn-small">
26+
{translate('i18n', 'continueReading')} &rarr;
27+
</a>
28+
</article>
29+
);
30+
}
931

1032
return (
1133
<div>
12-
<div class={s.postList}>
13-
{config.blog.map(post => {
14-
//const name = getRouteName(post, lang);
15-
const name = 'FIXME';
16-
const excerpt = post.excerpt[lang] || post.excerpt.en;
17-
18-
return (
19-
<article class={s.post}>
20-
<div class={s.meta}>
21-
<Time value={post.date} />
22-
</div>
23-
<h2 class={s.title}>
24-
<a href={post.path}>{name}</a>
25-
</h2>
26-
<p class={s.excerpt}>{excerpt}</p>
27-
<a href={post.path} class="btn-small">
28-
{continueReading} &rarr;
29-
</a>
30-
</article>
31-
);
32-
})}
33-
</div>
34+
<div class={s.postList}>{posts}</div>
3435
</div>
3536
);
3637
}

src/components/controllers/blog-page.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { useContent } from '../../lib/use-content';
33
import { NotFound } from './not-found';
44
import { MarkdownRegion } from './markdown-region';
55
import Footer from '../footer/index';
6-
import { blogRoutes } from '../../lib/route-utils';
6+
import { blogPosts } from '../../route-config.js';
77
import style from './style.module.css';
88

99
export default function BlogPage() {
1010
const { slug } = useRoute().params;
11-
const isValidRoute = blogRoutes[`/blog/${slug}`];
11+
const isValidRoute = blogPosts[`/blog/${slug}`];
1212

1313
return (
1414
<ErrorBoundary>

src/components/controllers/guide-page.jsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
import { useState, useEffect } from 'preact/hooks';
22
import { useRoute, ErrorBoundary } from 'preact-iso';
33
import { useContent } from '../../lib/use-content';
4-
import { useLanguage } from '../../lib/i18n.jsx';
5-
import config from '../../config.json';
4+
import { useLanguageContext } from '../../lib/i18n.jsx';
65
import { NotFound } from './not-found';
76
import cx from '../../lib/cx';
87
import { MarkdownRegion } from './markdown-region';
98
import Sidebar from '../sidebar';
109
import Footer from '../footer/index';
11-
import { flatv10DocPages } from '../../config.js';
12-
//import { docRoutes } from '../../lib/route-utils';
10+
import { flatDocPages } from '../../route-config.js';
1311
import { LATEST_MAJOR, PREVIEW_MAJOR } from '../doc-version';
1412
import style from './style.module.css';
1513

1614
export function GuidePage() {
1715
const { version, name } = useRoute().params;
18-
const isValidRoute = flatv10DocPages['/' + name];
16+
const isValidRoute = flatDocPages[version]['/' + name];
1917

2018
return (
2119
<ErrorBoundary>
@@ -58,9 +56,7 @@ function OldDocsWarning() {
5856
}
5957

6058
const outdatedVersion = version !== PREVIEW_MAJOR;
61-
const latestExists = config.docs[LATEST_MAJOR].some(section =>
62-
section.routes.some(route => route.path === '/' + name)
63-
);
59+
const latestExists = flatDocPages[LATEST_MAJOR]['/' + name];
6460

6561
return (
6662
<div class={style.stickyWarning}>
@@ -94,7 +90,7 @@ const MAINTAINED_LANGUAGES = ['en', 'ru', 'zh'];
9490
function UnmaintainedTranslationWarning({ meta }) {
9591
const { path, params } = useRoute();
9692
const { name, version } = params;
97-
const [lang, setLang] = useLanguage();
93+
const { lang, setLang } = useLanguageContext();
9894

9995
if (
10096
version !== LATEST_MAJOR ||

src/components/controllers/page.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { useRoute, ErrorBoundary } from 'preact-iso';
2-
import { navRoutes } from '../../lib/route-utils';
32
import { useContent } from '../../lib/use-content';
43
import { NotFound } from './not-found';
54
import { MarkdownRegion } from './markdown-region';
65
import Footer from '../footer/index';
76
import style from './style.module.css';
7+
import { headerNav } from '../../route-config.js';
88

99
// Supports generic pages like `/`, `/about/*`, `/blog`, etc.
1010
export function Page() {
1111
const { path } = useRoute();
12-
const isValidRoute = true;
12+
const isValidRoute = headerNav[path];
1313

1414
return (
1515
<ErrorBoundary>

src/components/controllers/tutorial-page.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import { Tutorial } from './tutorial';
44
import { SolutionProvider } from './tutorial/contexts';
55
import { NotFound } from './not-found';
66
import { useContent, prefetchContent } from '../../lib/use-content';
7-
import { tutorialRoutes } from '../../lib/route-utils';
7+
import { tutorialPages } from '../../route-config.js';
88

99
import style from './tutorial/style.module.css';
1010

1111
export default function TutorialPage() {
1212
const { step } = useRoute().params;
13-
const isValidRoute = tutorialRoutes[`/tutorial${step ? `/${step}` : ''}`];
13+
const isValidRoute = tutorialPages[`/tutorial${step ? `/${step}` : ''}`];
1414

1515
return (
1616
<ErrorBoundary>

src/components/controllers/tutorial/index.jsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { TutorialContext, SolutionContext } from './contexts';
1313
import { parseStackTrace } from '../repl/errors';
1414
import cx from '../../../lib/cx';
1515
import { CodeEditor, Runner, ErrorOverlay, Splitter } from '../../routes';
16-
import { useTranslation } from '../../../lib/i18n.jsx';
16+
import { useTranslate } from '../../../lib/i18n.jsx';
1717
import { MarkdownRegion } from '../markdown-region';
1818
import style from './style.module.css';
1919

@@ -215,16 +215,13 @@ export function Tutorial({ html, meta }) {
215215
}
216216

217217
function ButtonContainer({ meta, showCode, help }) {
218-
const previousPage = useTranslation('previousPage');
219-
const nextPage = useTranslation('nextPage');
220-
const solve = useTranslation('solve');
221-
const tutorialBegin = useTranslation('beginTutorial');
218+
const translate = useTranslate();
222219

223220
return (
224221
<div class={style.buttonContainer}>
225222
{meta.prev && (
226223
<a class={style.prevButton} href={meta.prev}>
227-
{previousPage}
224+
{translate('i18n', 'previousPage')}
228225
</a>
229226
)}
230227
{meta.solvable && (
@@ -234,12 +231,14 @@ function ButtonContainer({ meta, showCode, help }) {
234231
disabled={!showCode}
235232
title="Show solution to this example"
236233
>
237-
{solve}
234+
{translate('i18n', 'solve')}
238235
</button>
239236
)}
240237
{meta.next && (
241238
<a class={style.nextButton} href={meta.next}>
242-
{meta.code == false ? tutorialBegin : nextPage}
239+
{meta.code == false
240+
? translate('i18n', 'beginTutorial')
241+
: translate('i18n', 'nextPage')}
243242
</a>
244243
)}
245244
</div>

src/components/doc-version/index.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useCallback } from 'preact/hooks';
22
import { useLocation, useRoute } from 'preact-iso';
3-
import { docRoutes } from '../../lib/route-utils.js';
3+
import { flatDocPages } from '../../route-config.js';
44
import style from './style.module.css';
55

66
export const LATEST_MAJOR = 'v10';
@@ -18,7 +18,7 @@ export default function DocVersion() {
1818
const onChange = useCallback(
1919
e => {
2020
const version = e.currentTarget.value;
21-
const url = docRoutes[version]?.[`/${name}`]
21+
const url = flatDocPages[version]?.[`/${name}`]
2222
? path.replace(/(v\d{1,2})/, version)
2323
: `/guide/${version}/getting-started`;
2424
route(url);

src/components/edit-button/index.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { useRoute } from 'preact-iso';
2-
import { useLanguage } from '../../lib/i18n';
2+
import { useLanguageContext } from '../../lib/i18n';
33
import style from './style.module.css';
44

55
export default function EditThisPage({ isFallback }) {
66
let { path } = useRoute();
7-
const [lang] = useLanguage();
7+
const { lang } = useLanguageContext();
88

99
path = !isFallback ? path + '.md' : '';
1010
const editUrl = `https://github.com/preactjs/preact-www/tree/master/content/${lang}${path}`;

src/components/footer/index.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useCallback } from 'preact/hooks';
22
import config from '../../config.json';
3-
import { useLanguage } from '../../lib/i18n';
3+
import { useLanguageContext } from '../../lib/i18n';
44
import { useResource } from '../../lib/use-resource';
55
import style from './style.module.css';
66

@@ -39,7 +39,7 @@ function useContributors() {
3939

4040
export default function Footer() {
4141
const contrib = useContributors();
42-
const [lang, setLang] = useLanguage();
42+
const { lang, setLang } = useLanguageContext();
4343

4444
const onSelect = useCallback(e => setLang(e.target.value), [setLang]);
4545

0 commit comments

Comments
 (0)