parfum/app/Livewire/Auth/Login.php
2025-12-03 21:08:41 +07:00

113 lines
2.7 KiB
PHP

<?php
namespace App\Livewire\Auth;
use App\Enums\UserStatus;
use App\Traits\WithToast;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Validate;
use Livewire\Component;
#[Layout('components.layouts.auth', [
'title' => 'Masuk Akun',
])]
class Login extends Component
{
use WithToast;
#[Validate(['required', 'string'], attribute: 'nama pengguna atau email')]
public string $login = '';
#[Validate('required', attribute: 'kata sandi')]
public string $password = '';
public function mount()
{
if (! request()->has('message')) {
return;
}
$this->toast(request('message'));
$this->js(<<<'JS'
const url = new URL(window.location);
url.search = '';
window.history.replaceState({}, '', url);
JS);
}
public function auth()
{
$this->validate();
if (! $this->attemptLogin()) {
$this->toast('Oops! Nama pengguna, email, atau kata sandi tidak sesuai.', 'Gagal', 'danger');
return;
}
$user = auth()->user();
if (! $this->userIsActive($user)) {
auth()->logout();
$this->toast(
'Akun Anda belum aktif. Mohon periksa email untuk mengaktifkan akun, dan hubungi kami jika memerlukan bantuan lebih lanjut.',
'Gagal',
'danger'
);
return;
}
session()->regenerate();
$this->toast('Hai, '.($user?->employee?->full_name ?? $user->name).'! Semoga harimu menyenangkan 😊');
$this->redirectByRole($user->roles->pluck('name')->toArray());
}
protected function attemptLogin()
{
$field = filter_var($this->login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
return auth()->attempt([
$field => $this->login,
'password' => $this->password,
]);
}
protected function userIsActive($user)
{
return $user?->status === UserStatus::ACTIVE;
}
protected function redirectByRole(array $roles)
{
if (array_intersect($roles, ['Developer', 'Owner', 'Leader', 'Admin'])) {
$this->redirectIntended('/studio/dashboard/overview', navigate: true);
return;
}
if (in_array('Partner', $roles, true)) {
$this->redirectIntended('/partner/overview', navigate: true);
return;
}
if (in_array('Customer', $roles, true)) {
$this->redirectIntended('/member/overview', navigate: true);
return;
}
$this->redirectIntended('/login', navigate: true);
}
public function render()
{
return view('livewire.auth.login');
}
}