From 19f6be22b82ec88a8ad6128b4b20aa1c84f663b8 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sat, 27 Dec 2025 22:59:53 +0000 Subject: [PATCH] refactor: modularize rendering components --- .../rendering/PropertyInspector.tsx | 146 +------------ .../components/rendering/RenderComponent.tsx | 206 +----------------- .../rendering/components/FieldTypes.tsx | 114 ++++++++++ .../rendering/components/PropertyPanels.tsx | 80 +++++++ .../rendering/components/RenderNode.tsx | 188 ++++++++++++++++ 5 files changed, 403 insertions(+), 331 deletions(-) create mode 100644 frontends/nextjs/src/components/rendering/components/FieldTypes.tsx create mode 100644 frontends/nextjs/src/components/rendering/components/PropertyPanels.tsx create mode 100644 frontends/nextjs/src/components/rendering/components/RenderNode.tsx diff --git a/frontends/nextjs/src/components/rendering/PropertyInspector.tsx b/frontends/nextjs/src/components/rendering/PropertyInspector.tsx index 801ac2f4c..baeced0a5 100644 --- a/frontends/nextjs/src/components/rendering/PropertyInspector.tsx +++ b/frontends/nextjs/src/components/rendering/PropertyInspector.tsx @@ -1,16 +1,11 @@ import { useState, useEffect } from 'react' -import { ScrollArea } from '@/components/ui' -import { Input } from '@/components/ui' -import { Label } from '@/components/ui' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui' -import { Button } from '@/components/ui' -import { Separator } from '@/components/ui' -import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui' -import type { ComponentInstance } from '@/lib/builder-types' +import { Separator, Button } from '@/components/ui' +import type { ComponentInstance } from '@/lib/types/builder-types' import { componentCatalog } from '@/lib/component-catalog' -import { Code, PaintBrush, Trash, Palette } from '@phosphor-icons/react' +import { Trash } from '@phosphor-icons/react' import { CssClassBuilder } from '@/components/CssClassBuilder' import { Database, DropdownConfig } from '@/lib/database' +import { PropertyPanels } from './components/PropertyPanels' interface PropertyInspectorProps { component: ComponentInstance | null @@ -67,131 +62,14 @@ export function PropertyInspector({ component, onUpdate, onDelete, onCodeEdit }:

Component Properties

- - - - - Props - - - - Code - - - - - -
- {componentDef?.propSchema.map(propDef => { - const dynamicDropdown = propDef.type === 'dynamic-select' - ? dynamicDropdowns.find(d => d.name === propDef.dynamicSource) - : null - - return ( -
- - - {propDef.name === 'className' ? ( -
- handlePropChange(propDef.name, e.target.value)} - className="flex-1 font-mono text-xs" - /> - -
- ) : propDef.type === 'string' ? ( - handlePropChange(propDef.name, e.target.value)} - /> - ) : propDef.type === 'number' ? ( - handlePropChange(propDef.name, Number(e.target.value))} - /> - ) : propDef.type === 'boolean' ? ( - - ) : propDef.type === 'select' && propDef.options ? ( - - ) : propDef.type === 'dynamic-select' && dynamicDropdown ? ( - - ) : null} - - {propDef.description && ( -

{propDef.description}

- )} -
- ) - })} - - {(!componentDef?.propSchema || componentDef.propSchema.length === 0) && ( -

This component has no configurable properties.

- )} -
-
-
- - -
- -
-

- Add custom JavaScript code for this component -

- -
-
-
-
+ diff --git a/frontends/nextjs/src/components/rendering/RenderComponent.tsx b/frontends/nextjs/src/components/rendering/RenderComponent.tsx index 2cf420926..8b23fa0aa 100644 --- a/frontends/nextjs/src/components/rendering/RenderComponent.tsx +++ b/frontends/nextjs/src/components/rendering/RenderComponent.tsx @@ -1,32 +1,16 @@ -import type { ComponentInstance } from '@/lib/builder-types' -import { Button } from '@/components/ui' -import { Input } from '@/components/ui' -import { Textarea } from '@/components/ui' -import { Label } from '@/components/ui' -import { Badge } from '@/components/ui' -import { Card } from '@/components/ui' -import { Switch } from '@/components/ui' -import { Checkbox } from '@/components/ui' -import { Separator } from '@/components/ui' -import { Alert } from '@/components/ui' -import { Progress } from '@/components/ui' -import { Slider } from '@/components/ui' -import { Avatar, AvatarFallback } from '@/components/ui' -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui' -import { IRCWebchatDeclarative } from '@/components/IRCWebchatDeclarative' -import { NotificationSummaryCard } from '@/components/NotificationSummaryCard' +import type React from 'react' +import type { ComponentInstance } from '@/lib/types/builder-types' import type { User } from '@/lib/level-types' -import { getDeclarativeRenderer } from '@/lib/declarative-component-renderer' +import { RenderNode } from './components/RenderNode' interface RenderComponentProps { component: ComponentInstance isSelected: boolean onSelect: (id: string) => void user?: User - contextData?: Record } -export function RenderComponent({ component, isSelected, onSelect, user, contextData }: RenderComponentProps) { +export function RenderComponent({ component, isSelected, onSelect, user }: RenderComponentProps) { const handleClick = (e: React.MouseEvent) => { e.stopPropagation() onSelect(component.id) @@ -41,191 +25,19 @@ export function RenderComponent({ component, isSelected, onSelect, user, context isSelected={isSelected} onSelect={onSelect} user={user} - contextData={contextData} /> )) } const wrapperClass = `relative ${isSelected ? 'ring-2 ring-accent ring-offset-2' : 'hover:ring-1 hover:ring-accent/50'} transition-all cursor-pointer` - const renderComponentByType = () => { - const { type, props } = component - const renderer = getDeclarativeRenderer() - - if (renderer.hasComponentConfig(type)) { - if (type === 'IRCWebchat' && user) { - return ( - - ) - } - - return ( -
- Declarative Component: {type} -
- This is a package-defined component -
-
- ) - } - - switch (type) { - case 'Container': - return ( -
- {renderChildren()} -
- ) - - case 'Flex': - return ( -
- {renderChildren()} -
- ) - - case 'Grid': - return ( -
- {renderChildren()} -
- ) - - case 'Stack': - return ( -
- {renderChildren()} -
- ) - - case 'Card': - return ( - - {renderChildren()} - - ) - - case 'NotificationSummary': - return ( - - ) - - case 'Button': - return ( - - ) - - case 'Input': - return ( - - ) - - case 'Textarea': - return ( -