import React, { useState, useRef, useEffect } from 'react'; import { useTenant } from '../../stores/tenant.store'; import { useToast } from '../../hooks/ui/useToast'; import { ChevronDown, Building2, Check, AlertCircle } from 'lucide-react'; interface TenantSwitcherProps { className?: string; showLabel?: boolean; } export const TenantSwitcher: React.FC = ({ className = '', showLabel = true, }) => { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const buttonRef = useRef(null); const { currentTenant, availableTenants, isLoading, error, switchTenant, loadUserTenants, clearError, } = useTenant(); const { success: showSuccessToast, error: showErrorToast } = useToast(); // Load tenants on mount useEffect(() => { if (!availableTenants) { loadUserTenants(); } }, [availableTenants, loadUserTenants]); // Handle click outside to close dropdown useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) && !buttonRef.current?.contains(event.target as Node) ) { setIsOpen(false); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); // Handle tenant switch const handleTenantSwitch = async (tenantId: string) => { if (tenantId === currentTenant?.id) { setIsOpen(false); return; } const success = await switchTenant(tenantId); setIsOpen(false); if (success) { const newTenant = availableTenants?.find(t => t.id === tenantId); showSuccessToast(`Switched to ${newTenant?.name}`, { title: 'Tenant Switched' }); } else { showErrorToast(error || 'Failed to switch tenant', { title: 'Switch Failed' }); } }; // Handle retry loading tenants const handleRetry = () => { clearError(); loadUserTenants(); }; // Don't render if no tenants available if (!availableTenants || availableTenants.length === 0) { return null; } // Don't render if only one tenant if (availableTenants.length === 1) { return showLabel ? (
{currentTenant?.name}
) : null; } return (
{/* Trigger Button */} {/* Dropdown Menu */} {isOpen && (
{/* Header */}

Switch Organization

Select the organization you want to work with

{/* Error State */} {error && (
{error}
)} {/* Tenant List */}
{availableTenants.map((tenant) => ( ))}
{/* Footer */}

Need to add a new organization?{' '}

)} {/* Loading Overlay */} {isLoading && (
)}
); };