import { useParams } from 'common' import { Box, Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import type { ComponentProps } from 'react' import { useState } from 'react' import { Button, CommandGroup, CommandItem } from 'ui' import { ShimmeringLoader } from 'ui-patterns' import { AppLayoutDropdownTriggerButton } from './AppLayoutDropdown' import { sanitizeRoute } from './ProjectDropdown.utils' import { ProjectRowLink } from './ProjectRowLink' import { useEmbeddedCloseHandler } from './useEmbeddedCloseHandler' import { OrganizationProjectSelector } from '@/components/ui/OrganizationProjectSelector' import PartnerIcon from '@/components/ui/PartnerIcon' import { getManagedByFromOrganizationPartner } from '@/data/organizations/managed-by-utils' import type { OrgProject } from '@/data/projects/org-projects-infinite-query' import { useProjectDetailQuery } from '@/data/projects/project-detail-query' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { IS_PLATFORM } from '@/lib/constants' import type { ManagedBy } from '@/lib/constants/infrastructure' import { useTrack } from '@/lib/telemetry/track' // --- Sub-components --- interface ProjectDropdownNewProjectActionsProps { organizationSlug: string | undefined embedded: boolean onClose: () => void onNavigate: (href: string) => void } function ProjectDropdownNewProjectActions({ organizationSlug, embedded, onClose, onNavigate, }: ProjectDropdownNewProjectActionsProps) { const href = `/new/${organizationSlug}` if (embedded) { return ( ) } return ( { onClose() onNavigate(href) }} onClick={onClose} >

New project

) } const ProjectDropdownNonPlatformView = ({ projectName }: { projectName: string }) => { return
{projectName}
} interface ProjectDropdownPlatformViewProps { projectRef: string | undefined projectName: string projectManagedBy?: ManagedBy selectorProps: Omit< ComponentProps, 'renderTrigger' | 'embedded' > } function ProjectDropdownPlatformView({ projectRef, projectName, projectManagedBy, selectorProps, }: ProjectDropdownPlatformViewProps) { return (
{projectName} {projectManagedBy && } } />
) } // --- Main component --- interface ProjectDropdownProps { embedded?: boolean className?: string onClose?: () => void } export const ProjectDropdown = ({ embedded = false, className, onClose, }: ProjectDropdownProps = {}) => { const router = useRouter() const { ref } = useParams() const { data: project, isPending: isLoadingProject } = useSelectedProjectQuery() const { data: selectedOrganization } = useSelectedOrganizationQuery() const isBranch = project?.parentRef !== project?.ref const { data: parentProject, isPending: isLoadingParentProject } = useProjectDetailQuery( { ref: project?.parent_project_ref }, { enabled: isBranch } ) const selectedProject = parentProject ?? project const projectCreationEnabled = useIsFeatureEnabled('projects:create') const track = useTrack() const [open, setOpen] = useState(false) const close = useEmbeddedCloseHandler(embedded, onClose, setOpen) const selectedProjectManagedBy = selectedProject?.integration_source ? getManagedByFromOrganizationPartner(undefined, selectedProject.integration_source) : selectedOrganization?.billing_partner ? selectedOrganization.managed_by : undefined if (isLoadingProject || (isBranch && isLoadingParentProject) || !selectedProject) { if (!embedded) return } const handleSetOpen = embedded ? (_value: boolean) => onClose?.() : (next: boolean) => { if (next) track('header_project_dropdown_opened') setOpen(next) } const selectorProps = { open, setOpen: handleSetOpen, selectedRef: ref, onSelect: (project: { ref: string }) => { const sanitizedRoute = sanitizeRoute(router.route, router.query) const href = sanitizedRoute?.replace('[ref]', project.ref) ?? `/project/${project.ref}` close() router.push(href) }, renderRow: (project: Pick) => ( ), renderActions: (_setOpen: (value: boolean) => void, options?: { embedded?: boolean }) => projectCreationEnabled ? ( router.push(href)} /> ) : null, } if (embedded) return ( ) return IS_PLATFORM ? ( ) : ( ) }