import { useState, useEffect } from 'react'
import { useThemeName } from '@junwon/aesthetics'
import { usePageGenerator } from '../hooks/usePageGenerator'
import { GenerativePageInHtml } from './GenerativePageInHtml'
// import { GenerativePageInReact } from './GenerativePageInReact'
interface GenerativePageProps {
pageSpec: string
codeToRenderDuringLoading?: string
outputFormat?: 'html' | 'react'
}
export function GenerativePage({
pageSpec,
codeToRenderDuringLoading,
outputFormat = 'html',
}: GenerativePageProps) {
if (codeToRenderDuringLoading && !outputFormat) {
throw new Error('outputFormat must be provided when codeToRenderDuringLoading is provided.')
}
const themeName = useThemeName()
const darkModeText = themeName?.includes('dark') ? 'dark mode: true' : ''
const { streamedBuffer } = usePageGenerator(
`${pageSpec}\n${darkModeText}`,
codeToRenderDuringLoading,
outputFormat
)
const [renderedCode, setRenderedCode] = useState('')
const [renderedCodeLength, setRenderedCodeLength] = useState(0)
useEffect(() => {
if (!streamedBuffer) return
if (renderedCodeLength >= streamedBuffer.length) return
const chunkSize = 10
const delay = 10
const processNextChunk = () => {
const chunk = streamedBuffer.slice(renderedCodeLength, renderedCodeLength + chunkSize)
if (chunk) {
setRenderedCode((prev) => prev + chunk)
setRenderedCodeLength((prev) => prev + chunk.length)
}
}
const timeoutId = setTimeout(processNextChunk, delay)
return () => clearTimeout(timeoutId)
}, [streamedBuffer, renderedCodeLength])
if (outputFormat === 'html') {
return
}
return
// return
}