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); $currentVersion = config('app.version'); return collect($catalog) ->filter(function ($plugin) use ($currentVersion) { // Check if Laravel compatibility is true if (!Arr::get($plugin, 'byos.byos_laravel.compatibility', false)) { return false; } // Check minimum version if specified $minVersion = Arr::get($plugin, 'byos.byos_laravel.min_version'); if ($minVersion && $currentVersion && version_compare($currentVersion, $minVersion, '<')) { return false; } return true; }) ->map(function ($plugin, $key) { return [ 'id' => $key, 'name' => Arr::get($plugin, 'name', 'Unknown Plugin'), 'description' => Arr::get($plugin, 'author_bio.description', ''), 'author' => Arr::get($plugin, 'author.name', 'Unknown Author'), 'github' => Arr::get($plugin, 'author.github'), 'license' => Arr::get($plugin, 'license'), 'zip_url' => Arr::get($plugin, 'trmnlp.zip_url'), 'zip_entry_path' => Arr::get($plugin, 'trmnlp.zip_entry_path'), 'repo_url' => Arr::get($plugin, 'trmnlp.repo'), 'logo_url' => Arr::get($plugin, 'logo_url'), 'screenshot_url' => Arr::get($plugin, 'screenshot_url'), 'learn_more_url' => Arr::get($plugin, 'author_bio.learn_more_url'), ]; }) ->sortBy('name') ->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(), $plugin['zip_entry_path'] ?? null, null, $plugin['logo_url'] ?? null ); $this->dispatch('plugin-installed'); Flux::modal('import-from-catalog')->close(); } catch (\Exception $e) { $this->addError('installation', 'Error installing plugin: ' . $e->getMessage()); } finally { $this->installingPlugin = ''; } } }; ?>