()
| 312 | |
| 313 | // Install selected plugins |
| 314 | const installSelectedPlugins = async () => { |
| 315 | if (selectedForInstall.size === 0) return; |
| 316 | const pluginsToInstall = availablePlugins.filter(p_0 => selectedForInstall.has(p_0.pluginId)); |
| 317 | setInstallingPlugins(new Set(pluginsToInstall.map(p_1 => p_1.pluginId))); |
| 318 | let successCount_0 = 0; |
| 319 | let failureCount = 0; |
| 320 | const newFailedPlugins: Array<{ |
| 321 | name: string; |
| 322 | reason: string; |
| 323 | }> = []; |
| 324 | for (const plugin_1 of pluginsToInstall) { |
| 325 | const result = await installPluginFromMarketplace({ |
| 326 | pluginId: plugin_1.pluginId, |
| 327 | entry: plugin_1.entry, |
| 328 | marketplaceName: plugin_1.marketplaceName, |
| 329 | scope: 'user' |
| 330 | }); |
| 331 | if (result.success) { |
| 332 | successCount_0++; |
| 333 | } else { |
| 334 | failureCount++; |
| 335 | newFailedPlugins.push({ |
| 336 | name: plugin_1.entry.name, |
| 337 | reason: result.error |
| 338 | }); |
| 339 | } |
| 340 | } |
| 341 | setInstallingPlugins(new Set()); |
| 342 | setSelectedForInstall(new Set()); |
| 343 | clearAllCaches(); |
| 344 | |
| 345 | // Handle installation results |
| 346 | if (failureCount === 0) { |
| 347 | // All succeeded |
| 348 | const message = `✓ Installed ${successCount_0} ${plural(successCount_0, 'plugin')}. ` + `Run /reload-plugins to activate.`; |
| 349 | setResult(message); |
| 350 | } else if (successCount_0 === 0) { |
| 351 | // All failed - show error with reasons |
| 352 | setError(`Failed to install: ${formatFailureDetails(newFailedPlugins, true)}`); |
| 353 | } else { |
| 354 | // Mixed results - show partial success |
| 355 | const message_0 = `✓ Installed ${successCount_0} of ${successCount_0 + failureCount} plugins. ` + `Failed: ${formatFailureDetails(newFailedPlugins, false)}. ` + `Run /reload-plugins to activate successfully installed plugins.`; |
| 356 | setResult(message_0); |
| 357 | } |
| 358 | |
| 359 | // Handle completion callback and navigation |
| 360 | if (successCount_0 > 0) { |
| 361 | if (onInstallComplete) { |
| 362 | await onInstallComplete(); |
| 363 | } |
| 364 | } |
| 365 | setParentViewState({ |
| 366 | type: 'menu' |
| 367 | }); |
| 368 | }; |
| 369 | |
| 370 | // Install single plugin from details view |
| 371 | const handleSinglePluginInstall = async (plugin_2: InstallablePlugin, scope: 'user' | 'project' | 'local' = 'user') => { |
no test coverage detected