|
|
@@ -0,0 +1,78 @@
|
|
|
+import * as React from 'react';
|
|
|
+import { ChevronsUpDown, Plus } from 'lucide-react';
|
|
|
+
|
|
|
+import {
|
|
|
+ DropdownMenu,
|
|
|
+ DropdownMenuContent,
|
|
|
+ DropdownMenuItem,
|
|
|
+ DropdownMenuLabel,
|
|
|
+ DropdownMenuSeparator,
|
|
|
+ DropdownMenuShortcut,
|
|
|
+ DropdownMenuTrigger,
|
|
|
+} from '@/components/ui/dropdown-menu.js';
|
|
|
+import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from '@/components/ui/sidebar.js';
|
|
|
+
|
|
|
+export function TeamSwitcher({
|
|
|
+ teams,
|
|
|
+}: {
|
|
|
+ teams: {
|
|
|
+ name: string;
|
|
|
+ logo: React.ElementType;
|
|
|
+ plan: string;
|
|
|
+ }[];
|
|
|
+}) {
|
|
|
+ const { isMobile } = useSidebar();
|
|
|
+ const [activeTeam, setActiveTeam] = React.useState(teams[0]);
|
|
|
+
|
|
|
+ return (
|
|
|
+ <SidebarMenu>
|
|
|
+ <SidebarMenuItem>
|
|
|
+ <DropdownMenu>
|
|
|
+ <DropdownMenuTrigger asChild>
|
|
|
+ <SidebarMenuButton
|
|
|
+ size="lg"
|
|
|
+ className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
|
|
|
+ >
|
|
|
+ <div className="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg">
|
|
|
+ <activeTeam.logo className="size-4" />
|
|
|
+ </div>
|
|
|
+ <div className="grid flex-1 text-left text-sm leading-tight">
|
|
|
+ <span className="truncate font-semibold">{activeTeam.name}</span>
|
|
|
+ <span className="truncate text-xs">{activeTeam.plan}</span>
|
|
|
+ </div>
|
|
|
+ <ChevronsUpDown className="ml-auto" />
|
|
|
+ </SidebarMenuButton>
|
|
|
+ </DropdownMenuTrigger>
|
|
|
+ <DropdownMenuContent
|
|
|
+ className="w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg"
|
|
|
+ align="start"
|
|
|
+ side={isMobile ? 'bottom' : 'right'}
|
|
|
+ sideOffset={4}
|
|
|
+ >
|
|
|
+ <DropdownMenuLabel className="text-muted-foreground text-xs">Teams</DropdownMenuLabel>
|
|
|
+ {teams.map((team, index) => (
|
|
|
+ <DropdownMenuItem
|
|
|
+ key={team.name}
|
|
|
+ onClick={() => setActiveTeam(team)}
|
|
|
+ className="gap-2 p-2"
|
|
|
+ >
|
|
|
+ <div className="flex size-6 items-center justify-center rounded-xs border">
|
|
|
+ <team.logo className="size-4 shrink-0" />
|
|
|
+ </div>
|
|
|
+ {team.name}
|
|
|
+ <DropdownMenuShortcut>⌘{index + 1}</DropdownMenuShortcut>
|
|
|
+ </DropdownMenuItem>
|
|
|
+ ))}
|
|
|
+ <DropdownMenuSeparator />
|
|
|
+ <DropdownMenuItem className="gap-2 p-2">
|
|
|
+ <div className="bg-background flex size-6 items-center justify-center rounded-md border">
|
|
|
+ <Plus className="size-4" />
|
|
|
+ </div>
|
|
|
+ <div className="text-muted-foreground font-medium">Add team</div>
|
|
|
+ </DropdownMenuItem>
|
|
|
+ </DropdownMenuContent>
|
|
|
+ </DropdownMenu>
|
|
|
+ </SidebarMenuItem>
|
|
|
+ </SidebarMenu>
|
|
|
+ );
|
|
|
+}
|