import { ChevronsUpDown } from "lucide-react"; import { toast } from "sonner"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuShortcut, DropdownMenuTrigger, } from "~/client/components/ui/dropdown-menu"; import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from "~/client/components/ui/sidebar"; import { authClient } from "~/client/lib/auth-client"; import { useMutation } from "@tanstack/react-query"; import { useOrganizationContext } from "../hooks/use-org-context"; function getOrganizationInitials(name?: string): string { const trimmedName = name?.trim(); if (!trimmedName) { return "O"; } return trimmedName .split(/\s+/) .slice(0, 2) .map((part) => part.charAt(0).toUpperCase()) .join(""); } export function OrganizationSwitcher() { const { isMobile } = useSidebar(); const { organizations, activeOrganization } = useOrganizationContext(); const switchOrganizationMutation = useMutation({ mutationFn: async (organizationId: string) => { const { error } = await authClient.organization.setActive({ organizationId }); if (error) throw new Error(error.message); }, onError: (error) => { const message = error instanceof Error ? error.message : "Unexpected error while switching organizations"; toast.error("Failed to switch organization", { description: message }); }, }); if (organizations === undefined) { return null; } if (organizations.length <= 1) { return null; } return (
{activeOrganization?.logo ? ( {`${activeOrganization.name} ) : ( {getOrganizationInitials(activeOrganization?.name)} )}
{activeOrganization?.name} {organizations.length} organizations
Organizations {organizations.map((organization) => ( switchOrganizationMutation.mutate(organization.id)} className="gap-2 p-2" disabled={switchOrganizationMutation.isPending} >
{organization.logo ? ( {`${organization.name} ) : ( {getOrganizationInitials(organization.name)} )}
{organization.name} {organization.id === activeOrganization?.id && "Current"}
))}
); }