diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 1b5412c..152f328 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,10 +2,19 @@ import { useState } from "react"; import ImageUpload from "./components/ImageUpload"; import CodePreview from "./components/CodePreview"; import Preview from "./components/Preview"; +import { generateCode } from "./generateCode"; function App() { + const [generatedCode, setGeneratedCode] = useState(""); const [referenceImages, setReferenceImages] = useState([]); + function startCodeGeneration(referenceImages: string[]) { + setReferenceImages(referenceImages); + generateCode(referenceImages[0], function (token) { + setGeneratedCode((prev) => prev + token); + }); + } + return (

Drag & Drop a Screenshot

@@ -19,11 +28,11 @@ function App() { {referenceImages.length === 0 && ( <> - + )} - +
); diff --git a/frontend/src/generateCode.ts b/frontend/src/generateCode.ts new file mode 100644 index 0000000..4770f64 --- /dev/null +++ b/frontend/src/generateCode.ts @@ -0,0 +1,42 @@ +import toast from "react-hot-toast"; + +const WS_BACKEND_URL = "ws://localhost:8000"; + +export function generateCode( + imageUrl: string, + onChange: (chunk: string) => void +) { + const ws = new WebSocket(`${WS_BACKEND_URL}/generate-code`); + + ws.addEventListener("open", () => { + ws.send( + JSON.stringify({ + image: imageUrl, + }) + ); + }); + + ws.addEventListener("message", async (event: MessageEvent) => { + const response = JSON.parse(event.data); + if (response.type === "chunk") { + onChange(response.value); + } + }); + + ws.addEventListener("close", (event) => { + console.log("Connection closed", event.code, event.reason); + if (event.code != 1000) { + console.error("WebSocket error code", event); + toast.error( + "We ran into an error. Try again or contact support at support@picoapps.xyz" + ); + } + }); + + ws.addEventListener("error", (error) => { + console.error("WebSocket error", error); + toast.error( + "We ran into an error. Try again or contact support at support@picoapps.xyz" + ); + }); +}