diff --git a/.gitignore b/.gitignore index ff730ab991a..67f7e0f8fbb 100644 --- a/.gitignore +++ b/.gitignore @@ -43,7 +43,6 @@ sites/lab/pages !sites/lab/pages/*/index.js # org auto-generated pages -sites/org/pages/docs/* sites/org/pages/new/pattern/* # Node dependencies diff --git a/markdown/org/docs/en.md b/markdown/org/docs/en.md index 0bcc7a474fd..c3626ddc79f 100644 --- a/markdown/org/docs/en.md +++ b/markdown/org/docs/en.md @@ -17,10 +17,3 @@ developer/contributor docs, please refer to - - -We should diataxis our docs - - - - diff --git a/sites/org/pages/docs/[...slug].mjs b/sites/org/pages/docs/[...slug].mjs new file mode 100644 index 00000000000..3da341e7833 --- /dev/null +++ b/sites/org/pages/docs/[...slug].mjs @@ -0,0 +1,232 @@ +// Used in static paths +import mdxPaths from 'site/prebuild/mdx.paths.js' +// Dependencies +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' +// Hooks +import { useState, useEffect } from 'react' +// Components +import Head from 'next/head' +import { PageWrapper, ns } from 'shared/components/wrappers/page.mjs' +import { Spinner } from 'shared/components/spinner.mjs' +import { components } from 'shared/components/mdx/index.mjs' +import { MdxWrapper } from 'shared/components/wrappers/mdx.mjs' +//import { TocWrapper } from 'shared/components/wrappers/toc.mjs' + +/* + * PLEASE READ THIS BEFORE YOU TRY TO REFACTOR THIS PAGE + * + * You will notice that this page has a page component for each language + * and that those components are 95% identical. So you may be thinking: + * + * This is not DRY, let me refactor this real quick + * + * Before you do so, please reflect on these topics: + * + * - Do you know the pitfalls of dynamic imports in Webpack? + * - Do you know how much documentation we have? + * - Do you know we support 5 languages? + * + * If you do know all of these thigns, and you think you can improve this page. Go ahead. + * + * If you are not sure, then I would recommend you find something else to work on, unless + * you consider this a learning opportunity. + * + * joost + * + */ + +export const Loading = () => ( + +) + +export const HeadInfo = ({ frontmatter, locale, slug }) => ( + + + + + + + + + + + + + {frontmatter.title} - FreeSewing.org + +) + +export const Page = ({ page, frontmatter, slug, locale, MDX }) => ( + + +
+ {false && frontmatter.toc && ( +
+ {/* FIXME: Implement toc plugin to add it to the frontmatter */} + {/* */} +
+ )} + {MDX} +
+
+) + +const EnDocsPage = ({ page, slug }) => { + // State + const [frontmatter, setFrontmatter] = useState({ title: 'FreeSewing.org' }) + const [MDX, setMDX] = useState() + + /* Load MDX dynamically */ + useEffect(() => { + const loadMDX = async () => { + import(`../../../../markdown/org/${slug}/en.md`).then((mod) => { + setFrontmatter(mod.frontmatter) + const Component = mod.default + setMDX() + }) + } + loadMDX() + }, [slug]) + + return +} + +const FrDocsPage = ({ page, slug }) => { + // State + const [frontmatter, setFrontmatter] = useState({ title: 'FreeSewing.org' }) + const [MDX, setMDX] = useState() + + /* Load MDX dynamically */ + useEffect(() => { + const loadMDX = async () => { + import(`../../../../markdown/org/${slug}/fr.md`).then((mod) => { + setFrontmatter(mod.frontmatter) + const Component = mod.default + setMDX() + }) + } + loadMDX() + }, [slug]) + + return +} + +const EsDocsPage = ({ page, slug }) => { + // State + const [frontmatter, setFrontmatter] = useState({ title: 'FreeSewing.org' }) + const [MDX, setMDX] = useState() + + /* Load MDX dynamically */ + useEffect(() => { + const loadMDX = async () => { + import(`../../../../markdown/org/${slug}/es.md`).then((mod) => { + setFrontmatter(mod.frontmatter) + const Component = mod.default + setMDX() + }) + } + loadMDX() + }, [slug]) + + return +} + +const DeDocsPage = ({ page, slug }) => { + // State + const [frontmatter, setFrontmatter] = useState({ title: 'FreeSewing.org' }) + const [MDX, setMDX] = useState() + + /* Load MDX dynamically */ + useEffect(() => { + const loadMDX = async () => { + import(`../../../../markdown/org/${slug}/de.md`).then((mod) => { + setFrontmatter(mod.frontmatter) + const Component = mod.default + setMDX() + }) + } + loadMDX() + }, [slug]) + + return +} + +const NlDocsPage = ({ page, slug }) => { + // State + const [frontmatter, setFrontmatter] = useState({ title: 'FreeSewing.org' }) + const [MDX, setMDX] = useState() + + /* Load MDX dynamically */ + useEffect(() => { + const loadMDX = async () => { + import(`../../../../markdown/org/${slug}/nl.md`).then((mod) => { + setFrontmatter(mod.frontmatter) + const Component = mod.default + setMDX() + }) + } + loadMDX() + }, [slug]) + + return +} + +const DocsPage = (props) => { + if (props.locale === 'en') return + if (props.locale === 'fr') return + if (props.locale === 'es') return + if (props.locale === 'de') return + if (props.locale === 'nl') return +} + +export default DocsPage + +/* + * getStaticProps() is used to fetch data at build-time. + * To learn more, see: https://nextjs.org/docs/basic-features/data-fetching + */ +export async function getStaticProps({ locale, params }) { + return { + props: { + ...(await serverSideTranslations('en', ['docs', ...ns])), + slug: 'docs/' + params.slug.join('/'), + locale, + page: { + locale, + path: ['docs', ...params.slug], + }, + }, + } +} + +/* + * getStaticPaths() is used to specify for which routes (think URLs) + * this page should be used to generate the result. + * + * On this page, it is returning a list of routes (think URLs) for all + * the mdx (markdown) content. + * That list comes from mdxMeta, which is build in the prebuild step + * and contains paths, titles, and intro for all markdown. + * + * To learn more, see: https://nextjs.org/docs/basic-features/data-fetching + */ +export async function getStaticPaths() { + const somePaths = mdxPaths + .filter((path) => path.split('/').length < 5) + .filter((path) => path !== 'docs') + + return { + paths: [ + ...somePaths.map((key) => `/${key}`), + ...somePaths.map((key) => `/es/${key}`), + ...somePaths.map((key) => `/de/${key}`), + ...somePaths.map((key) => `/fr/${key}`), + ...somePaths.map((key) => `/nl/${key}`), + ], + fallback: 'blocking', + } +} diff --git a/sites/org/pages/docs/index.mjs b/sites/org/pages/docs/index.mjs new file mode 100644 index 00000000000..dbd8b1a6ced --- /dev/null +++ b/sites/org/pages/docs/index.mjs @@ -0,0 +1,50 @@ +// Dependencies +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' +// Hooks +import { useState, useEffect } from 'react' +// Components +import { ns } from 'shared/components/wrappers/page.mjs' +import { components } from 'shared/components/mdx/index.mjs' +import { MdxWrapper } from 'shared/components/wrappers/mdx.mjs' +//import { TocWrapper } from 'shared/components/wrappers/toc.mjs' +import { Loading, HeadInfo, Page } from './[...slug].mjs' + +const DocsHomePage = ({ page, slug, locale }) => { + // State + const [frontmatter, setFrontmatter] = useState({ title: 'FreeSewing.org' }) + const [MDX, setMDX] = useState() + + /* Load MDX dynamically */ + useEffect(() => { + const loadMDX = async () => { + import(`../../../../markdown/org/docs/${locale}.md`).then((mod) => { + setFrontmatter(mod.frontmatter) + const Component = mod.default + setMDX() + }) + } + loadMDX() + }, [slug]) + + return +} + +export default DocsHomePage + +/* + * getStaticProps() is used to fetch data at build-time. + * To learn more, see: https://nextjs.org/docs/basic-features/data-fetching + */ +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations('en', ['docs', ...ns])), + slug: 'docs', + locale, + page: { + locale, + path: ['docs'], + }, + }, + } +}