import { useMemo, useState } from 'react'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { Building2Icon, ChevronsUpDown, Plus, Settings2Icon, SettingsIcon, UsersIcon, } from 'lucide-react'; import { Link, useLocation } from 'react-router'; import { authClient } from '@documenso/auth/client'; import { useOptionalCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { useSession } from '@documenso/lib/client-only/providers/session'; import { EXTENDED_ORGANISATION_MEMBER_ROLE_MAP } from '@documenso/lib/constants/organisations-translations'; import { EXTENDED_TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams-translations'; import { formatAvatarUrl } from '@documenso/lib/utils/avatars'; import { isAdmin } from '@documenso/lib/utils/is-admin'; import { canExecuteOrganisationAction } from '@documenso/lib/utils/organisations'; import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; import { AnimateGenericFadeInOut } from '@documenso/ui/components/animate/animate-generic-fade-in-out'; import { LanguageSwitcherDialog } from '@documenso/ui/components/common/language-switcher-dialog'; import { cn } from '@documenso/ui/lib/utils'; import { AvatarWithText } from '@documenso/ui/primitives/avatar'; import { Button } from '@documenso/ui/primitives/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@documenso/ui/primitives/dropdown-menu'; import { useOptionalCurrentTeam } from '~/providers/team'; export const OrgMenuSwitcher = () => { const { _ } = useLingui(); const { user, organisations } = useSession(); const { pathname } = useLocation(); const [isOpen, setIsOpen] = useState(false); const [languageSwitcherOpen, setLanguageSwitcherOpen] = useState(false); const [hoveredOrgId, setHoveredOrgId] = useState(null); const isUserAdmin = isAdmin(user); const isPathOrgUrl = (orgUrl: string) => { if (!pathname || !pathname.startsWith(`/o/`)) { return false; } return pathname.split('/')[2] === orgUrl; }; const selectedOrg = organisations.find((org) => isPathOrgUrl(org.url)); const hoveredOrg = organisations.find( (org) => org.id === hoveredOrgId || organisations.length === 1, ); const currentOrganisation = useOptionalCurrentOrganisation(); const currentTeam = useOptionalCurrentTeam(); // Use hovered org for teams display if available, // otherwise use current team's org if in a team, // finally fallback to selected org const displayedOrg = hoveredOrg || currentOrganisation || selectedOrg; const formatAvatarFallback = (name?: string) => { if (name !== undefined) { return name.slice(0, 1).toUpperCase(); } return user.name ? extractInitials(user.name) : user.email.slice(0, 1).toUpperCase(); }; const dropdownMenuAvatarText = useMemo(() => { if (currentTeam) { return { avatarSrc: formatAvatarUrl(currentTeam.avatarImageId), avatarFallback: formatAvatarFallback(currentTeam.name), primaryText: currentTeam.name, secondaryText: _(EXTENDED_TEAM_MEMBER_ROLE_MAP[currentTeam.currentTeamRole]), }; } if (currentOrganisation) { return { avatarSrc: formatAvatarUrl(currentOrganisation.avatarImageId), avatarFallback: formatAvatarFallback(currentOrganisation.name), primaryText: currentOrganisation.name, secondaryText: _( EXTENDED_ORGANISATION_MEMBER_ROLE_MAP[currentOrganisation.currentOrganisationRole], ), }; } return { avatarSrc: formatAvatarUrl(user.avatarImageId), avatarFallback: formatAvatarFallback(user.name ?? user.email), primaryText: user.name, secondaryText: _(msg`Personal Account`), }; }, [currentTeam, currentOrganisation, user]); const handleOpenChange = (open: boolean) => { if (open) { setHoveredOrgId(currentOrganisation?.id || null); } setIsOpen(open); }; return (
{/* Organisations column */}

Organisations

{organisations.map((org) => (
setHoveredOrgId(org.id)} > {org.name} {canExecuteOrganisationAction( 'MANAGE_ORGANISATION', org.currentOrganisationRole, ) && (
)}
))}
{/* Teams column */}

Teams

{hoveredOrg ? ( hoveredOrg.teams.map((team) => (
{team.name} {canExecuteTeamAction('MANAGE_TEAM', team.currentTeamRole) && (
)}
)) ) : (
Select an organisation to view teams
)} {displayedOrg && ( )}
{/* Settings column */}

Settings

{isUserAdmin && ( Admin panel )} Personal Inbox Account {currentOrganisation && canExecuteOrganisationAction( 'MANAGE_ORGANISATION', currentOrganisation.currentOrganisationRole, ) && ( Organisation settings )} {currentTeam && canExecuteTeamAction('MANAGE_TEAM', currentTeam.currentTeamRole) && ( Team settings )} setLanguageSwitcherOpen(true)} > Language authClient.signOut()} > Sign Out
); };