UNPKG

@mindfiredigital/page-builder-react

Version:
1 lines 9.02 kB
{"version":3,"sources":["../src/components/PageBuilder.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom/client';\nimport {\n PageBuilderReactProps,\n DynamicComponents,\n PageBuilderDesign,\n PageBuilderElement,\n} from '../types/types';\n\nexport const PageBuilderReact: React.FC<PageBuilderReactProps> = ({\n config,\n customComponents,\n initialDesign,\n onChange,\n editable = true,\n brandTitle,\n showAttributeTab,\n layoutMode = 'absolute'\n}) => {\n const builderRef = useRef<PageBuilderElement>(null);\n const [processedConfig, setProcessedConfig] =\n useState<DynamicComponents>(config);\n\n useEffect(() => {\n import('@mindfiredigital/page-builder-web-component').catch(error => {\n console.error('Failed to load web component:', error);\n });\n }, []);\n\n useEffect(() => {\n const modifiedConfig: DynamicComponents | any = config;\n if (customComponents) {\n modifiedConfig.Custom = modifiedConfig.Custom || {};\n\n Object.entries(customComponents).forEach(([key, componentConfig]) => {\n if (!componentConfig.component) {\n console.warn(`Skipping invalid component: ${key}`);\n return;\n }\n const tagName = `react-component-${key.toLowerCase()}`;\n\n if (!customElements.get(tagName)) {\n class ReactComponentElement extends HTMLElement {\n connectedCallback() {\n const mountPoint = document.createElement('div');\n this.appendChild(mountPoint);\n const componentId = this.id;\n\n try {\n ReactDOM.createRoot(mountPoint).render(\n React.createElement(componentConfig.component, {\n componentId: componentId,\n })\n );\n } catch (error) {\n console.error(`Error rendering ${key} component:`, error);\n }\n }\n }\n\n customElements.define(tagName, ReactComponentElement);\n }\n\n const settingsTagName = `react-settings-component-${key.toLowerCase()}`;\n if (\n componentConfig.settingsComponent &&\n !customElements.get(settingsTagName)\n ) {\n class ReactSettingsElement extends HTMLElement {\n connectedCallback() {\n this.innerHTML = '';\n const mountPoint = document.createElement('div');\n this.appendChild(mountPoint);\n const settingsData = this.getAttribute('data-settings');\n const parsedSettings = settingsData\n ? JSON.parse(settingsData)\n : {};\n try {\n ReactDOM.createRoot(mountPoint).render(\n React.createElement(\n componentConfig.settingsComponent!,\n parsedSettings\n )\n );\n } catch (error) {\n console.error(`Error rendering settings component:`, error);\n }\n }\n static get observedAttributes() {\n return ['data-settings'];\n }\n attributeChangedCallback(\n name: string,\n oldValue: string,\n newValue: string\n ) {\n if (name === 'data-settings' && newValue !== oldValue) {\n this.innerHTML = '';\n const mountPoint = document.createElement('div');\n this.appendChild(mountPoint);\n const settingsData = this.getAttribute('data-settings');\n const parsedSettings = settingsData\n ? JSON.parse(settingsData)\n : {};\n ReactDOM.createRoot(mountPoint).render(\n React.createElement(\n componentConfig.settingsComponent!,\n parsedSettings\n )\n );\n }\n }\n }\n\n customElements.define(settingsTagName, ReactSettingsElement);\n }\n modifiedConfig.Custom[key] = {\n component: tagName,\n svg: componentConfig.svg,\n title: componentConfig.title,\n settingsComponent: settingsTagName,\n settingsComponentTagName: settingsTagName,\n };\n });\n }\n\n setProcessedConfig(modifiedConfig);\n }, [config, customComponents]);\n\n useEffect(() => {\n if (builderRef.current) {\n customElements.whenDefined('page-builder').then(() => {\n try {\n if (builderRef.current) {\n // Now it's safe to set properties, they will hit the setters\n builderRef.current.configData = processedConfig;\n builderRef.current.initialDesign = initialDesign;\n builderRef.current.editable = editable;\n builderRef.current.brandTitle = brandTitle;\n builderRef.current.showAttributeTab = showAttributeTab;\n builderRef.current.layoutMode = layoutMode;\n\n const configString = JSON.stringify(processedConfig);\n builderRef.current.setAttribute('config-data', configString);\n }\n } catch (error) {\n console.error('Error setting config-data and initialDesign:', error);\n }\n });\n }\n }, [processedConfig, initialDesign, editable, brandTitle, showAttributeTab]);\n useEffect(() => {\n const webComponent = builderRef.current;\n\n const handleDesignChange = (event: Event) => {\n const customEvent = event as CustomEvent<PageBuilderDesign>;\n if (onChange) {\n onChange(customEvent.detail);\n }\n };\n\n if (webComponent) {\n webComponent.addEventListener('design-change', handleDesignChange);\n }\n\n return () => {\n if (webComponent) {\n webComponent.removeEventListener('design-change', handleDesignChange);\n }\n };\n }, [onChange]);\n\n return <page-builder ref={builderRef} />;\n};\n"],"mappings":"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","names":[]}