loadCatalogPlugins(); } private function loadCatalogPlugins(): void { $catalogUrl = config('app.catalog_url'); $this->catalogPlugins = Cache::remember('catalog_plugins', 43200, function () use ($catalogUrl) { try { $response = Http::get($catalogUrl); $catalogContent = $response->body(); $catalog = Yaml::parse($catalogContent); return collect($catalog)->map(function ($plugin, $key) { return [ 'id' => $key, 'name' => $plugin['name'] ?? 'Unknown Plugin', 'description' => $plugin['author_bio']['description'] ?? '', 'author' => $plugin['author']['name'] ?? 'Unknown Author', 'github' => $plugin['author']['github'] ?? null, 'license' => $plugin['license'] ?? null, 'zip_url' => $plugin['trmnlp']['zip_url'] ?? null, 'repo_url' => $plugin['trmnlp']['repo'] ?? null, 'logo_url' => $plugin['logo_url'] ?? null, 'screenshot_url' => $plugin['screenshot_url'] ?? null, 'learn_more_url' => $plugin['author_bio']['learn_more_url'] ?? null, ]; })->toArray(); } catch (\Exception $e) { Log::error('Failed to load catalog from URL: ' . $e->getMessage()); return []; } }); } public function installPlugin(string $pluginId, PluginImportService $pluginImportService): void { abort_unless(auth()->user() !== null, 403); $plugin = collect($this->catalogPlugins)->firstWhere('id', $pluginId); if (!$plugin || !$plugin['zip_url']) { $this->addError('installation', 'Plugin not found or no download URL available.'); return; } $this->installingPlugin = $pluginId; try { $importedPlugin = $pluginImportService->importFromUrl($plugin['zip_url'], auth()->user()); $this->dispatch('plugin-installed'); Flux::modal('import-from-catalog')->close(); } catch (\Exception $e) { $this->addError('installation', 'Error installing plugin: ' . $e->getMessage()); } finally { $this->installingPlugin = ''; } } }; ?>