Projects
HoteF - Booking Hotel
Fullstack
⭐ Featured
HoteF - Booking Hotel
HoteF- Booking Hotel, Aplikasi pemesanan hotel berbasis web untuk mencari kamar dan memesan secara online dengan pembayaran real via Midtrans Snap. Sistem ini memisahkan peran user (tamu) dan admin (pengelola hotel), dengan alur pemesanan dari browsing kamar hingga konfirmasi pembayaran.
About This Project
Framework = Next.js 16.3.5 (App Router, Server Components)
Frontend = React 19, TypeScript (strict)
Styling = Tailwind CSS v4 (@theme di app/globals.css)
Database = PostgreSQL (Neon) via Prisma 7 + @prisma/adapter-pg
Auth = NextAuth v5 (Google OAuth, JWT strategy, role-based)
Payment gateway = Midtrans Snap (sandbox)
File storage = Vercel Blob (upload gambar kamar)
Validation & forms = zod, Server Actions (useActionState)
Icons & utility = react-icons, clsx, date-fns, react-datepicker
HALAMAN PUBLIK (TANPA LOGIN):
Home = Hero section, daftar kamar featured, CTA ke katalog
Rooms = Daftar kamar dengan pagination dan pencarian nama
Room Detail = Galeri gambar, harga/malam, deskripsi, fasilitas kamar, date-picker dengan tanggal terpesan/batal, form booking
About = Informasi hotel
Contact = Form kirim pesan ke database untuk dibaca admin
Login = Login Google OAuth (tanpa register manual)
USER (LOGIN REQUIRED)
Booking = Pilih tanggal inap, validasi zod, cek kamar kosong (overlap) dalam $transaction, harga di-snapshot dari DB
Checkout = Ringkasan reservasi + kwitansi, tombol bayar memanggil Snap (window.snap.pay)
My Reservation = Daftar reservasi dengan badge status, pagination, aksi Bayar/Lihat Detail
Reservation Detail = Kwitansi lengkap (ID, tamu, kamar, durasi, total, metode & status bayar)
Cancel = Batalkan reservasi yang belum lunas (status cancelled) dengan konfirmasi
ADMIN (ROLE ADMIN)
Dashboard = Statistik (total reservasi, kamar, pendapatan, pengguna) + tabel reservasi + search
Manage Room = CRUD kamar (nama, deskripsi, harga, kapasitas, gambar via Vercel Blob, multi-amenities), search + pagination
Manage Amenities = CRUD fasilitas — ditolak jika masih dipakai kamar
Manage Contact = Daftar pesan dari form contact, modal detail, hapus, search + pagination
KELEBIHAN PROJECT
1. Anti double-booking — Cek kamar kosong (overlap) dilakukan dalam satu $transaction Prisma sehingga dua pemesanan serentak tidak bisa bentrok.
2. Anti-tamper harga — Harga booking diambil dari database, bukan dari client; total pembayaran selalu konsisten.
3. Payment gateway real — Integrasi Midtrans Snap (sandbox): token di-cache di DB (TTL 10 menit), webhook dengan signature SHA512 + timingSafeEqual + guard replay.
Role-based access — proxy.ts + authorized callback: /reservation & /checkout wajib login, /admin/* wajib role === "admin", data user hanya bisa diakses pemiliknya.
4. Snapshot reservasi — Kwitansi tetap akurat meskipun kamar diedit/dihapus (kamar soft-relation via snapshot harga).
5. UI konsisten Bahasa Indonesia — Kartu putih rounded-2xl, primary orange #f97316, format rupiah toLocaleString('id-ID'), badge status berwarna di semua halaman.
7. Admin lengkap — CRUD kamar dengan upload gambar (Vercel Blob) & multi-amenities, guard relasi (fasilitas terpakai tidak bisa dihapus), search + pagination di semua tabel.
8. Date-picker pintar — Tanggal yang sudah terpesan/gagal/batal dikeluarkan dari kalender, mencegah bentrok sejak di UI.
Technologies Used
Tailwind
Node.js
TypeScript
Git
Next.js