"use client"; import { useState, useEffect } from "react"; import { ChevronsUpDown, Plus } from "lucide-react"; import { graphql, useFragment } from "react-relay"; import { Link, useNavigate, useParams } from "react-router"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "@/components/ui/sidebar"; import { OrganizationSwitcher_organizations$key, OrganizationSwitcher_organizations$data, } from "./__generated__/OrganizationSwitcher_organizations.graphql"; import { cn } from "@/lib/utils"; import { OrganizationSwitcherSkeleton } from "./OrganizationSwitcherSkeleton"; export const organizationSwitcherFragment = graphql` fragment OrganizationSwitcher_organizations on User { organizations(first: 25) @connection(key: "OrganizationSwitcher_organizations") { __id edges { node { id name logoUrl } } } } `; type Organization = OrganizationSwitcher_organizations$data["organizations"]["edges"][0]["node"]; const LogoComponent = ({ org, className, }: { org: Organization; className?: string; }) => { if (org.logoUrl) { return ( {org.name} ); } return org.name.substring(0, 2).toUpperCase(); }; export function OrganizationSwitcher({ organizations, }: { organizations: OrganizationSwitcher_organizations$key; }) { const { isMobile } = useSidebar(); const data = useFragment(organizationSwitcherFragment, organizations); const navigate = useNavigate(); const { organizationId } = useParams(); const [currentOrganization, setCurrentOrganization] = useState(null); const hasOrganizations = data.organizations && data.organizations.edges.length > 0; useEffect(() => { if (hasOrganizations) { const org = data.organizations.edges.find( (edge) => edge.node.id === organizationId ); if (org) { setCurrentOrganization(org.node); } } }, [data.organizations, organizationId, hasOrganizations]); const handleOrganizationSwitch = (org: Organization) => { navigate(`/organizations/${org.id}`); }; if (!hasOrganizations) { return ; } return (
{currentOrganization ? ( ) : (
)}
{currentOrganization ? ( <> {currentOrganization.name} ) : ( Select Organization )}
Organizations {hasOrganizations && data.organizations.edges.map((edge, index) => ( handleOrganizationSwitch(edge.node)} className={`gap-2 p-2 ${ edge.node.id === organizationId ? "bg-muted" : "" }`} >
{edge.node.name} ⌘{index + 1}
))}
Add organization
); }