123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- <?php
-
- namespace App\Livewire;
-
- use Filament\Facades\Filament;
- use Filament\Forms;
- use Filament\Forms\Concerns\InteractsWithForms;
- use Filament\Forms\Contracts\HasForms;
- use Filament\Forms\Form;
- use Filament\Notifications\Notification;
- use Filament\Support\Exceptions\Halt;
- use Illuminate\Contracts\Auth\Authenticatable;
- use Illuminate\Contracts\View\View;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Support\Facades\Hash;
- use Illuminate\Validation\Rules\Password;
- use Livewire\Component;
- use RuntimeException;
-
- /**
- * @property Form $form
- */
- class UpdatePassword extends Component implements HasForms
- {
- use InteractsWithForms;
-
- /**
- * @var array<string, mixed> | null
- */
- public ?array $data = [];
-
- public function mount(): void
- {
- $this->fillForm();
- }
-
- public function getUser(): Authenticatable | Model
- {
- $user = Filament::auth()->user();
-
- if (! $user instanceof Model) {
- throw new RuntimeException('The authenticated user object must be an Eloquent model to allow profile information to be updated.');
- }
-
- return $user;
- }
-
- public function fillForm(): void
- {
- $data = $this->getUser()->attributesToArray();
-
- $data = $this->mutateFormDataBeforeFill($data);
-
- $this->form->fill($data);
- }
-
- /**
- * @param array<string, mixed> $data
- * @return array<string, mixed>
- */
- protected function mutateFormDataBeforeFill(array $data): array
- {
- return $data;
- }
-
- /**
- * @param array<string, mixed> $data
- * @return array<string, mixed>
- */
- protected function mutateFormDataBeforeSave(array $data): array
- {
- return $data;
- }
-
- public function save(): void
- {
- try {
- $data = $this->form->getState();
-
- $data = $this->mutateFormDataBeforeSave($data);
-
- $this->handleRecordUpdate($this->getUser(), $data);
- } catch (Halt $exception) {
- return;
- }
-
- if (session() !== null) {
- session()->put([
- 'password_hash_' . Filament::getAuthGuard() => Filament::auth()->user()?->getAuthPassword(),
- ]);
- }
-
- $this->getSavedNotification()?->send();
-
- $this->fillForm();
- }
-
- /**
- * @param array<string, mixed> $data
- */
- protected function handleRecordUpdate(Model $record, array $data): Model
- {
- $record->update($data);
-
- return $record;
- }
-
- protected function getSavedNotification(): ?Notification
- {
- $title = $this->getSavedNotificationTitle();
-
- if (blank($title)) {
- return null;
- }
-
- return Notification::make()
- ->success()
- ->title($this->getSavedNotificationTitle())
- ->body($this->getSavedNotificationBody());
- }
-
- protected function getSavedNotificationTitle(): ?string
- {
- return __('filament-companies::default.notifications.profile_information_updated.title');
- }
-
- protected function getSavedNotificationBody(): ?string
- {
- return __('filament-companies::default.notifications.profile_information_updated.body');
- }
-
- public function form(Form $form): Form
- {
- return $form
- ->schema([
- Forms\Components\TextInput::make('current_password')
- ->label(__('filament-companies::default.fields.current_password'))
- ->password()
- ->currentPassword()
- ->revealable()
- ->validationMessages([
- 'current_password' => __('filament-companies::default.errors.password_does_not_match'),
- ])
- ->autocomplete('current-password')
- ->required(),
- Forms\Components\TextInput::make('password')
- ->label(__('filament-companies::default.labels.new_password'))
- ->password()
- ->revealable()
- ->autocomplete('new-password')
- ->rule(Password::default())
- ->required()
- ->dehydrated(static fn ($state): bool => filled($state))
- ->dehydrateStateUsing(static fn ($state): string => Hash::make($state))
- ->same('password_confirmation'),
- Forms\Components\TextInput::make('password_confirmation')
- ->label(__('filament-companies::default.labels.password_confirmation'))
- ->password()
- ->revealable()
- ->autocomplete('new-password')
- ->required()
- ->dehydrated(false),
- ])
- ->operation('edit')
- ->model($this->getUser())
- ->statePath('data');
- }
-
- public function render(): View
- {
- return view('livewire.update-password-form');
- }
- }
|