import { useState } from 'react'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'; import { ChevronDown, ChevronUp, Loader2 } from 'lucide-react'; import { Button } from './ui/button'; import { startNewSession } from '../sessions'; import { useNavigation } from '../hooks/useNavigation'; import { formatExtensionErrorMessage } from '../utils/extensionErrorUtils'; import { getInitialWorkingDir } from '../utils/workingDir'; import { formatExtensionName } from './settings/extensions/subcomponents/ExtensionList'; export interface ExtensionLoadingStatus { name: string; status: 'loading' | 'success' | 'error'; error?: string; recoverHints?: string; } interface ExtensionLoadingToastProps { extensions: ExtensionLoadingStatus[]; totalCount: number; isComplete: boolean; } export function GroupedExtensionLoadingToast({ extensions, totalCount, isComplete, }: ExtensionLoadingToastProps) { const [isOpen, setIsOpen] = useState(false); const [copiedExtension, setCopiedExtension] = useState(null); const setView = useNavigation(); const successCount = extensions.filter((ext) => ext.status === 'success').length; const errorCount = extensions.filter((ext) => ext.status === 'error').length; const getStatusIcon = (status: 'loading' | 'success' | 'error') => { switch (status) { case 'loading': return ; case 'success': return
; case 'error': return
; } }; const getSummaryText = () => { if (!isComplete) { return `Loading ${totalCount} extension${totalCount !== 1 ? 's' : ''}...`; } if (errorCount === 0) { return `Successfully loaded ${successCount} extension${successCount !== 1 ? 's' : ''}`; } return `Loaded ${successCount}/${totalCount} extension${totalCount !== 1 ? 's' : ''}`; }; const getSummaryIcon = () => { if (!isComplete) { return ; } if (errorCount === 0) { return
; } return
; }; return (
{/* Main summary section - clickable */}
{getSummaryIcon()}
{getSummaryText()}
{errorCount > 0 && (
{errorCount} extension{errorCount !== 1 ? 's' : ''} failed to load
)}
{/* Expanded details section */}
{extensions.map((ext) => { const friendlyName = formatExtensionName(ext.name); return (
{getStatusIcon(ext.status)}
{friendlyName}
{ext.status === 'error' && ext.error && (
{formatExtensionErrorMessage(ext.error, 'Failed to add extension')}
{ext.recoverHints && setView && ( )}
)}
); })}
{/* Toggle button */} {totalCount > 0 && ( )}
); }