From 66a035dde1198f9b77831301faa606fc490b8ef5 Mon Sep 17 00:00:00 2001 From: ardhikaxx Date: Sun, 14 Jun 2026 19:16:13 +0700 Subject: [PATCH] refactor: use complete AJAX fetch for auth forms without intermediate redirect page --- app/Http/Controllers/AuthController.php | 54 ++++++++++++++++++++--- resources/views/auth/login.blade.php | 45 ++++++++++++++++++- resources/views/auth/register.blade.php | 45 ++++++++++++++++++- resources/views/partials/alerts.blade.php | 16 ------- 4 files changed, 134 insertions(+), 26 deletions(-) diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index ee0697f..8999434 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -27,12 +27,24 @@ public function login(Request $request) ]); if ($validator->fails()) { + if ($request->wantsJson() || $request->ajax()) { + return response()->json([ + 'success' => false, + 'message' => $validator->errors()->first() + ], 422); + } return back()->withErrors($validator)->withInput() ->with('error_title', 'Login Gagal') ->with('error', 'Silakan periksa kembali email atau password Anda.'); } if (! Auth::attempt($request->only('email', 'password'), $request->boolean('remember'))) { + if ($request->wantsJson() || $request->ajax()) { + return response()->json([ + 'success' => false, + 'message' => 'Email atau password tidak valid.' + ], 401); + } return back()->withErrors(['email' => 'Email atau password tidak valid.'])->onlyInput('email') ->with('error_title', 'Login Gagal') ->with('error', 'Kredensial tidak valid.'); @@ -42,12 +54,24 @@ public function login(Request $request) $user = $request->user(); if ($user->hasRole('admin')) { - return back()->with('auth_success', 'Login berhasil sebagai admin.') - ->with('redirect_url', route('admin.dashboard')); + if ($request->wantsJson() || $request->ajax()) { + return response()->json([ + 'success' => true, + 'message' => 'Login berhasil sebagai admin.', + 'redirect_url' => route('admin.dashboard') + ]); + } + return redirect()->route('admin.dashboard')->with('success', 'Login berhasil sebagai admin.'); } - return back()->with('auth_success', 'Login berhasil.') - ->with('redirect_url', route('home')); + if ($request->wantsJson() || $request->ajax()) { + return response()->json([ + 'success' => true, + 'message' => 'Login berhasil.', + 'redirect_url' => route('home') + ]); + } + return redirect()->route('home')->with('success', 'Login berhasil.'); } public function register(Request $request) @@ -60,6 +84,12 @@ public function register(Request $request) ]); if ($validator->fails()) { + if ($request->wantsJson() || $request->ajax()) { + return response()->json([ + 'success' => false, + 'message' => $validator->errors()->first() + ], 422); + } return back()->withErrors($validator) ->withInput() ->with('error_title', 'Registrasi Gagal') @@ -79,9 +109,21 @@ public function register(Request $request) Auth::login($user); $request->session()->regenerate(); - return back()->with('auth_success', 'Registrasi berhasil. Selamat datang!') - ->with('redirect_url', route('home')); + if ($request->wantsJson() || $request->ajax()) { + return response()->json([ + 'success' => true, + 'message' => 'Registrasi berhasil. Selamat datang!', + 'redirect_url' => route('home') + ]); + } + return redirect()->route('home')->with('success', 'Registrasi berhasil. Selamat datang!'); } catch (\Exception $e) { + if ($request->wantsJson() || $request->ajax()) { + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan pada sistem.' + ], 500); + } return back()->withInput() ->with('error_title', 'Registrasi Gagal') ->with('error', 'Terjadi kesalahan pada sistem.'); diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index c4f3c9c..3a80e49 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -88,8 +88,49 @@ return showError('Validasi Gagal', 'Password tidak boleh kosong.'); } - // If all validation passes, submit the form - this.submit(); + // Instead of standard submit, do AJAX fetch + const submitBtn = form.querySelector('button[type="submit"]'); + const originalBtnHtml = submitBtn.innerHTML; + submitBtn.disabled = true; + submitBtn.innerHTML = 'Memproses...'; + + const formData = new FormData(form); + + fetch(form.action, { + method: 'POST', + body: formData, + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'application/json' + } + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + Swal.fire({ + icon: 'success', + title: 'Berhasil!', + text: data.message, + timer: 2000, + timerProgressBar: true, + showConfirmButton: false, + allowOutsideClick: false, + allowEscapeKey: false, + willClose: () => { + window.location.href = data.redirect_url; + } + }); + } else { + submitBtn.disabled = false; + submitBtn.innerHTML = originalBtnHtml; + showError('Login Gagal', data.message || 'Kredensial tidak valid.'); + } + }) + .catch(error => { + submitBtn.disabled = false; + submitBtn.innerHTML = originalBtnHtml; + showError('Error', 'Terjadi kesalahan pada sistem.'); + }); }); } diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index 8be3ca2..82335cc 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -132,8 +132,49 @@ return showError('Validasi Gagal', 'Anda harus menyetujui syarat dan ketentuan.'); } - // If all validation passes, submit the form - this.submit(); + // Instead of standard submit, do AJAX fetch + const submitBtn = form.querySelector('button[type="submit"]'); + const originalBtnHtml = submitBtn.innerHTML; + submitBtn.disabled = true; + submitBtn.innerHTML = 'Memproses...'; + + const formData = new FormData(form); + + fetch(form.action, { + method: 'POST', + body: formData, + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'application/json' + } + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + Swal.fire({ + icon: 'success', + title: 'Berhasil!', + text: data.message, + timer: 2000, + timerProgressBar: true, + showConfirmButton: false, + allowOutsideClick: false, + allowEscapeKey: false, + willClose: () => { + window.location.href = data.redirect_url; + } + }); + } else { + submitBtn.disabled = false; + submitBtn.innerHTML = originalBtnHtml; + showError('Registrasi Gagal', data.message || 'Silakan periksa kembali data Anda.'); + } + }) + .catch(error => { + submitBtn.disabled = false; + submitBtn.innerHTML = originalBtnHtml; + showError('Error', 'Terjadi kesalahan pada sistem.'); + }); }); } diff --git a/resources/views/partials/alerts.blade.php b/resources/views/partials/alerts.blade.php index e8e5baf..082ac3d 100644 --- a/resources/views/partials/alerts.blade.php +++ b/resources/views/partials/alerts.blade.php @@ -1,19 +1,3 @@ -@if (session('auth_success')) - -@endif - @if (session('success'))