From 17ff0eaaea6d29f37a1f9097ba1c3b1fc09feb70 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sun, 18 Jan 2026 02:31:49 +0000 Subject: [PATCH] Enhance binding resolution in component renderer --- src/lib/json-ui/component-renderer.tsx | 28 ++++++++++++-------------- src/types/json-ui.ts | 1 + 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/lib/json-ui/component-renderer.tsx b/src/lib/json-ui/component-renderer.tsx index 51479dc..ef02c71 100644 --- a/src/lib/json-ui/component-renderer.tsx +++ b/src/lib/json-ui/component-renderer.tsx @@ -1,20 +1,16 @@ import { createElement, useMemo } from 'react' import { UIComponent, Binding, ComponentRendererProps } from '@/types/json-ui' import { getUIComponent } from './component-registry' +import { getNestedValue } from './utils' function resolveBinding(binding: Binding, data: Record): unknown { - let value: unknown = data[binding.source] + const sourceValue = binding.source.includes('.') + ? getNestedValue(data, binding.source) + : data[binding.source] + let value: unknown = sourceValue if (binding.path) { - const keys = binding.path.split('.') - for (const key of keys) { - if (value && typeof value === 'object') { - value = (value as Record)[key] - } else { - value = undefined - break - } - } + value = getNestedValue(value, binding.path) } if (binding.transform) { @@ -24,20 +20,21 @@ function resolveBinding(binding: Binding, data: Record): unknow return value } -export function ComponentRenderer({ component, data, onEvent }: ComponentRendererProps) { +export function ComponentRenderer({ component, data, context = {}, onEvent }: ComponentRendererProps) { + const mergedData = useMemo(() => ({ ...data, ...context }), [data, context]) const resolvedProps = useMemo(() => { const resolved: Record = { ...component.props } if (component.bindings) { Object.entries(component.bindings).forEach(([propName, binding]) => { - resolved[propName] = resolveBinding(binding, data) + resolved[propName] = resolveBinding(binding, mergedData) }) } if (component.events && onEvent) { component.events.forEach(handler => { resolved[`on${handler.event.charAt(0).toUpperCase()}${handler.event.slice(1)}`] = (e: unknown) => { - if (!handler.condition || handler.condition(data)) { + if (!handler.condition || handler.condition(mergedData as Record)) { onEvent(component.id, handler.event, e) } } @@ -45,7 +42,7 @@ export function ComponentRenderer({ component, data, onEvent }: ComponentRendere } return resolved - }, [component, data, onEvent]) + }, [component, mergedData, onEvent]) const Component = getUIComponent(component.type) @@ -55,7 +52,7 @@ export function ComponentRenderer({ component, data, onEvent }: ComponentRendere } if (component.condition) { - const conditionValue = resolveBinding(component.condition, data) + const conditionValue = resolveBinding(component.condition, mergedData) if (!conditionValue) { return null } @@ -66,6 +63,7 @@ export function ComponentRenderer({ component, data, onEvent }: ComponentRendere key={child.id || index} component={child} data={data} + context={context} onEvent={onEvent} /> )) diff --git a/src/types/json-ui.ts b/src/types/json-ui.ts index 8b6889d..f4c1782 100644 --- a/src/types/json-ui.ts +++ b/src/types/json-ui.ts @@ -98,6 +98,7 @@ export interface JSONUIContext { export interface ComponentRendererProps { component: UIComponent data: Record + context?: Record onEvent?: (componentId: string, event: string, eventData: unknown) => void }