import React from 'react'; import { CustomEvent } from '../utils/customEventProcessor'; import './style.scss'; import './CustomEventView.scss'; export interface CustomEventViewProps { events: CustomEvent[]; state: T; latest: CustomEvent | null; renderEvent?: (event: CustomEvent, index: number) => React.ReactNode; renderState?: (state: T) => React.ReactNode; renderLatest?: (event: CustomEvent) => React.ReactNode; title?: string; className?: string; maxEventsShown?: number; reverseOrder?: boolean; } export function CustomEventView({ events, state, latest, renderEvent, renderState, renderLatest, title, className = '', maxEventsShown = 50, reverseOrder = true }: CustomEventViewProps) { const displayEvents = reverseOrder ? [...events].reverse().slice(0, maxEventsShown) : events.slice(-maxEventsShown); const defaultRenderEvent = (event: CustomEvent, index: number) => (
{event.type} {event.subtype && ( {event.subtype} )} {new Date(event.timestamp).toLocaleTimeString()}
{JSON.stringify(event.data, null, 2)}
); return (
{title &&

{title}

} {renderLatest && latest && (

Latest

{renderLatest(latest)}
)} {renderState && (

Current State

{renderState(state)}
)} {displayEvents.length > 0 && (

Events History

{displayEvents.map((event, index) => renderEvent ? renderEvent(event, index) : defaultRenderEvent(event, index) )}
)} {events.length === 0 && (

No events yet

)}
); } /** * Image Gallery View Component */ export interface ImageGalleryViewProps { images: Array<{ url: string; prompt: string; timestamp?: number }>; latestImage: { url: string; prompt: string } | null; columns?: number; imageSize?: 'small' | 'medium' | 'large'; showPrompts?: boolean; className?: string; } export const ImageGalleryView: React.FC = ({ images, latestImage, columns = 3, imageSize = 'medium', showPrompts = true, className = '' }) => { const sizeClasses = { small: 'gallery-small', medium: 'gallery-medium', large: 'gallery-large' }; return (
{latestImage && (

Latest Image

{latestImage.prompt} {showPrompts && (
{latestImage.prompt}
)}
)} {images.length > 0 && (

All Images ({images.length})

{images.map((image, index) => (
{image.prompt} {showPrompts && (
{image.prompt}
{image.timestamp && (
{new Date(image.timestamp).toLocaleTimeString()}
)}
)}
))}
)} {images.length === 0 && !latestImage && (
🖼️

No images generated yet

)}
); }; /** * Design Iterations View Component */ export interface DesignIterationsViewProps { iterations: Array<{ version: number; description: string; imageUrl?: string; feedback?: string; approved?: boolean; timestamp?: number; }>; currentVersion: number; className?: string; } export const DesignIterationsView: React.FC = ({ iterations, currentVersion, className = '' }) => { return (

Design Iterations

v{currentVersion}
{iterations.map((iteration, index) => (
v{iteration.version} {iteration.approved && }
{iteration.description}
{iteration.imageUrl && (
{`Version
)} {iteration.feedback && (
Feedback: {iteration.feedback}
)} {iteration.timestamp && (
{new Date(iteration.timestamp).toLocaleString()}
)}
))}
{iterations.length === 0 && (
🎨

No design iterations yet

)}
); };