| | "use client" |
| |
|
| | import { useEffect, useRef, useState, useTransition } from "react" |
| |
|
| | import { VideoPlayer } from "@/components/business/video-player" |
| |
|
| | import { |
| | Select, |
| | SelectContent, |
| | SelectItem, |
| | SelectTrigger, |
| | SelectValue, |
| | } from "@/components/ui/select" |
| |
|
| | import { render } from "./render" |
| | import { Agent, AgentType, Scene } from "./agents/types" |
| | import { agents, defaultAgent, getAgent } from "./agents" |
| |
|
| | export default function Main() { |
| | const [url, setUrl] = useState<string>() |
| | const [isPending, startTransition] = useTransition() |
| | const [scene, setScene] = useState<Scene>() |
| | const ref = useRef<AgentType>(defaultAgent) |
| | |
| | useEffect(() => { |
| | |
| | const updateView = async () => { |
| | |
| |
|
| | await startTransition(async () => { |
| |
|
| | |
| | const type = ref?.current |
| | const agent = getAgent(type) |
| |
|
| | |
| | const scene = agent.simulate() |
| |
|
| | |
| | const newUrl = await render(scene.prompt) |
| |
|
| | if (type !== ref?.current) { |
| | console.log("agent type changed! reloading scene") |
| | setTimeout(() => { updateView() }, 0) |
| | return |
| | } |
| |
|
| | if (newUrl) { |
| | |
| | setUrl(newUrl) |
| | setScene(scene) |
| | setTimeout(() => { updateView()}, 1000) |
| | } else { |
| | |
| | setTimeout(() => { updateView()}, 3000) |
| | } |
| | }) |
| | } |
| |
|
| | updateView() |
| |
|
| | }, []) |
| |
|
| | return ( |
| | <div className="flex flex-col w-full pt-4"> |
| | <div className="flex flex-col space-y-3 px-2"> |
| | <div className="flex flex-row items-center space-x-3"> |
| | <label className="flex">Agent model:</label> |
| | <Select |
| | defaultValue={defaultAgent} |
| | onValueChange={(value) => { |
| | ref.current = value as AgentType |
| | // setUrl("") |
| | }}> |
| | <SelectTrigger className="w-[180px]"> |
| | <SelectValue placeholder="Type" /> |
| | </SelectTrigger> |
| | <SelectContent> |
| | {Object.entries(agents).map(([key, agent]) => |
| | <SelectItem key={key} value={key}>{agent.title}</SelectItem> |
| | )} |
| | </SelectContent> |
| | </Select> |
| | </div> |
| | {(scene) ? <div> |
| | <p>Action: {scene.action}</p> |
| | <p>Position: {scene.position}</p> |
| | </div> : null} |
| | </div> |
| | <VideoPlayer url={url} /> |
| | </div> |
| | ) |
| | } |