/** * Org Switcher Component (S-7.1) * * Dropdown in the sidebar/header for switching between organizations. * Shows current org name, dropdown of user's orgs, and create org option. */ import { getErrorMessage } from '@agentkitai/agentlens-core'; import React, { useState, useRef, useEffect } from 'react'; import { useOrg } from './OrgContext'; export function OrgSwitcher(): React.ReactElement { const { currentOrg, orgs, loading, switchOrg, createOrg } = useOrg(); const [open, setOpen] = useState(false); const [creating, setCreating] = useState(false); const [newOrgName, setNewOrgName] = useState(''); const [error, setError] = useState(null); const dropdownRef = useRef(null); // Close dropdown when clicking outside useEffect(() => { function handleClickOutside(e: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) { setOpen(false); setCreating(false); } } document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); if (loading || orgs.length === 0) { return
; } const handleCreate = async () => { if (!newOrgName.trim()) return; setError(null); try { await createOrg(newOrgName.trim()); setNewOrgName(''); setCreating(false); setOpen(false); } catch (err: unknown) { setError(getErrorMessage(err) || 'Failed to create org'); } }; return (
{/* Trigger */} {/* Dropdown */} {open && (
    {orgs.map((org) => (
  • ))}
{creating ? (
setNewOrgName(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleCreate()} placeholder="Organization name" className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded focus:ring-2 focus:ring-brand-500 focus:border-brand-500" autoFocus /> {error &&

{error}

}
) : ( )}
)}
); } export default OrgSwitcher;