|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace App\Filament\Pages\Auth; |
| 4 | + |
| 5 | +use App\Settings\MailSettings; |
| 6 | +use DanHarrin\LivewireRateLimiting\Exceptions\TooManyRequestsException; |
| 7 | +use Exception; |
| 8 | +use Filament\Facades\Filament; |
| 9 | +use Filament\Forms\Form; |
| 10 | +use Filament\Notifications\Auth\ResetPassword as ResetPasswordNotification; |
| 11 | +use Filament\Notifications\Notification; |
| 12 | +use Filament\Pages\Auth\PasswordReset\RequestPasswordReset as BaseRequestPasswordReset; |
| 13 | +use Illuminate\Contracts\Auth\CanResetPassword; |
| 14 | +use Illuminate\Support\Facades\Password; |
| 15 | + |
| 16 | +class RequestPasswordReset extends BaseRequestPasswordReset |
| 17 | +{ |
| 18 | + protected static string $view = 'filament-panels::pages.auth.password-reset.request-password-reset'; |
| 19 | + |
| 20 | + public function form(Form $form): Form |
| 21 | + { |
| 22 | + return $form |
| 23 | + ->schema([ |
| 24 | + $this->getEmailFormComponent()->label('Email'), |
| 25 | + ]); |
| 26 | + } |
| 27 | + |
| 28 | + public function request(): void |
| 29 | + { |
| 30 | + try { |
| 31 | + $this->rateLimit(3); |
| 32 | + } catch (TooManyRequestsException $exception) { |
| 33 | + Notification::make() |
| 34 | + ->title(__('filament-panels::pages/auth/password-reset/request-password-reset.notifications.throttled.title', [ |
| 35 | + 'seconds' => $exception->secondsUntilAvailable, |
| 36 | + 'minutes' => ceil($exception->secondsUntilAvailable / 60), |
| 37 | + ])) |
| 38 | + ->body(array_key_exists('body', __('filament-panels::pages/auth/password-reset/request-password-reset.notifications.throttled') ?: []) ? __('filament-panels::pages/auth/password-reset/request-password-reset.notifications.throttled.body', [ |
| 39 | + 'seconds' => $exception->secondsUntilAvailable, |
| 40 | + 'minutes' => ceil($exception->secondsUntilAvailable / 60), |
| 41 | + ]) : null) |
| 42 | + ->danger() |
| 43 | + ->send(); |
| 44 | + |
| 45 | + return; |
| 46 | + } |
| 47 | + |
| 48 | + $data = $this->form->getState(); |
| 49 | + |
| 50 | + $status = Password::broker(Filament::getAuthPasswordBroker())->sendResetLink( |
| 51 | + $data, |
| 52 | + function (CanResetPassword $user, string $token): void { |
| 53 | + if (! method_exists($user, 'notify')) { |
| 54 | + $userClass = $user::class; |
| 55 | + |
| 56 | + throw new Exception("Model [{$userClass}] does not have a [notify()] method."); |
| 57 | + } |
| 58 | + |
| 59 | + $settings = app(MailSettings::class); |
| 60 | + $notification = new ResetPasswordNotification($token); |
| 61 | + $notification->url = Filament::getResetPasswordUrl($token, $user); |
| 62 | + |
| 63 | + $settings->loadMailSettingsToConfig(); |
| 64 | + |
| 65 | + $user->notify($notification); |
| 66 | + }, |
| 67 | + ); |
| 68 | + |
| 69 | + if ($status !== Password::RESET_LINK_SENT) { |
| 70 | + Notification::make() |
| 71 | + ->title(__($status)) |
| 72 | + ->danger() |
| 73 | + ->send(); |
| 74 | + |
| 75 | + return; |
| 76 | + } |
| 77 | + |
| 78 | + Notification::make() |
| 79 | + ->title(__($status)) |
| 80 | + ->success() |
| 81 | + ->send(); |
| 82 | + |
| 83 | + $this->form->fill(); |
| 84 | + } |
| 85 | +} |
0 commit comments