import { useSession } from '@documenso/lib/client-only/providers/session'; import { EXTENDED_TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams-translations'; import { formatAvatarUrl } from '@documenso/lib/utils/avatars'; import { getSettingsNavGroups } from '@documenso/lib/utils/settings-nav'; import { computeSwitcherContinuityPath } from '@documenso/lib/utils/settings-switcher'; import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; import { cn } from '@documenso/ui/lib/utils'; import { AvatarWithText } from '@documenso/ui/primitives/avatar'; import { Button } from '@documenso/ui/primitives/button'; import { Input } from '@documenso/ui/primitives/input'; import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; import { Trans, useLingui } from '@lingui/react/macro'; import { ChevronsUpDownIcon, PlusIcon, SearchIcon } from 'lucide-react'; import { useMemo, useState } from 'react'; import { useLocation, useNavigate } from 'react-router'; const SEARCH_THRESHOLD = 5; export type SettingsTeamSwitcherProps = { currentOrgUrl: string; currentTeamUrl: string | null; }; export const SettingsTeamSwitcher = ({ currentOrgUrl, currentTeamUrl }: SettingsTeamSwitcherProps) => { const { t } = useLingui(); const { organisations } = useSession(); const { pathname } = useLocation(); const navigate = useNavigate(); const [isOpen, setIsOpen] = useState(false); const [query, setQuery] = useState(''); const currentOrg = organisations.find((org) => org.url === currentOrgUrl); const manageableTeams = useMemo( () => currentOrg ? currentOrg.teams.filter((team) => canExecuteTeamAction('MANAGE_TEAM', team.currentTeamRole)) : [], [currentOrg], ); const currentTeam = manageableTeams.find((team) => team.url === currentTeamUrl) ?? manageableTeams[0]; const filtered = useMemo(() => { const q = query.trim().toLowerCase(); if (!q) { return manageableTeams; } return manageableTeams.filter((team) => team.name.toLowerCase().includes(q)); }, [manageableTeams, query]); const handleSelect = (teamUrl: string) => { const destinationTeam = manageableTeams.find((team) => team.url === teamUrl); if (!currentOrg || !destinationTeam) { return; } const destinationGroup = getSettingsNavGroups({ organisation: { url: currentOrg.url, currentOrganisationRole: currentOrg.currentOrganisationRole, organisationClaim: currentOrg.organisationClaim, }, team: { url: destinationTeam.url, currentTeamRole: destinationTeam.currentTeamRole }, hasManageableBillingOrgs: false, }).team; if (!destinationGroup) { return; } setIsOpen(false); void navigate( computeSwitcherContinuityPath({ currentPath: pathname, destinationPaths: destinationGroup.items.map((item) => item.path), fallbackPath: destinationGroup.items[0].path, }), ); }; if (!currentOrg || !currentTeam) { return null; } return ( {manageableTeams.length >= SEARCH_THRESHOLD && (
setQuery(e.target.value)} placeholder={t`Search teams…`} className="h-8 pl-7" data-testid="settings-team-switcher-search" />
)}
); };