diff --git a/config/frontend-panel.php b/config/frontend-panel.php index 3ac44ad..b5e2ce1 100644 --- a/config/frontend-panel.php +++ b/config/frontend-panel.php @@ -1,5 +1,15 @@ (bool) env('FRONTEND_GUEST_ACCESS', true), ]; diff --git a/resources/views/filament/components/theme-switcher.blade.php b/resources/views/filament/components/theme-switcher.blade.php new file mode 100644 index 0000000..e665e32 --- /dev/null +++ b/resources/views/filament/components/theme-switcher.blade.php @@ -0,0 +1,25 @@ +@php + $panel = filament()->getCurrentPanel(); + $panelID = $panel ? $panel->getId() : 'null'; +@endphp + +
+ + + +
\ No newline at end of file diff --git a/resources/views/filament/pages/home.blade.php b/resources/views/filament/pages/home.blade.php new file mode 100644 index 0000000..431a83b --- /dev/null +++ b/resources/views/filament/pages/home.blade.php @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/Filament/Pages/Home.php b/src/Filament/Pages/Home.php new file mode 100644 index 0000000..0fe22fa --- /dev/null +++ b/src/Filament/Pages/Home.php @@ -0,0 +1,24 @@ +name(static::$name) ->hasConfigFile() - ->hasTranslations(); + ->hasTranslations() + ->hasViews(); } public function register(): self diff --git a/src/Providers/FrontendPanelProvider.php b/src/Providers/FrontendPanelProvider.php index 5c6d649..3915c12 100644 --- a/src/Providers/FrontendPanelProvider.php +++ b/src/Providers/FrontendPanelProvider.php @@ -5,6 +5,7 @@ use Eclipse\Common\Providers\GlobalSearchProvider; use Eclipse\Core\Models\Site; use Eclipse\Core\Services\Registry; +use Eclipse\Frontend\Filament\Pages as CustomPages; use Filament\Http\Middleware\Authenticate; use Filament\Http\Middleware\AuthenticateSession; use Filament\Http\Middleware\DisableBladeIconComponents; @@ -15,6 +16,7 @@ use Filament\Support\Colors\Color; use Filament\Support\Enums\Platform; use Filament\Support\Facades\FilamentView; +use Filament\View\PanelsRenderHook; use Filament\Widgets; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; @@ -27,44 +29,23 @@ class FrontendPanelProvider extends PanelProvider { + private const PANEL_ID = 'frontend'; + public function panel(Panel $panel): Panel { - return $panel - ->id('frontend') + $panel = $panel + ->id(self::PANEL_ID) ->path('') - ->login() - ->passwordReset() - ->emailVerification() ->colors([ 'primary' => Color::Cyan, 'gray' => Color::Slate, ]) + ->authGuard(self::PANEL_ID) ->topNavigation() ->brandName(fn () => Registry::getSite()->name) ->discoverResources(in: app_path('Filament/Frontend/Resources'), for: 'App\\Filament\\Frontend\\Resources') ->discoverPages(in: app_path('Filament/Frontend/Pages'), for: 'App\\Filament\\Frontend\\Pages') - ->pages([ - Pages\Dashboard::class, - ]) ->discoverWidgets(in: app_path('Filament/Frontend/Widgets'), for: 'App\\Filament\\Frontend\\Widgets') - ->widgets([ - Widgets\AccountWidget::class, - Widgets\FilamentInfoWidget::class, - ]) - ->middleware([ - EncryptCookies::class, - AddQueuedCookiesToResponse::class, - StartSession::class, - AuthenticateSession::class, - ShareErrorsFromSession::class, - VerifyCsrfToken::class, - SubstituteBindings::class, - DisableBladeIconComponents::class, - DispatchServingFilamentEvent::class, - ]) - ->authMiddleware([ - Authenticate::class, - ]) ->globalSearch(GlobalSearchProvider::class) ->globalSearchKeyBindings(['ctrl+k', 'command+k']) ->globalSearchFieldSuffix(fn (): ?string => match (Platform::detect()) { @@ -72,18 +53,87 @@ public function panel(Panel $panel): Panel Platform::Mac => '⌘K', default => null, }) - ->tenant(Site::class, slugAttribute: 'domain') - ->tenantDomain('{tenant:domain}') - ->tenantMenu(false) ->plugins([ EnvironmentIndicatorPlugin::make(), ]); + + $middleware = [ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + ShareErrorsFromSession::class, + VerifyCsrfToken::class, + SubstituteBindings::class, + DisableBladeIconComponents::class, + DispatchServingFilamentEvent::class, + ]; + + $middleware = match (self::isGuestPanel()) { + true => $middleware, + false => array_merge($middleware, [ + AuthenticateSession::class, + ]) + }; + + match (self::isGuestPanel()) { + true => $panel + ->pages([ + CustomPages\Home::class, + ]) + ->widgets([]) + ->middleware($middleware) + ->renderHook( + PanelsRenderHook::TOPBAR_END, + fn () => view('frontend-panel::filament.components.theme-switcher') + ), + false => $panel->login() + ->passwordReset() + ->emailVerification() + ->pages([ + Pages\Dashboard::class, + ]) + ->widgets([ + Widgets\AccountWidget::class, + Widgets\FilamentInfoWidget::class, + ]) + ->middleware($middleware) + ->authMiddleware([ + Authenticate::class, + ]) + ->tenant(Site::class, slugAttribute: 'domain') + ->tenantDomain('{tenant:domain}') + ->tenantMenu(false) + ->renderHook( + PanelsRenderHook::HEAD_START, + fn (): string => self::getThemeIsolationScript(self::PANEL_ID) + ) + }; + + return $panel; } public function register(): void { parent::register(); - FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')")); } + + private static function getThemeIsolationScript(string $panelId): string + { + return ""; + } + + private static function isGuestPanel(): bool + { + return config('frontend-panel.guest_access'); + } }