UNPKG

@nitrogenbuilder/client-react

Version:

Nitrogen Builder React Client

207 lines (206 loc) 9.05 kB
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime"; import { nitrogen } from '@nitrogenbuilder/client-core'; import { getDefault } from './utils/getDefault.js'; import { resolve } from './utils/resolve.js'; import { set } from './utils/set.js'; function renderChildren(mod, dynamicData = {}, requestedData = {}) { if (!mod.props.children) return undefined; if (Array.isArray(mod.props.children)) { return mod.props.children.flatMap((child) => { return renderModule(child, dynamicData, requestedData); }); } else if (typeof mod.props.children === 'object') { return Object.keys(mod.props.children).reduce((acc, slot) => { if (Array.isArray(mod.props.children[slot])) { return { ...acc, [slot]: mod.props.children[slot].flatMap((child) => { return renderModule(child, dynamicData, requestedData); }), }; } return acc; }, {}); } return undefined; } export function renderModuleProps(props, settings, dynamicData = {}, requestedData = {}) { let _settings; if (typeof settings === 'string') { const module = nitrogen.getModule(settings); if (!module) return {}; _settings = { categories: module.categories, options: module.options, }; } else { _settings = settings; } let spreadProps = { ...(props ?? {}) }; delete spreadProps.children; function recursiveArrayPropDefault(prop, keys) { if (prop.props) { Object.entries(prop.props).forEach(([subPropK, subPropV]) => { if (subPropV.type === 'array') { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { recursiveArrayPropDefault(subPropV, [ ...keys, `${indexes[i]}`, subPropK, ]); } } else { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { set(spreadProps, getDefault(resolve([...keys, `${indexes[i]}`, subPropK].join('.'), spreadProps), subPropV), [...keys, `${indexes[i]}`, subPropK]); } } }); } } Object.values(_settings.categories).forEach((category) => { Object.entries(category.groups).forEach(([groupK, group]) => { Object.entries(group.props).forEach(([propK, propV]) => { if (spreadProps[groupK] === undefined) { spreadProps[groupK] = {}; } if (propV.type === 'array') { recursiveArrayPropDefault(propV, [groupK, propK]); } else { spreadProps[groupK][propK] = getDefault(spreadProps[groupK][propK], propV); } }); }); }); function recursiveDynamicProps(keys) { let props = resolve(keys.join('.'), spreadProps); if (!props) return; let propChildrenKeys = Object.keys(props); for (let j = 0; j < propChildrenKeys.length; j++) { let propChildrenKey = propChildrenKeys[j]; let propChild = props[propChildrenKey]; if (propChildrenKey.endsWith('___dynamic')) { const dynamicVal = resolve(propChild.key, dynamicData) || propChild.fallback || ''; props[propChildrenKey.replace('___dynamic', '')] = typeof dynamicVal === 'boolean' ? dynamicVal : (propChild.before || '') + dynamicVal + (propChild.after || ''); } else if (typeof props[propChildrenKey] === 'object') { recursiveDynamicProps([...keys, propChildrenKey]); } } } let groupKeys = Object.keys(spreadProps); for (let i = 0; i < groupKeys.length; i++) { let groupKey = groupKeys[i]; if (typeof groupKey === 'string') { if (typeof spreadProps[groupKey] === 'object') { // check children properties for if the end in ___dynamic recursiveDynamicProps([groupKey]); } } } return spreadProps; } function renderModule(mod, dynamicData = {}, requestedData = {}) { const Component = nitrogen.getModuleComponent(typeof mod.module === 'object' ? mod.module.name : mod.module); if (!Component) { console.groupCollapsed('NitrogenRenderer/renderModule/Component'); console.warn('Component not found for module. Possibly removed or renamed.', mod); console.groupEnd(); return null; } const module = typeof mod.module === 'object' ? mod.module : nitrogen.getModule(mod.module); const hasSlots = typeof mod.props?.children === 'object' && !Array.isArray(mod.props?.children); let spreadProps = { ...(mod?.props ?? {}) }; delete spreadProps.children; if (typeof module === 'object') { function recursiveArrayPropDefault(prop, keys) { if (prop.props) { Object.entries(prop.props).forEach(([subPropK, subPropV]) => { if (subPropV.type === 'array') { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { recursiveArrayPropDefault(subPropV, [ ...keys, `${indexes[i]}`, subPropK, ]); } } else { let indexes = Object.keys(resolve(keys.join('.'), spreadProps) ?? {}); for (let i = 0; i < indexes.length; i++) { set(spreadProps, getDefault(resolve([...keys, `${indexes[i]}`, subPropK].join('.'), spreadProps), subPropV), [...keys, `${indexes[i]}`, subPropK]); } } }); } } Object.values(module.categories).forEach((category) => { Object.entries(category.groups).forEach(([groupK, group]) => { Object.entries(group.props).forEach(([propK, propV]) => { if (spreadProps[groupK] === undefined) { spreadProps[groupK] = {}; } if (propV.type === 'array') { recursiveArrayPropDefault(propV, [groupK, propK]); } else { spreadProps[groupK][propK] = getDefault(spreadProps[groupK][propK], propV); } }); }); }); } function recursiveDynamicProps(keys) { let props = resolve(keys.join('.'), spreadProps); if (!props) return; let propChildrenKeys = Object.keys(props); for (let j = 0; j < propChildrenKeys.length; j++) { let propChildrenKey = propChildrenKeys[j]; let propChild = props[propChildrenKey]; if (propChildrenKey.endsWith('___dynamic')) { const dynamicVal = resolve(propChild.key, dynamicData) || propChild.fallback || ''; props[propChildrenKey.replace('___dynamic', '')] = typeof dynamicVal === 'boolean' ? dynamicVal : (propChild.before || '') + dynamicVal + (propChild.after || ''); } else if (typeof props[propChildrenKey] === 'object') { recursiveDynamicProps([...keys, propChildrenKey]); } } } let groupKeys = Object.keys(spreadProps); for (let i = 0; i < groupKeys.length; i++) { let groupKey = groupKeys[i]; if (typeof groupKey === 'string') { if (typeof spreadProps[groupKey] === 'object') { // check children properties for if the end in ___dynamic recursiveDynamicProps([groupKey]); } } } return (_jsx(Component, { id: mod.id, ...spreadProps, requestedData: requestedData[mod.id] ?? undefined, ...(hasSlots && { slots: renderChildren(mod, dynamicData, requestedData), }), children: hasSlots ? null : renderChildren(mod, dynamicData, requestedData) }, mod.id)); } export default function NitrogenRenderer({ page, dynamicData, requestedData, }) { return (_jsx(_Fragment, { children: page.map((block) => { return renderModule(block, dynamicData, requestedData); }) })); }