import { AnimatePresence, motion } from 'framer-motion' import Link from 'next/link' import { ReactNode, useMemo } from 'react' import { useParams } from 'common' import { useNewLayout } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import Connect from 'components/interfaces/Connect/Connect' import { ThemeDropdown } from 'components/interfaces/ThemeDropdown' import { UserDropdown } from 'components/interfaces/UserDropdown' import AssistantButton from 'components/layouts/AppLayout/AssistantButton' import BranchDropdown from 'components/layouts/AppLayout/BranchDropdown' import EnableBranchingButton from 'components/layouts/AppLayout/EnableBranchingButton/EnableBranchingButton' import InlineEditorButton from 'components/layouts/AppLayout/InlineEditorButton' import OrganizationDropdown from 'components/layouts/AppLayout/OrganizationDropdown' import ProjectDropdown from 'components/layouts/AppLayout/ProjectDropdown' import { getResourcesExceededLimitsOrg } from 'components/ui/OveragesBanner/OveragesBanner.utils' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useOrgUsageQuery } from 'data/usage/org-usage-query' import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization' import { useSelectedProject } from 'hooks/misc/useSelectedProject' import { useShowLayoutHeader } from 'hooks/misc/useShowLayoutHeader' import { IS_PLATFORM } from 'lib/constants' import { useAppStateSnapshot } from 'state/app-state' import { Badge, cn } from 'ui' import BreadcrumbsView from './BreadcrumbsView' import { FeedbackDropdown } from './FeedbackDropdown' import HelpPopover from './HelpPopover' import { HomeIcon } from './HomeIcon' import { LocalVersionPopover } from './LocalVersionPopover' import NotificationsPopoverV2 from './NotificationsPopoverV2/NotificationsPopover' const LayoutHeaderDivider = ({ className, ...props }: React.HTMLProps) => ( ) interface LayoutHeaderProps { customHeaderComponents?: ReactNode breadcrumbs?: any[] showProductMenu?: boolean headerTitle?: string } const LayoutHeader = ({ customHeaderComponents, breadcrumbs = [], showProductMenu, headerTitle, }: LayoutHeaderProps) => { const newLayoutPreview = useNewLayout() const showLayoutHeader = useShowLayoutHeader() const { ref: projectRef, slug } = useParams() const selectedProject = useSelectedProject() const selectedOrganization = useSelectedOrganization() const isBranchingEnabled = selectedProject?.is_branch_enabled === true const { setMobileMenuOpen } = useAppStateSnapshot() const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: selectedOrganization?.slug, }) // 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: subscription?.usage_billing_enabled === false } ) const exceedingLimits = useMemo(() => { if (orgUsage) { return getResourcesExceededLimitsOrg(orgUsage?.usages || []).length > 0 } else { return false } }, [orgUsage]) // show org selection if we are on a project page or on a explicit org route const showOrgSelection = slug || (selectedOrganization && projectRef) return (
<>
{showOrgSelection && // hides org dropdown for old layout (newLayoutPreview || showLayoutHeader) && IS_PLATFORM ? ( <> ) : null} {projectRef && ( {exceedingLimits && (
Exceeding usage limits
)} {selectedProject && isBranchingEnabled && ( <> )}
)}
{headerTitle && ( {headerTitle} )}
{projectRef && ( {!isBranchingEnabled && IS_PLATFORM && } )}
{customHeaderComponents && customHeaderComponents} {IS_PLATFORM ? ( <> ) : ( <> )}
{!!projectRef && (
)}
) } export default LayoutHeader