40087-vm/auth.php
2026-05-26 08:29:37 +00:00

240 lines
15 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/store.php';
$mode = (string)($_GET['mode'] ?? 'login');
if ($mode !== 'register') {
$mode = 'login';
}
$redirectTo = store_safe_redirect((string)($_REQUEST['redirect_to'] ?? 'auth.php'), 'auth.php');
$loginForm = ['email' => ''];
$registerForm = ['full_name' => '', 'email' => ''];
$loginErrors = [];
$registerErrors = [];
$loginMessage = '';
$registerMessage = '';
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
$action = (string)($_POST['action'] ?? '');
if ($action === 'login') {
$result = store_login_user($_POST);
if (!empty($result['success'])) {
store_flash('success', (string)($result['message'] ?? 'Login berhasil.'));
header('Location: ' . $redirectTo);
exit;
}
$mode = 'login';
$loginForm = $result['form'] ?? $loginForm;
$loginErrors = $result['errors'] ?? [];
$loginMessage = (string)($result['message'] ?? 'Login belum berhasil diproses.');
}
if ($action === 'register') {
$result = store_register_user($_POST);
if (!empty($result['success'])) {
store_flash('success', (string)($result['message'] ?? 'Akun berhasil dibuat.'));
header('Location: ' . $redirectTo);
exit;
}
$mode = 'register';
$registerForm = $result['form'] ?? $registerForm;
$registerErrors = $result['errors'] ?? [];
$registerMessage = (string)($result['message'] ?? 'Pendaftaran belum berhasil diproses.');
}
}
$currentUser = store_current_user();
$summary = store_cart_summary();
$categories = store_categories();
$accountTitle = $currentUser ? 'Akun Saya' : 'Login / Register';
$accountDescription = $currentUser
? 'Ringkasan akun user untuk melanjutkan belanja, checkout, dan melacak pesanan.'
: 'Halaman login dan registrasi user untuk masuk ke sistem menggunakan email dan password.';
store_page_start($accountTitle, $accountDescription, ['noindex' => true]);
?>
<section class="section-block pt-0">
<div class="section-heading mb-4">
<span class="eyebrow">Login User</span>
<h1 class="section-title">
<?= $currentUser ? 'Akun user aktif dan siap dipakai.' : 'Tampilan login digunakan oleh pengguna yang telah terdaftar untuk masuk ke dalam sistem.' ?>
</h1>
<p class="section-copy mb-0">
<?= $currentUser
? 'Anda sudah login. Gunakan halaman ini untuk kembali ke katalog, membuka keranjang, atau melacak status pesanan.'
: 'Masukkan email dan password pada form login, atau buat akun baru melalui form registrasi agar data pengguna tersimpan lebih rapi.' ?>
</p>
</div>
<div class="row g-4 align-items-start">
<div class="col-lg-4">
<aside class="auth-sidebar">
<div class="auth-side-card">
<div class="card-kicker">Kategori Menu</div>
<ul class="sidebar-link-list mb-0">
<?php foreach ($categories as $key => $category): ?>
<?php if ($key === 'all') continue; ?>
<li>
<a href="index.php?category=<?= h($key) ?>#catalog">
<strong><?= h($category['label']) ?></strong>
<span><?= h($category['description']) ?></span>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
<div class="auth-side-card">
<div class="card-kicker">Keranjang Belanja</div>
<div class="sidebar-metric"><?= h((string)store_cart_count()) ?></div>
<p class="mb-3 text-muted">Item yang sudah dipilih tetap tersimpan dan bisa dilanjutkan ke checkout kapan saja.</p>
<a class="btn btn-outline-secondary w-100" href="cart.php">Buka keranjang</a>
</div>
<div class="auth-side-card">
<div class="card-kicker">Info Pembayaran</div>
<ul class="list-clean compact-list mb-0">
<li><span class="list-index">1</span><span>Pilih metode pembayaran saat checkout.</span></li>
<li><span class="list-index">2</span><span>Simpan order number untuk pelacakan status.</span></li>
<li><span class="list-index">3</span><span>Siapkan bukti pembayaran jika metode bayar memerlukannya.</span></li>
</ul>
</div>
</aside>
</div>
<div class="col-lg-8">
<?php if ($currentUser): ?>
<section class="surface-panel auth-shell">
<div class="auth-state-chip">Login aktif</div>
<h2 class="summary-title mb-2">Halo, <?= h(store_user_first_name((string)$currentUser['full_name'])) ?>.</h2>
<p class="section-copy mb-4">Akun Anda sudah tersimpan di sesi browser ini dan siap digunakan untuk melanjutkan aktivitas belanja.</p>
<div class="row g-3 mb-4">
<div class="col-md-6">
<div class="account-stat">
<span class="account-stat__label">Nama pengguna</span>
<strong><?= h((string)$currentUser['full_name']) ?></strong>
</div>
</div>
<div class="col-md-6">
<div class="account-stat">
<span class="account-stat__label">Email login</span>
<strong><?= h((string)$currentUser['email']) ?></strong>
</div>
</div>
<div class="col-md-6">
<div class="account-stat">
<span class="account-stat__label">Item di keranjang</span>
<strong><?= h((string)store_cart_count()) ?> produk</strong>
</div>
</div>
<div class="col-md-6">
<div class="account-stat">
<span class="account-stat__label">Total sementara</span>
<strong><?= h(store_money((float)$summary['grand_total'])) ?></strong>
</div>
</div>
</div>
<div class="d-flex flex-wrap gap-2">
<a class="btn btn-dark" href="index.php#catalog">Lanjut belanja</a>
<a class="btn btn-outline-secondary" href="cart.php">Buka keranjang</a>
<a class="btn btn-outline-secondary" href="order_status.php">Lacak pesanan</a>
<a class="btn btn-outline-secondary" href="logout.php">Logout</a>
</div>
</section>
<?php else: ?>
<section class="surface-panel auth-shell">
<div class="auth-toggle mb-4">
<a class="toggle-pill<?= $mode === 'login' ? ' is-active' : '' ?>" href="auth.php?mode=login<?= $redirectTo !== 'auth.php' ? '&amp;redirect_to=' . urlencode($redirectTo) : '' ?>">Login</a>
<a class="toggle-pill<?= $mode === 'register' ? ' is-active' : '' ?>" href="auth.php?mode=register<?= $redirectTo !== 'auth.php' ? '&amp;redirect_to=' . urlencode($redirectTo) : '' ?>">Register</a>
</div>
<div class="row g-4">
<div class="col-xl-6">
<article class="auth-panel<?= $mode === 'login' ? ' auth-panel--active' : '' ?>">
<div class="auth-panel__head">
<div>
<div class="card-kicker">Login User</div>
<h2 class="h4 mb-1">Masuk dengan email dan password</h2>
</div>
</div>
<p class="text-muted mb-4">Gunakan akun yang sudah terdaftar untuk mengakses alur pemesanan dengan lebih cepat.</p>
<?php if ($loginMessage !== ''): ?>
<div class="alert alert-warning border-0 shadow-sm" role="alert"><?= h($loginMessage) ?></div>
<?php endif; ?>
<form action="auth.php?mode=login" method="post" class="d-grid gap-3" data-auto-disable>
<input type="hidden" name="action" value="login">
<input type="hidden" name="redirect_to" value="<?= h($redirectTo) ?>">
<div>
<label class="form-label" for="login_email">Email</label>
<input id="login_email" name="email" type="email" class="form-control<?= store_input_class($loginErrors, 'email') ?>" value="<?= h((string)($loginForm['email'] ?? '')) ?>" autocomplete="username" placeholder="nama@email.com" required>
<?php if (!empty($loginErrors['email'])): ?><div class="invalid-feedback"><?= h((string)$loginErrors['email']) ?></div><?php endif; ?>
</div>
<div>
<label class="form-label" for="login_password">Password</label>
<input id="login_password" name="password" type="password" class="form-control<?= store_input_class($loginErrors, 'password') ?>" autocomplete="current-password" placeholder="Minimal 8 karakter" required>
<?php if (!empty($loginErrors['password'])): ?><div class="invalid-feedback"><?= h((string)$loginErrors['password']) ?></div><?php endif; ?>
</div>
<button class="btn btn-dark" type="submit">Login</button>
</form>
<p class="auth-note mb-0">Belum punya akun? <a href="auth.php?mode=register<?= $redirectTo !== 'auth.php' ? '&amp;redirect_to=' . urlencode($redirectTo) : '' ?>">Buat akun sekarang</a>.</p>
</article>
</div>
<div class="col-xl-6">
<article class="auth-panel<?= $mode === 'register' ? ' auth-panel--active' : '' ?>">
<div class="auth-panel__head">
<div>
<div class="card-kicker">Register</div>
<h2 class="h4 mb-1">Daftarkan akun pengguna</h2>
</div>
</div>
<p class="text-muted mb-4">Setelah registrasi berhasil, akun akan langsung aktif pada sesi browser ini.</p>
<?php if ($registerMessage !== ''): ?>
<div class="alert alert-warning border-0 shadow-sm" role="alert"><?= h($registerMessage) ?></div>
<?php endif; ?>
<form action="auth.php?mode=register" method="post" class="d-grid gap-3" data-auto-disable>
<input type="hidden" name="action" value="register">
<input type="hidden" name="redirect_to" value="<?= h($redirectTo) ?>">
<div>
<label class="form-label" for="register_full_name">Nama lengkap</label>
<input id="register_full_name" name="full_name" type="text" class="form-control<?= store_input_class($registerErrors, 'full_name') ?>" value="<?= h((string)($registerForm['full_name'] ?? '')) ?>" maxlength="120" autocomplete="name" placeholder="Nama lengkap pengguna" required>
<?php if (!empty($registerErrors['full_name'])): ?><div class="invalid-feedback"><?= h((string)$registerErrors['full_name']) ?></div><?php endif; ?>
</div>
<div>
<label class="form-label" for="register_email">Email</label>
<input id="register_email" name="email" type="email" class="form-control<?= store_input_class($registerErrors, 'email') ?>" value="<?= h((string)($registerForm['email'] ?? '')) ?>" maxlength="160" autocomplete="username" placeholder="nama@email.com" required>
<?php if (!empty($registerErrors['email'])): ?><div class="invalid-feedback"><?= h((string)$registerErrors['email']) ?></div><?php endif; ?>
</div>
<div>
<label class="form-label" for="register_password">Password</label>
<input id="register_password" name="password" type="password" class="form-control<?= store_input_class($registerErrors, 'password') ?>" minlength="8" autocomplete="new-password" placeholder="Minimal 8 karakter" required>
<?php if (!empty($registerErrors['password'])): ?><div class="invalid-feedback"><?= h((string)$registerErrors['password']) ?></div><?php endif; ?>
</div>
<div>
<label class="form-label" for="register_confirm_password">Konfirmasi password</label>
<input id="register_confirm_password" name="confirm_password" type="password" class="form-control<?= store_input_class($registerErrors, 'confirm_password') ?>" minlength="8" autocomplete="new-password" placeholder="Ulangi password" required>
<?php if (!empty($registerErrors['confirm_password'])): ?><div class="invalid-feedback"><?= h((string)$registerErrors['confirm_password']) ?></div><?php endif; ?>
</div>
<button class="btn btn-dark" type="submit">Buat akun</button>
</form>
</article>
</div>
</div>
</section>
<?php endif; ?>
</div>
</div>
</section>
<?php store_page_end(); ?>