import { useMemo, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Check, ChevronsUpDown, LogOut, Plus, Settings, UserPlus } from "lucide-react"; import type { Company } from "@paperclipai/shared"; import { Link, useLocation, useNavigate } from "@/lib/router"; import { authApi } from "@/api/auth"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { useCompany } from "@/context/CompanyContext"; import { useDialogActions } from "@/context/DialogContext"; import { queryKeys } from "@/lib/queryKeys"; import { cn } from "@/lib/utils"; import { useSidebar } from "../context/SidebarContext"; import { CompanyPatternIcon } from "./CompanyPatternIcon"; interface SidebarCompanyMenuProps { open?: boolean; onOpenChange?: (open: boolean) => void; } function WorkspaceIcon({ company }: { company: Company }) { return ( ); } export function SidebarCompanyMenu({ open: controlledOpen, onOpenChange }: SidebarCompanyMenuProps = {}) { const [internalOpen, setInternalOpen] = useState(false); const queryClient = useQueryClient(); const { companies, selectedCompany, setSelectedCompanyId } = useCompany(); const { openOnboarding } = useDialogActions(); const { isMobile, setSidebarOpen } = useSidebar(); const location = useLocation(); const navigate = useNavigate(); const open = controlledOpen ?? internalOpen; const setOpen = onOpenChange ?? setInternalOpen; const sidebarCompanies = useMemo( () => companies.filter((company) => company.status !== "archived"), [companies], ); const { data: session } = useQuery({ queryKey: queryKeys.auth.session, queryFn: () => authApi.getSession(), retry: false, }); const signOutMutation = useMutation({ mutationFn: () => authApi.signOut(), onSuccess: async () => { setOpen(false); if (isMobile) setSidebarOpen(false); await queryClient.invalidateQueries({ queryKey: queryKeys.auth.session }); }, }); function closeNavigationChrome() { setOpen(false); if (isMobile) setSidebarOpen(false); } function selectCompany(company: Company) { const pathPrefix = location.pathname.split("/")[1]?.toUpperCase(); const isCompanyRoute = sidebarCompanies.some((sidebarCompany) => ( sidebarCompany.issuePrefix.toUpperCase() === pathPrefix )); const shouldLeaveCurrentRoute = company.id !== selectedCompany?.id && (location.pathname.startsWith("/instance/") || isCompanyRoute); setSelectedCompanyId(company.id); setOpen(false); if (isMobile) setSidebarOpen(false); if (shouldLeaveCurrentRoute) { navigate(`/${company.issuePrefix}/dashboard`); } } function addCompany() { setOpen(false); if (isMobile) setSidebarOpen(false); openOnboarding(); } return ( Switch workspace
{sidebarCompanies.map((company) => { const isSelected = company.id === selectedCompany?.id; return ( selectCompany(company)} className={cn( "min-w-0 gap-2 py-2", isSelected && "bg-accent text-accent-foreground", )} > {company.name} {company.issuePrefix} {isSelected ? : null} ); })} {sidebarCompanies.length === 0 ? ( No workspaces ) : null}
Add company... {selectedCompany ? `Invite people to ${selectedCompany.name}` : "Invite people"} Company settings {session?.session ? ( <> signOutMutation.mutate()} disabled={signOutMutation.isPending} > {signOutMutation.isPending ? "Signing out..." : "Sign out"} ) : null}
); }