import { useState } from 'react' import { IconFilter, IconTable, IconForms } from '@tabler/icons-react' import type { A2UIBlock } from '../lib/types' interface A2UIRendererProps { block: A2UIBlock onAction?: (action: string, data: Record) => void } // ─── Filters ───────────────────────────────────────────────────────────────── function FiltersRenderer({ block, onAction }: A2UIRendererProps & { block: Extract }) { const [activeLabels, setActiveLabels] = useState>(new Set()) function handleToggle(label: string) { const isActive = activeLabels.has(label) setActiveLabels(prev => { const next = new Set(prev) if (isActive) next.delete(label) else next.add(label) return next }) onAction?.('filter_toggle', { label, active: !isActive }) } return (
{block.filters.map(option => { const active = activeLabels.has(option.label) return ( ) })}
) } // ─── Table ─────────────────────────────────────────────────────────────────── function TableRenderer({ block }: { block: Extract }) { return (
Data Table
{block.headers.map((header, i) => ( ))} {block.rows.map((row, ri) => ( {row.map((cell, ci) => ( ))} ))}
{header}
{cell}
) } // ─── Cards ─────────────────────────────────────────────────────────────────── function CardsRenderer({ block }: { block: Extract }) { return (
{block.items.map((item, i) => (
window.open(item.url, '_blank') : undefined} >
{item.title}
{item.price != null && (
{item.price}
)} {item.description && (
{item.description}
)}
))}
) } // ─── Form ──────────────────────────────────────────────────────────────────── function FormRenderer({ block, onAction, }: { block: Extract onAction?: (action: string, data: Record) => void }) { function handleSubmit(e: React.FormEvent) { e.preventDefault() const formData = new FormData(e.currentTarget) const data: Record = {} formData.forEach((value, key) => { data[key] = value }) onAction?.('form_submit', data) } const inputStyle: React.CSSProperties = { width: '100%', padding: '0.3rem', background: '#1e2a4a', border: '1px solid #3a3a5a', borderRadius: '4px', color: '#e0e0e0', fontSize: '0.8rem', boxSizing: 'border-box', } return (
Input Form
{block.fields.map(field => (
{field.type === 'select' ? ( ) : ( )}
))}
) } // ─── Main Renderer ─────────────────────────────────────────────────────────── export function A2UIRenderer({ block, onAction }: A2UIRendererProps) { switch (block.type) { case 'filters': return case 'table': return case 'cards': return case 'form': return default: return null } }