"use client"; import { useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; import { Search, Briefcase, X } from "lucide-react"; // plane helpers import { useOutsideClickDetector } from "@plane/helpers"; // ui import { Breadcrumbs, Button, Header } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common"; // helpers import { cn } from "@/helpers/common.helper"; // hooks import { useCommandPalette, useEventTracker, useProjectFilter, useUserPermissions } from "@/hooks/store"; import { EUserPermissions, EUserPermissionsLevel } from "@/plane-web/constants/user-permissions"; import HeaderFilters from "./filters"; export const ProjectsBaseHeader = observer(() => { // states const [isSearchOpen, setIsSearchOpen] = useState(false); // refs const inputRef = useRef(null); // store hooks const { toggleCreateProjectModal } = useCommandPalette(); const { setTrackElement } = useEventTracker(); const { allowPermissions } = useUserPermissions(); const pathname = usePathname(); const { searchQuery, updateSearchQuery } = useProjectFilter(); // outside click detector hook useOutsideClickDetector(inputRef, () => { if (isSearchOpen && searchQuery.trim() === "") setIsSearchOpen(false); }); // auth const isAuthorizedUser = allowPermissions( [EUserPermissions.ADMIN, EUserPermissions.MEMBER], EUserPermissionsLevel.WORKSPACE ); const isArchived = pathname.includes("/archives"); const handleInputKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Escape") { if (searchQuery && searchQuery.trim() !== "") updateSearchQuery(""); else setIsSearchOpen(false); } }; useEffect(() => { if (searchQuery.trim() !== "") setIsSearchOpen(true); }, [searchQuery]); return (
} />} /> {isArchived && } />}
{!isSearchOpen && ( )}
updateSearchQuery(e.target.value)} onKeyDown={handleInputKeyDown} /> {isSearchOpen && ( )}
{isAuthorizedUser && !isArchived ? ( ) : ( <> )}
); });