| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import { useParams } from 'common'
- import { Boxes } from 'lucide-react'
- import { useRouter } from 'next/router'
- import { useState } from 'react'
- import { Badge, cn } from 'ui'
- import { GenericSkeletonLoader, ShimmeringLoader } from 'ui-patterns'
- import { AppLayoutDropdownError, AppLayoutDropdownWithPopover } from './AppLayoutDropdown'
- import { OrganizationDropdownCommandContent } from './OrganizationDropdownCommandContent'
- import { useEmbeddedCloseHandler } from './useEmbeddedCloseHandler'
- import PartnerIcon from '@/components/ui/PartnerIcon'
- import { useOrganizationsQuery } from '@/data/organizations/organizations-query'
- import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
- import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
- import { useTrack } from '@/lib/telemetry/track'
- interface OrganizationDropdownProps {
- embedded?: boolean
- className?: string
- onClose?: () => void
- }
- export const OrganizationDropdown = ({
- embedded = false,
- className,
- onClose,
- }: OrganizationDropdownProps = {}) => {
- const router = useRouter()
- const { slug: routeSlug } = useParams()
- const { data: selectedOrganization } = useSelectedOrganizationQuery()
- const {
- data: organizations,
- isPending: isLoadingOrganizations,
- isError,
- } = useOrganizationsQuery()
- const organizationCreationEnabled = useIsFeatureEnabled('organizations:create')
- const slug = selectedOrganization?.slug
- const orgName = selectedOrganization?.name
- const [open, setOpen] = useState(false)
- const close = useEmbeddedCloseHandler(embedded, onClose, setOpen)
- const track = useTrack()
- const handleOpenChange = (next: boolean) => {
- if (next) track('header_organization_dropdown_opened')
- setOpen(next)
- }
- if (isLoadingOrganizations && !embedded)
- return <ShimmeringLoader className="p-2 md:mr-2 w-[90px]" />
- if (isError) return <AppLayoutDropdownError message="Failed to load organizations" />
- const commandContent = (
- <OrganizationDropdownCommandContent
- embedded={embedded}
- className={className}
- organizations={organizations ?? []}
- selectedSlug={slug}
- routePathname={router.pathname}
- hasRouteSlug={!!routeSlug}
- organizationCreationEnabled={organizationCreationEnabled}
- onClose={close}
- />
- )
- if (embedded)
- return isLoadingOrganizations ? <GenericSkeletonLoader className="p-2" /> : commandContent
- return (
- <AppLayoutDropdownWithPopover
- linkHref={slug ? `/org/${slug}` : '/organizations'}
- linkContent={
- <>
- <Boxes size={14} strokeWidth={1.5} className="text-foreground-lighter" />
- <span
- className={cn(
- 'md:max-w-32 lg:max-w-none truncate hidden md:block',
- !!selectedOrganization ? 'text-foreground' : 'text-foreground-lighter'
- )}
- >
- {orgName ?? 'Select an organization'}
- </span>
- {!!selectedOrganization && <PartnerIcon organization={selectedOrganization} />}
- {!!selectedOrganization && (
- <Badge variant="default">{selectedOrganization?.plan.name}</Badge>
- )}
- </>
- }
- commandContent={commandContent}
- open={open}
- onOpenChange={handleOpenChange}
- />
- )
- }
|