diff --git a/apps/wireframe-renderer-web/src/pages/canvas.tsx b/apps/wireframe-renderer-web/src/pages/canvas.tsx index ab882df..89a49f1 100644 --- a/apps/wireframe-renderer-web/src/pages/canvas.tsx +++ b/apps/wireframe-renderer-web/src/pages/canvas.tsx @@ -1,4 +1,5 @@ import { useState, useRef, useEffect } from "react"; +import { useSearchParams } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; @@ -24,6 +25,7 @@ interface DrawingElement { } export default function CanvasPage() { + const [searchParams] = useSearchParams(); const canvasRef = useRef(null); const [tool, setTool] = useState("pen"); const [isDrawing, setIsDrawing] = useState(false); @@ -198,6 +200,8 @@ export default function CanvasPage() { const user = await auth.currentUser(); if (!user) return; + const projectIdFromUrl = searchParams.get("projectId"); + // Load projects const { data: userProjects } = await entities .from("nvwa_project") @@ -206,8 +210,14 @@ export default function CanvasPage() { if (userProjects && userProjects.length > 0) { setProjects(userProjects); - // Use first project or create new one - const project = userProjects[0]; + // Use specified project or first one + let project; + if (projectIdFromUrl) { + project = userProjects.find(p => p.id === parseInt(projectIdFromUrl)); + } + if (!project) { + project = userProjects[0]; + } setCurrentProject(project); // Load latest wireframe for this project @@ -230,7 +240,7 @@ export default function CanvasPage() { } } } else { - // Create default project + // Create default project if no projects exist const { data: newProject } = await entities .from("nvwa_project") .insert({ diff --git a/apps/wireframe-renderer-web/src/pages/index.tsx b/apps/wireframe-renderer-web/src/pages/index.tsx index cc2e041..1849292 100644 --- a/apps/wireframe-renderer-web/src/pages/index.tsx +++ b/apps/wireframe-renderer-web/src/pages/index.tsx @@ -1,11 +1,150 @@ +import { useState, useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { Label } from "@/components/ui/label"; +import { Plus, Folder } from "lucide-react"; +import { entities, auth } from "@/lib/nvwa"; + export default function HomePage() { + const [projects, setProjects] = useState([]); + const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); + const [newProjectName, setNewProjectName] = useState(""); + const [newProjectDescription, setNewProjectDescription] = useState(""); + const navigate = useNavigate(); + + useEffect(() => { + loadProjects(); + }, []); + + const loadProjects = async () => { + try { + const user = await auth.currentUser(); + if (!user) return; + + const { data } = await entities + .from("nvwa_project") + .select("*") + .eq("user_id", user.id) + .order("updated_at", { ascending: false }); + + setProjects(data || []); + } catch (error) { + console.error("Failed to load projects:", error); + } + }; + + const createProject = async () => { + try { + const user = await auth.currentUser(); + if (!user || !newProjectName.trim()) return; + + const { data } = await entities + .from("nvwa_project") + .insert({ + name: newProjectName, + description: newProjectDescription, + user_id: user.id + }) + .select(); + + if (data && data.length > 0) { + setProjects(prev => [data[0], ...prev]); + setNewProjectName(""); + setNewProjectDescription(""); + setIsCreateDialogOpen(false); + } + } catch (error) { + console.error("Failed to create project:", error); + } + }; + + const openProject = (projectId) => { + navigate(`/canvas?projectId=${projectId}`); + }; + return ( -
-
-

欢迎

-

这是首页

+
+
+

项目列表

+ + + + + + + 创建新项目 + +
+
+ + setNewProjectName(e.target.value)} + placeholder="输入项目名称" + /> +
+
+ +