diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2b962e6..b9f7866 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,4 +1,4 @@ -import { useState, useCallback } from "react"; +import { useRef, useState, useCallback } from "react"; import ImageUpload from "./components/ImageUpload"; import CodePreview from "./components/CodePreview"; import Preview from "./components/Preview"; @@ -14,24 +14,23 @@ import { FaUndo, } from "react-icons/fa"; import copy from "copy-to-clipboard"; +import toast from "react-hot-toast"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "./components/ui/tabs"; import CodeMirror from "./components/CodeMirror"; import SettingsDialog from "./components/SettingsDialog"; -import { Settings } from "./types"; +import { AppState, Settings } from "./types"; import { IS_RUNNING_ON_CLOUD } from "./config"; import { PicoBadge } from "./components/PicoBadge"; import { OnboardingNote } from "./components/OnboardingNote"; import { usePersistedState } from "./hooks/usePersistedState"; import { UrlInputSection } from "./components/UrlInputSection"; import TermsOfServiceDialog from "./components/TermsOfServiceDialog"; -import toast from "react-hot-toast"; +import { USER_CLOSE_WEB_SOCKET_CODE } from "./constants"; function App() { - const [appState, setAppState] = useState<"INITIAL" | "CODING" | "CODE_READY">( - "INITIAL" - ); + const [appState, setAppState] = useState(AppState.INITIAL); const [generatedCode, setGeneratedCode] = useState(""); const [referenceImages, setReferenceImages] = useState([]); const [executionConsole, setExecutionConsole] = useState([]); @@ -46,6 +45,7 @@ function App() { }, "setting" ); + const wsRef = useRef(null); const downloadCode = () => { // Create a blob from the generated code @@ -65,26 +65,31 @@ function App() { }; const reset = () => { - setAppState("INITIAL"); + setAppState(AppState.INITIAL); setGeneratedCode(""); setReferenceImages([]); setExecutionConsole([]); setHistory([]); }; + const stop = () => { + wsRef.current?.close?.(USER_CLOSE_WEB_SOCKET_CODE); + }; + function doGenerateCode(params: CodeGenerationParams) { setExecutionConsole([]); - setAppState("CODING"); + setAppState(AppState.CODING); // Merge settings with params const updatedParams = { ...params, ...settings }; generateCode( + wsRef, updatedParams, (token) => setGeneratedCode((prev) => prev + token), (code) => setGeneratedCode(code), (line) => setExecutionConsole((prev) => [...prev, line]), - () => setAppState("CODE_READY") + () => setAppState(AppState.CODE_READY) ); } @@ -130,7 +135,7 @@ function App() {

Screenshot to Code

- {appState === "INITIAL" && ( + {appState === AppState.INITIAL && (

Drag & drop a screenshot to get started.

@@ -138,20 +143,26 @@ function App() { {IS_RUNNING_ON_CLOUD && !settings.openAiApiKey && } - {(appState === "CODING" || appState === "CODE_READY") && ( + {(appState === AppState.CODING || + appState === AppState.CODE_READY) && ( <> {/* Show code preview only when coding */} - {appState === "CODING" && ( + {appState === AppState.CODING && (
{executionConsole.slice(-1)[0]}
+
+ +
)} - {appState === "CODE_READY" && ( + {appState === AppState.CODE_READY && (