import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useAppParams } from '@/hooks/use-app-params'; import { useRouter } from '@tanstack/react-router'; import { Link } from '@tanstack/react-router'; import { Building2Icon, CheckIcon, ChevronsUpDownIcon, PlusIcon, } from 'lucide-react'; import { useState } from 'react'; import { pushModal } from '@/modals'; import type { IServiceOrganization } from '@openpanel/db'; interface ProjectSelectorProps { projects: Array<{ id: string; name: string; organizationId: string }>; organizations?: IServiceOrganization[]; align?: 'start' | 'end'; } export default function ProjectSelector({ projects, organizations, align = 'start', }: ProjectSelectorProps) { const router = useRouter(); const { organizationId, projectId } = useAppParams(); const [open, setOpen] = useState(false); const changeProject = (newProjectId: string) => { if (organizationId && projectId) { // Navigate to the new project keeping the current path structure router.navigate({ to: '/$organizationId/$projectId', params: { organizationId, projectId: newProjectId, }, }); } else { router.navigate({ to: '/$organizationId/$projectId', params: { organizationId: organizationId!, projectId: newProjectId, }, }); } }; const changeOrganization = (newOrganizationId: string) => { router.navigate({ to: '/$organizationId', params: { organizationId: newOrganizationId, }, }); }; return ( Projects {projects.slice(0, 10).map((project) => ( changeProject(project.id)} > {project.name} {project.id === projectId && ( )} ))} {projects.length > 10 && ( All projects )} { pushModal('AddProject'); }} > Create new project {!!organizations && ( <> Organizations {organizations.map((organization) => ( changeOrganization(organization.id)} > {organization.name} {organization.id === organizationId && ( )} ))} New organization )} ); }