import { createRoot } from "lib/render"
import type { AnySoupElement } from "@tscircuit/soup"
import { createProjectBuilder } from "@tscircuit/builder"
import { useEffect, useState } from "react"
/**
* Renders children and returns the soup as a hook
*
* This is usually used in "tscircuit entrypoints" like ,
* or <3dViewer /> to convert their children into circuit json (soup)
*/
export const useChildrenSoup = (
children: React.ReactElement | React.ReactElement[],
) => {
const [soup, setSoup] = useState([])
const [error, setError] = useState(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
setLoading(true)
const pb = createProjectBuilder()
let isActiveRender = true
createRoot()
.render(children, pb)
.then((elements) => {
if (!isActiveRender) return
setSoup(elements)
setLoading(false)
setError(null)
})
.catch((err: any) => {
if (!isActiveRender) return
setError(err)
setLoading(false)
})
return () => {
isActiveRender = false
}
}, [children])
return { loading, soup, error }
}