UNPKG

ziko-wrapper

Version:

integrate zikojs elements within other ui framework like vue react solidjs svelte astro ...

46 lines (42 loc) 1.42 kB
import { useRef, useEffect } from "preact/hooks"; const processZikoComponent = (child) => { if (typeof child?.type === "function") { let zikoComponent; if (child.props?.children) { const childArray = Array.isArray(child.props.children) ? child.props.children : [child.props.children]; const processedChildren = childArray .map((nestedChild) => processZikoComponent(nestedChild)) .filter((element) => element !== null); zikoComponent = child.type(child.props, ...processedChildren); } else { zikoComponent = child.type(child.props); } return zikoComponent.unrender(); } return null; }; export function ZikoWrapper({ children }) { const containerRef = useRef(null); useEffect(() => { if (containerRef.current && children) { containerRef.current.innerHTML = ""; const childArray = Array.isArray(children) ? children : [children]; childArray.forEach((child) => { const processedComponent = processZikoComponent(child); if (processedComponent?.element instanceof HTMLElement) { containerRef.current.appendChild(processedComponent.element); } }); } }, [children]); return ( <div data-wrapper="ziko-wrapper" data-engine="ziko.js" ref={containerRef} style={{ display: "contents" }} /> ); }