155 lines
4.6 KiB
TypeScript
155 lines
4.6 KiB
TypeScript
"use client"
|
|
|
|
import { useEffect } from 'react'
|
|
import { useEditorStore } from './store'
|
|
import { wireframeConverter, ParsedWireframe } from './wireframe-converter'
|
|
|
|
/**
|
|
* Hook to integrate wireframe data from the backend with the component canvas
|
|
*/
|
|
export function useWireframeIntegration() {
|
|
const {
|
|
addWireframe,
|
|
setCurrentWireframe,
|
|
addComponent,
|
|
currentWireframe,
|
|
showWireframes,
|
|
clearWireframeComponents,
|
|
wireframeRenderMode
|
|
} = useEditorStore()
|
|
|
|
// Listen for wireframe generation events from the TLDraw canvas
|
|
useEffect(() => {
|
|
const handleWireframeGenerated = (event: CustomEvent<{
|
|
svgData: string
|
|
deviceType: 'desktop' | 'tablet' | 'mobile'
|
|
prompt: string
|
|
}>) => {
|
|
try {
|
|
const { svgData, deviceType, prompt } = event.detail
|
|
|
|
// Parse the SVG wireframe
|
|
const parsedWireframe = wireframeConverter.parseSVGToWireframe(svgData, deviceType)
|
|
|
|
// Create wireframe data
|
|
const wireframeData = {
|
|
id: `wireframe-${Date.now()}`,
|
|
name: `Wireframe - ${prompt.substring(0, 50)}...`,
|
|
deviceType,
|
|
data: parsedWireframe,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date()
|
|
}
|
|
|
|
// Add to store
|
|
addWireframe(wireframeData)
|
|
setCurrentWireframe(wireframeData)
|
|
|
|
// Clear old wireframe components before adding new ones
|
|
clearWireframeComponents()
|
|
|
|
// Convert to a single exact-SVG component if showing wireframes in SVG mode
|
|
if (showWireframes && wireframeRenderMode === 'svg') {
|
|
const component = wireframeConverter.convertToSVGComponent(parsedWireframe)
|
|
addComponent(component)
|
|
}
|
|
|
|
console.log('Wireframe integrated:', wireframeData)
|
|
} catch (error) {
|
|
console.error('Error integrating wireframe:', error)
|
|
}
|
|
}
|
|
|
|
// Listen for wireframe generation events
|
|
window.addEventListener('wireframe:generated', handleWireframeGenerated as EventListener)
|
|
|
|
return () => {
|
|
window.removeEventListener('wireframe:generated', handleWireframeGenerated as EventListener)
|
|
}
|
|
}, [addWireframe, setCurrentWireframe, addComponent, showWireframes, clearWireframeComponents])
|
|
|
|
// Handle wireframe display toggle
|
|
useEffect(() => {
|
|
if (showWireframes && currentWireframe) {
|
|
// Clear old wireframe components first
|
|
clearWireframeComponents()
|
|
|
|
// Convert current wireframe to a single SVG component for display
|
|
const component = wireframeConverter.convertToSVGComponent(currentWireframe.data)
|
|
addComponent(component)
|
|
} else if (!showWireframes) {
|
|
// Clear wireframe components when hiding wireframes
|
|
clearWireframeComponents()
|
|
}
|
|
}, [showWireframes, currentWireframe, addComponent, clearWireframeComponents])
|
|
|
|
return {
|
|
currentWireframe,
|
|
showWireframes
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Service to handle wireframe data conversion and management
|
|
*/
|
|
export class WireframeIntegrationService {
|
|
private static instance: WireframeIntegrationService
|
|
|
|
static getInstance(): WireframeIntegrationService {
|
|
if (!WireframeIntegrationService.instance) {
|
|
WireframeIntegrationService.instance = new WireframeIntegrationService()
|
|
}
|
|
return WireframeIntegrationService.instance
|
|
}
|
|
|
|
/**
|
|
* Convert SVG wireframe to components and add to canvas
|
|
*/
|
|
convertAndAddWireframe(
|
|
svgData: string,
|
|
deviceType: 'desktop' | 'tablet' | 'mobile',
|
|
prompt: string
|
|
) {
|
|
try {
|
|
// Parse the SVG wireframe
|
|
const parsedWireframe = wireframeConverter.parseSVGToWireframe(svgData, deviceType)
|
|
|
|
// Create wireframe data
|
|
const wireframeData = {
|
|
id: `wireframe-${Date.now()}`,
|
|
name: `Wireframe - ${prompt.substring(0, 50)}...`,
|
|
deviceType,
|
|
data: parsedWireframe,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date()
|
|
}
|
|
|
|
// Dispatch event to update store
|
|
window.dispatchEvent(new CustomEvent('wireframe:generated', {
|
|
detail: { svgData, deviceType, prompt }
|
|
}))
|
|
|
|
return wireframeData
|
|
} catch (error) {
|
|
console.error('Error converting wireframe:', error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Convert wireframe to individual components
|
|
*/
|
|
convertToComponents(wireframe: ParsedWireframe) {
|
|
return wireframeConverter.convertToComponents(wireframe)
|
|
}
|
|
|
|
/**
|
|
* Convert wireframe to single SVG component
|
|
*/
|
|
convertToSVGComponent(wireframe: ParsedWireframe) {
|
|
return wireframeConverter.convertToSVGComponent(wireframe)
|
|
}
|
|
}
|
|
|
|
export const wireframeIntegrationService = WireframeIntegrationService.getInstance()
|