diff --git a/sites/shared/hooks/use-dynamic-mdx.mjs b/sites/shared/hooks/use-dynamic-mdx.mjs new file mode 100644 index 00000000000..75aba0693d3 --- /dev/null +++ b/sites/shared/hooks/use-dynamic-mdx.mjs @@ -0,0 +1,23 @@ +import { components } from 'shared/components/mdx/index.mjs' +import { Loading } from 'shared/components/spinner.mjs' +import { useState, useEffect } from 'react' + +export const useDynamicMdx = (loader, site = 'org') => { + // State + const [frontmatter, setFrontmatter] = useState({ title: `freeSewing.${site}` }) + const [MDX, setMDX] = useState() + + /* Load MDX dynamically */ + useEffect(() => { + const loadMDX = async () => { + loader().then((mod) => { + setFrontmatter(mod.frontmatter) + const Component = mod.default + setMDX() + }) + } + if (loader) loadMDX() + }, [loader, site]) + + return { MDX, frontmatter } +} diff --git a/sites/shared/prebuild/posts.mjs b/sites/shared/prebuild/posts.mjs new file mode 100644 index 00000000000..fc84b4282bd --- /dev/null +++ b/sites/shared/prebuild/posts.mjs @@ -0,0 +1,52 @@ +import { loadMdxForPrebuild, header } from './docs.mjs' +import fs from 'fs/promises' +import path from 'path' +import rdir from 'recursive-readdir' +import orderBy from 'lodash.orderby' + +const types = ['blog', 'showcase', 'newsletter'] + +export const prebuildPosts = async (site) => { + if (site !== 'org') return {} + + // Languages + const locales = ['en', 'fr', 'es', 'nl', 'de', 'uk'] + const results = await Promise.all( + types.map((t) => + loadMdxForPrebuild(site, path.resolve('..', '..', 'markdown', site, t), locales) + ) + ) + + const writeOps = [] + const pages = {} + for (var i = 0; i < types.length; i++) { + const writePath = path.resolve('..', site, 'prebuild', types[i]) + + const sorted = {} + const resultPages = results[i] + + pages[types[i]] = resultPages + for (const lang in resultPages) { + sorted[lang] = Object.keys(resultPages[lang]).sort( + (a, b) => resultPages[lang][a].o - resultPages[lang][b].o + ) + // get rid of the index page + sorted[lang].shift() + } + + writeOps.push( + fs.writeFile( + path.resolve('..', site, 'prebuild', `${types[i]}-paths.mjs`), + `${header}export const order = ${JSON.stringify( + sorted, + 2, + null + )}\nexport const postInfo = ${JSON.stringify(resultPages, 2, null)}` + ) + ) + } + + await Promise.all(writeOps) + + return pages +}