registerCreditsNavigation(); } public function enabled(): void {} public function disabled(): void {} public function updated(): void {} public function install(): void {} private function registerCreditsNavigation(): void { try { // Register the view namespace View::addNamespace('creditsplus', __DIR__ . '/resources/views'); // Store reference to this instance for use in closure $extension = $this; $extensionPath = __DIR__; // Use view composer to add credits data to navigation View::composer('components.navigation.index', function ($view) use ($extension, $extensionPath) { try { // Don't run in admin panel - this is crucial to avoid conflicts if (app()->runningInConsole()) { return; } // Check if we're in admin context $currentPath = request()->path(); if (str_starts_with($currentPath, 'admin') || str_contains($currentPath, '/admin/')) { return; } // Don't run for API routes if (str_starts_with($currentPath, 'api')) { return; } if (!Auth::check()) { return; } // Only show credits if the feature is enabled if (!config('settings.credits_enabled', false)) { return; } $user = Auth::user(); $creditsDisplay = $extension->calculateUserCreditsDisplay($user); // Determine logo path using storage_url helper if available $logoHtml = ''; if (config('settings.logo')) { $logoUrl = function_exists('storage_url') ? storage_url(config('settings.logo')) : Storage::url(config('settings.logo')); $logoHtml = '' . e(config('app.name')) . ''; } // Inject credits data, logo HTML, and credits URL into the view $creditsUrlPath = '#'; try { if (function_exists('route')) { $creditsUrlPath = route('account.credits'); } } catch (\Exception $e) { $creditsUrlPath = '/account/credits'; } $view->with([ 'userCreditsDisplay' => $creditsDisplay, 'creditsLogoHtml' => $logoHtml, 'creditsUrl' => $creditsUrlPath, ]); // Replace the view path with our custom navigation $customPath = $extensionPath . '/resources/views/components/navigation/index.blade.php'; if (file_exists($customPath)) { $view->setPath($customPath); } } catch (\Exception $e) { // Silently fail } }); } catch (\Exception $e) { // Silently fail } } public function calculateUserCreditsDisplay($user): string { try { // Check if the credits relationship exists if (!method_exists($user, 'credits')) { return $this->getDefaultCurrencyDisplay(); } $credits = $user->credits()->with('currency')->get(); if ($credits->isEmpty()) { return $this->getDefaultCurrencyDisplay(); } $creditsByCurrency = $credits->groupBy('currency_code'); $maxAmount = null; $maxCurrencyCode = null; $maxCurrency = null; foreach ($creditsByCurrency as $currencyCode => $userCredits) { $totalAmount = $userCredits->sum('amount'); if ($totalAmount <= 0) { continue; } if ($maxAmount === null || $totalAmount > $maxAmount) { $maxAmount = $totalAmount; $maxCurrencyCode = $currencyCode; $maxCurrency = $userCredits->first()->currency ?? null; } } if ($maxAmount === null) { return $this->getDefaultCurrencyDisplay(); } if ($maxCurrency && isset($maxCurrency->prefix) && isset($maxCurrency->suffix)) { return $maxCurrency->prefix . number_format($maxAmount, 2) . $maxCurrency->suffix; } else { return number_format($maxAmount, 2) . ' ' . ($maxCurrencyCode ?? ''); } } catch (\Exception $e) { return $this->getDefaultCurrencyDisplay(); } } /** * Get default currency display (0.00 with currency symbol) */ private function getDefaultCurrencyDisplay(): string { try { $currencyCode = session('currency', config('settings.default_currency', 'USD')); if (class_exists('\App\Models\Currency')) { $currency = \App\Models\Currency::where('code', $currencyCode)->first(); if ($currency && isset($currency->prefix) && isset($currency->suffix)) { return $currency->prefix . '0.00' . $currency->suffix; } } return '0.00 ' . $currencyCode; } catch (\Exception $e) { return '0.00 USD'; } } }