exports.json
files include maps to all published components, and for different modules (base
, blog
, content
).
This is used to look up the correct library folder and component name to resolve.
Created
September 25, 2021 18:15
-
-
Save julrich/73441d0f94fcc581b29183168060d2c9 to your computer and use it in GitHub Desktop.
Usage of `loadable()` for dynamic component resolution for pages
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import baseExports from '@kickstartds/base/lib/exports.json'; | |
import blogExports from '@kickstartds/blog/lib/exports.json'; | |
import contentExports from '@kickstartds/content/lib/exports.json'; | |
const components = {}; | |
const componentCounter = []; | |
Object.entries(baseExports).forEach(([key, value]) => { | |
components[key] = loadable(({component}) => import(`@kickstartds/base/lib/${component}/index.js`), { | |
resolveComponent: (exports) => exports[value[0]], | |
}); | |
}); | |
Object.entries(blogExports).forEach(([key, value]) => { | |
components[key] = loadable(({component}) => import(`@kickstartds/blog/lib/${component}/index.js`), { | |
resolveComponent: (exports) => exports[value[0]], | |
}); | |
}); | |
Object.entries(contentExports).forEach(([key, value]) => { | |
components[key] = loadable(({component}) => import(`@kickstartds/content/lib/${component}/index.js`), { | |
resolveComponent: (exports) => exports[value[0]], | |
}); | |
}); | |
const getComponent = (element) => { | |
const componentType = element['type']; | |
componentCounter[componentType] = componentCounter[componentType]+1 || 1; | |
const key = componentType+'-'+componentCounter[componentType]; | |
const Component = components[componentType]; | |
return <Component component={componentType} key={key} { ...element } />; | |
}; | |
const getContent = (elements) => { | |
if (elements && elements.length > 0) { | |
return elements.map((element) => getComponent(element)); | |
} | |
}; | |
export const Page: FunctionComponent<any> = ({ | |
elements, | |
}) => ( | |
<Layout> | |
{getContent(elements)} | |
</Layout> | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment