Skip to content

Commit 3a404ad

Browse files
committed
feat: add custom reset password
1 parent 73d3b65 commit 3a404ad

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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+
}

app/Providers/Filament/AdminPanelProvider.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function panel(Panel $panel): Panel
3232
->id('admin')
3333
->path('admin')
3434
->login(Login::class)
35-
->passwordReset()
35+
->passwordReset(RequestPasswordReset::class)
3636
->emailVerification(EmailVerification::class)
3737
->favicon(fn (GeneralSettings $settings) => Storage::url($settings->site_favicon))
3838
->brandName(fn (GeneralSettings $settings) => $settings->brand_name)

0 commit comments

Comments
 (0)