id('partner') ->path('partner') ->login() ->darkMode(false) ->colors(['primary' => Color::Emerald]) ->tenant(User::class, slugAttribute: 'id') ->discoverResources(in: module_path('Partner', 'Filament/Resources'), for: 'Modules\\Partner\\Filament\\Resources') ->discoverResources(in: module_path('Video', 'Filament/Partner/Resources'), for: 'Modules\\Video\\Filament\\Partner\\Resources') ->discoverPages(in: module_path('Partner', 'Filament/Pages'), for: 'Modules\\Partner\\Filament\\Pages') ->discoverWidgets(in: module_path('Partner', 'Filament/Widgets'), for: 'Modules\\Partner\\Filament\\Widgets') ->renderHook(PanelsRenderHook::BODY_END, fn () => view('video::partials.video-upload-optimizer')) ->plugins([ FilamentStateFusionPlugin::make(), BreezyCore::make() ->myProfile( shouldRegisterNavigation: true, navigationGroup: 'Account', hasAvatars: true, userMenuLabel: 'My Profile', ) ->enableTwoFactorAuthentication() ->enableSanctumTokens(), FilamentDeveloperLoginsPlugin::make() ->enabled(fn (): bool => app()->environment('local')) ->users([ 'Partner (Add Listing)' => 'b@b.com', ]) ->redirectTo(fn (): ?string => self::partnerCreateListingUrl()), self::socialitePlugin(), ]) ->pages([Dashboard::class]) ->middleware([ EncryptCookies::class, AddQueuedCookiesToResponse::class, StartSession::class, ResolveDemoRequest::class, BootstrapAppData::class, AuthenticateSession::class, ShareErrorsFromSession::class, VerifyCsrfToken::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, ]) ->authMiddleware([Authenticate::class]); } private static function socialitePlugin(): FilamentSocialitePlugin { return FilamentSocialitePlugin::make() ->providers(SocialiteProviderResolver::providers()) ->registration(true) ->resolveUserUsing(function (string $provider, SocialiteUserContract $oauthUser): ?User { if (! filled($oauthUser->getEmail())) { return null; } return User::query()->where('email', strtolower(trim((string) $oauthUser->getEmail())))->first(); }) ->createUserUsing(function (string $provider, SocialiteUserContract $oauthUser): User { $email = filled($oauthUser->getEmail()) ? strtolower(trim((string) $oauthUser->getEmail())) : sprintf('%s_%s@social.local', $provider, $oauthUser->getId()); $user = User::query()->firstOrCreate( ['email' => $email], [ 'name' => trim((string) ($oauthUser->getName() ?: $oauthUser->getNickname() ?: ucfirst($provider).' User')), 'password' => Hash::make(Str::random(40)), 'status' => 'active', ], ); if (class_exists(Role::class)) { $partnerRole = Role::firstOrCreate(['name' => 'partner', 'guard_name' => 'web']); $user->syncRoles([$partnerRole->name]); } return $user; }); } private static function partnerCreateListingUrl(): ?string { $partner = User::query()->where('email', 'b@b.com')->first(); if (! $partner) { return null; } return route('filament.partner.resources.listings.create', ['tenant' => $partner->getKey()]); } }