diff --git a/apps/editor/components/ui/sidebar/icon-rail.tsx b/apps/editor/components/ui/sidebar/icon-rail.tsx index 0fd8a443..74bbfa30 100644 --- a/apps/editor/components/ui/sidebar/icon-rail.tsx +++ b/apps/editor/components/ui/sidebar/icon-rail.tsx @@ -1,16 +1,101 @@ "use client"; -import { Moon, Sun } from "lucide-react"; +import { ArrowLeft, Command, FolderOpen, Moon, Search, Sun } from "lucide-react"; import Link from "next/link"; import Image from "next/image"; import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/primitives/tooltip"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/primitives/popover"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/primitives/dialog"; import { cn } from "@/lib/utils"; import { useViewer } from "@pascal-app/viewer"; +import { useProjectStore } from "@/features/community/lib/projects/store"; + +function OpenProjectModal({ + open, + onOpenChange, +}: { + open: boolean; + onOpenChange: (open: boolean) => void; +}) { + const router = useRouter(); + const projects = useProjectStore((s) => s.projects); + const activeProject = useProjectStore((s) => s.activeProject); + const fetchProjects = useProjectStore((s) => s.fetchProjects); + + useEffect(() => { + if (open && projects.length === 0) { + fetchProjects(); + } + }, [open, projects.length, fetchProjects]); + + return ( + + + + Open project + +
+ {projects.length === 0 ? ( +

+ No projects found +

+ ) : ( + projects.map((project) => { + const isActive = project.id === activeProject?.id; + return ( + + ); + }) + )} +
+
+
+ ); +} export type PanelId = "site" | "settings"; @@ -33,89 +118,128 @@ export function IconRail({ const theme = useViewer((state) => state.theme); const setTheme = useViewer((state) => state.setTheme); const [mounted, setMounted] = useState(false); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const [isOpenProjectOpen, setIsSwitchProjectOpen] = useState(false); useEffect(() => { setMounted(true); }, []); + const handleOpenProject = () => { + setIsMenuOpen(false); + setIsSwitchProjectOpen(true); + }; + return ( -
- {/* Pascal logo - link to the home page */} - - - - Pascal - - - Back to Pascal Editor - + <> +
+ {/* Pascal logo — app menu */} + + + + + + setIsMenuOpen(false)} + > + + Back to community + + +
+ + + - {/* Divider */} -
+ {/* Divider */} +
- {panels.map((panel) => { - const isActive = activePanel === panel.id; - return ( - + {panels.map((panel) => { + const isActive = activePanel === panel.id; + return ( + + + + + {panel.label} + + ); + })} + + {/* Spacer */} +
+ + {/* Theme Toggle */} + {mounted && ( + - {panel.label} + Toggle theme - ); - })} + )} +
- {/* Spacer */} -
- - {/* Theme Toggle */} - {mounted && ( - - - - - Toggle theme - - )} -
+ + ); }