import { useParams } from 'common' import dayjs from 'dayjs' import { AnimatePresence, motion } from 'framer-motion' import { ChevronLeft } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { ReactNode, useMemo } from 'react' import { Badge, cn } from 'ui' import { CommandMenuTriggerInput } from 'ui-patterns' import { BreadcrumbsView } from './BreadcrumbsView' import { FeedbackDropdown } from './FeedbackDropdown/FeedbackDropdown' import { HeaderUpgradeButton } from './HeaderUpgradeButton' import { HomeIcon } from './HomeIcon' import { LocalVersionPopover } from './LocalVersionPopover' import { MergeRequestButton } from './MergeRequestButton' import { ConnectButton } from '@/components/interfaces/ConnectButton/ConnectButton' import { ConnectSheet } from '@/components/interfaces/ConnectSheet/ConnectSheet' import { LocalDropdown } from '@/components/interfaces/LocalDropdown' import { UserDropdown } from '@/components/interfaces/UserDropdown' import { AdvisorButton } from '@/components/layouts/AppLayout/AdvisorButton' import { AssistantButton } from '@/components/layouts/AppLayout/AssistantButton' import { BranchDropdown } from '@/components/layouts/AppLayout/BranchDropdown' import { InlineEditorButton } from '@/components/layouts/AppLayout/InlineEditorButton' import { OrganizationDropdown } from '@/components/layouts/AppLayout/OrganizationDropdown' import { ProjectDropdown } from '@/components/layouts/AppLayout/ProjectDropdown' import { HelpButton } from '@/components/ui/HelpPanel/HelpButton' import { getResourcesExceededLimitsOrg } from '@/components/ui/OveragesBanner/OveragesBanner.utils' import { useOrgUsageQuery } from '@/data/usage/org-usage-query' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { IS_PLATFORM } from '@/lib/constants' import { useTrack } from '@/lib/telemetry/track' import { SHORTCUT_IDS } from '@/state/shortcuts/registry' import { useIsShortcutEnabled } from '@/state/shortcuts/useIsShortcutEnabled' const LayoutHeaderDivider = ({ className, ...props }: React.HTMLProps) => ( ) interface LayoutHeaderProps { customHeaderComponents?: ReactNode breadcrumbs?: unknown[] headerTitle?: string backToDashboardURL?: string } export const LayoutHeader = ({ customHeaderComponents, breadcrumbs = [], headerTitle, backToDashboardURL, }: LayoutHeaderProps) => { const router = useRouter() const { ref: projectRef, slug } = useParams() const { data: selectedProject } = useSelectedProjectQuery() const { data: selectedOrganization } = useSelectedOrganizationQuery() const track = useTrack() const commandMenuEnabled = useIsShortcutEnabled(SHORTCUT_IDS.COMMAND_MENU_OPEN) const isAccountPage = router.pathname.startsWith('/account') // We only want to query the org usage and check for possible over-ages for plans without usage billing enabled (free or pro with spend cap) const { data: orgUsage } = useOrgUsageQuery( { orgSlug: selectedOrganization?.slug }, { enabled: selectedOrganization?.usage_billing_enabled === false } ) const exceedingLimits = useMemo(() => { if (orgUsage) { return getResourcesExceededLimitsOrg(orgUsage?.usages || []).length > 0 } else { return false } }, [orgUsage]) const isNewProject = selectedProject?.inserted_at !== undefined && dayjs(selectedProject.inserted_at).isAfter(dayjs().subtract(5, 'day')) const connectButtonType = isNewProject ? 'primary' : 'default' // show org selection if we are on a project page or on a explicit org route const showOrgSelection = slug || (selectedOrganization && projectRef) return ( <>
{backToDashboardURL && isAccountPage && (
track('header_back_to_dashboard_clicked')} className="flex items-center justify-center border-none bg-transparent! rounded-md min-w-[30px] w-[30px] h-[30px] text-foreground-lighter hover:text-foreground transition-colors" >
)}
{headerTitle && ( {headerTitle} )}
{showOrgSelection && IS_PLATFORM ? ( <> ) : null} {projectRef && ( {IS_PLATFORM && } {exceedingLimits && (
track('header_exceeding_usage_badge_clicked')} > Exceeding usage limits
)} {selectedProject && IS_PLATFORM && ( <> )}
)}
{headerTitle && ( {headerTitle} )} {projectRef && ( {IS_PLATFORM && } )}
{customHeaderComponents && customHeaderComponents} {IS_PLATFORM ? ( <>
{!!projectRef && ( <> )}
) : ( <>
{!!projectRef && ( <> )}
)}
) }