"use client" import { useEffect, useRef, useTransition } from "react" import { useSearchParams } from "next/navigation" import { PresetName, defaultPreset, getPreset } from "@/app/engine/presets" import { cn } from "@/lib/utils" import { TopMenu } from "./interface/top-menu" import { FontName, defaultFont, fontList, fonts } from "@/lib/fonts" import { getRandomLayoutName, layouts } from "./layouts" import { useStore } from "./store" import { Zoom } from "./interface/zoom" import { getStory } from "./queries/getStory" import { BottomBar } from "./interface/bottom-bar" export default function Main() { const [_isPending, startTransition] = useTransition() const searchParams = useSearchParams() const requestedPreset = (searchParams.get('preset') as PresetName) || defaultPreset const requestedFont = (searchParams.get('font') as FontName) || defaultFont const requestedPrompt = (searchParams.get('prompt') as string) || "" const isGeneratingStory = useStore(state => state.isGeneratingStory) const setGeneratingStory = useStore(state => state.setGeneratingStory) const font = useStore(state => state.font) const setFont = useStore(state => state.setFont) const preset = useStore(state => state.preset) const setPreset = useStore(state => state.setPreset) const prompt = useStore(state => state.prompt) const setPrompt = useStore(state => state.setPrompt) const layout = useStore(state => state.layout) const setLayout = useStore(state => state.setLayout) const setPanels = useStore(state => state.setPanels) const zoomLevel = useStore(state => state.zoomLevel) const setPage = useStore(state => state.setPage) const pageRef = useRef(null) useEffect(() => { const element = pageRef.current if (!element) { return } setPage(element) }, [pageRef.current]) // react to URL params useEffect(() => { if (requestedPreset && requestedPreset !== preset.label) { setPreset(getPreset(requestedPreset)) } }, [requestedPreset]) useEffect(() => { if (requestedFont && requestedFont !== font) { setFont(requestedFont) } }, [requestedFont]) useEffect(() => { if (requestedPrompt && requestedPrompt !== prompt) { setPrompt(requestedPrompt) } }, [requestedPrompt]) // react to prompt changes useEffect(() => { if (!prompt) { return } startTransition(async () => { setGeneratingStory(true) const newLayout = getRandomLayoutName() console.log("using layout " + newLayout) setLayout(newLayout) try { const llmResponse = await getStory({ preset, prompt }) console.log("response:", llmResponse) // TODO call the LLM here! const panelPromptPrefix = preset.imagePrompt(prompt).join(", ") console.log("panel prompt prefix:", panelPromptPrefix) const nbPanels = 4 const newPanels: string[] = [] for (let p = 0; p < nbPanels; p++) { const newPanel = [panelPromptPrefix, llmResponse[p] || ""] newPanels.push(newPanel.map(chunk => chunk).join(", ")) } console.log("newPanels:", newPanels) setPanels(newPanels) } catch (err) { console.error(err) } finally { setGeneratingStory(false) } }) }, [prompt, preset?.label]) // important: we need to react to preset changes too const LayoutElement = (layouts as any)[layout] return (
105 ? `px-0` : `pl-2 pr-16 md:pl-16 md:pr-16`, `print:pt-0 print:px-0 print:pl-0 print:pr-0`, fonts.actionman.className )}>
105 ? `items-start` : `items-center` )}>
100 ? `100`}` }} >
Generating your story.. (hold tight)
) }