// Path: Frontend/src/components/shell/ProjectSelector/ProjectSelector.tsx import { For, createSignal, onCleanup, onMount, type JSX } from "solid-js"; import { ChevronDown, Folder } from "../../../lib/icons"; import { activeProject, projectItems } from "../data/shell.data"; import styles from "./ProjectSelector.module.scss"; type ProjectSelectorProps = { isOpen: boolean; onToggle: () => void; onClose: () => void; }; const defaultProject = projectItems.find((item) => item.id === activeProject.id) ?? projectItems[0]; export const ProjectSelector = (props: ProjectSelectorProps): JSX.Element => { const [selectedProject, setSelectedProject] = createSignal({ id: defaultProject.id, name: defaultProject.name }); const [drawerTop, setDrawerTop] = createSignal(0); let triggerRef: HTMLButtonElement | undefined; onMount(() => { if (!triggerRef) { return; } const updateDrawerTop = (): void => { if (!triggerRef) { return; } setDrawerTop(triggerRef.offsetTop + triggerRef.offsetHeight); }; updateDrawerTop(); const observer = new ResizeObserver(() => { updateDrawerTop(); }); observer.observe(triggerRef); window.addEventListener("resize", updateDrawerTop); onCleanup(() => { observer.disconnect(); window.removeEventListener("resize", updateDrawerTop); }); }); const toggleOpen = (): void => { if (!props.isOpen) { props.onToggle(); return; } props.onClose(); }; const selectProject = (projectId: string): void => { const nextProject = projectItems.find((item): boolean => item.id === projectId); if (!nextProject) { return; } setSelectedProject({ id: nextProject.id, name: nextProject.name }); props.onClose(); }; return (
{/* Project trigger */} {/* Outside-click scrim */} ); }}
); };