updateSettings = $updateSettings; } public function mount(): void { $this->prereleases = $this->updateSettings->prereleases; $this->loadFromCache(); } private function loadFromCache(): void { $currentVersion = config('app.version'); if (! $currentVersion) { return; } // Load from cache without fetching $cachedRelease = Cache::get('latest_release'); if ($cachedRelease) { $this->processCachedRelease($cachedRelease, $currentVersion); } } private function processCachedRelease($cachedRelease, string $currentVersion): void { $latestVersion = null; $releaseData = null; // Handle both single release object and array of releases if (is_array($cachedRelease) && isset($cachedRelease[0])) { // Array of releases - find the latest one $releaseData = $cachedRelease[0]; $latestVersion = Arr::get($releaseData, 'tag_name'); } else { // Single release object $releaseData = $cachedRelease; $latestVersion = Arr::get($releaseData, 'tag_name'); } if ($latestVersion) { $this->latestVersion = $latestVersion; $this->isUpdateAvailable = version_compare($latestVersion, $currentVersion, '>'); $this->releaseUrl = Arr::get($releaseData, 'html_url'); $this->loadReleaseNotes(); } } public function checkForUpdates(): void { $this->isChecking = true; $this->errorMessage = null; $this->backoffUntil = null; try { $result = CheckVersionUpdateJob::dispatchSync(); $this->latestVersion = $result['latest_version']; $this->isUpdateAvailable = $result['is_newer']; $this->releaseUrl = Arr::get($result['release_data'] ?? [], 'html_url'); // Handle errors if (isset($result['error'])) { if ($result['error'] === 'rate_limit') { $this->backoffUntil = $result['backoff_until'] ?? null; $this->errorMessage = 'GitHub API rate limit exceeded. Please try again later.'; } elseif ($result['error'] === 'connection_failed') { $this->errorMessage = 'Request timed out or failed to connect to GitHub. Please check your internet connection and try again.'; } elseif ($result['error'] === 'fetch_failed') { $this->errorMessage = 'Failed to fetch update information from GitHub. Please try again later.'; } else { $this->errorMessage = 'An unexpected error occurred while checking for updates. Please try again later.'; } } else { // Reload release notes if we have a new version if ($this->latestVersion) { $this->loadReleaseNotes(); } } } catch (Illuminate\Http\Client\ConnectionException $e) { $this->errorMessage = 'Request timed out or failed to connect to GitHub. Please check your internet connection and try again.'; Log::error('Update check connection failed: '.$e->getMessage()); } catch (Exception $e) { $this->errorMessage = 'Request timed out or failed. Please check your internet connection and try again.'; Log::error('Update check failed: '.$e->getMessage()); } finally { $this->isChecking = false; } } public function updatedPrereleases(): void { $this->updateSettings->prereleases = $this->prereleases; $this->updateSettings->save(); // Clear cache and recheck for updates with new preference Cache::forget('latest_release'); $this->checkForUpdates(); } public function loadReleaseNotes(): void { if (! $this->latestVersion) { return; } $cacheKey = "release_notes_{$this->latestVersion}"; $currentVersionKey = 'release_notes_current_version'; // Check if we have a previous version cached $previousVersion = Cache::get($currentVersionKey); // Clean up old version cache if different if ($previousVersion && $previousVersion !== $this->latestVersion) { Cache::forget("release_notes_{$previousVersion}"); } // Try to get from cache first - always load from cache if available $cachedNotes = Cache::get($cacheKey); if ($cachedNotes) { $this->releaseNotes = $cachedNotes; // Update current version tracker Cache::put($currentVersionKey, $this->latestVersion, 86400); return; } // Fetch release notes if we have a version but no cache // This will fetch on mount if an update is available, or when explicitly checking $githubRepo = config('app.github_repo'); $apiBaseUrl = "https://api.github.com/repos/{$githubRepo}"; try { // Fetch release notes for the specific version with HTML format $response = Http::withHeaders([ 'Accept' => 'application/vnd.github.v3.html+json', ])->timeout(10)->get("{$apiBaseUrl}/releases/tags/{$this->latestVersion}"); if ($response->successful()) { $releaseData = $response->json(); $bodyHtml = Arr::get($releaseData, 'body_html'); if ($bodyHtml) { // Cache for 24 hours Cache::put($cacheKey, $bodyHtml, 86400); $this->releaseNotes = $bodyHtml; } } } catch (Exception $e) { Log::debug('Failed to fetch release notes: '.$e->getMessage()); } // Update current version tracker Cache::put($currentVersionKey, $this->latestVersion, 86400); } } ?>
@include('partials.settings-heading')
@if(config('app.version'))
Current Version {{ config('app.version') }}
Check for Updates
@endif
@if($errorMessage) Error {{ $errorMessage }} @if($backoffUntil)
You can try again after {{ \Carbon\Carbon::createFromTimestamp($backoffUntil)->format('H:i') }}. @endif
@elseif($isUpdateAvailable && $latestVersion) Update Available A newer version {{ $latestVersion }} is available. Update to the latest version for the best experience. @if($releaseNotes)
{!! $releaseNotes !!}
@endif @if($releaseUrl)
View on GitHub
@endif
@elseif($latestVersion && !$isUpdateAvailable) Up to Date You are running the latest version {{ $latestVersion }}. @endif