import { useState, useEffect } from "react"; import { invoke } from "@tauri-apps/api/core"; import { open } from "@tauri-apps/plugin-dialog"; import { Chat } from "./components/Chat"; import "./App.css"; function App() { const [projectPath, setProjectPath] = useState(null); const [errorMsg, setErrorMsg] = useState(null); useEffect(() => { invoke("get_current_project") .then((path) => { if (path) setProjectPath(path); }) .catch((e) => console.error(e)); }, []); async function closeProject() { try { await invoke("close_project"); setProjectPath(null); } catch (e) { console.error(e); } } async function selectProject() { try { setErrorMsg(null); // Open native folder picker const selected = await open({ directory: true, multiple: false, }); if (selected === null) { // User cancelled selection return; } // Invoke backend command to verify and set state // Note: invoke argument names must match Rust function args const confirmedPath = await invoke("open_project", { path: selected, }); setProjectPath(confirmedPath); } catch (e) { console.error(e); setErrorMsg( typeof e === "string" ? e : "An error occurred opening the project.", ); } } return (
{!projectPath ? (

AI Code Assistant

Please select a project folder to start the Story-Driven Spec Workflow.

) : (
)} {errorMsg && (

Error: {errorMsg}

)}
); } export default App;