changes / web

MPC Web — Version Changelog

Versi aktif berikutnya: v0.10 (current v0.9). Chat sama → jangan bump, update bullet saja.

Independen dari app lain. Indeks: mpc-dev/docs/versions/README.md.


v0.9 — 2026-08-20

  • /otp: hapus hint demo 1234; copy tenang bahwa kode 4 digit dikirim ke email dan berlaku 10 menit (selaras OTP email nyata di mpc-be).

v0.8 — 2026-08-15

  • UI /notifications (parity Android/iOS): kartu tenang tanpa aksen agresif, unread dot primer, Mark all read, loading/empty elegan.
  • Tanggal notifikasi hari ini: relatif (Just now / 10 minutes ago / 1 hour ago); ticker 30 detik supaya label tidak stuck saat halaman tetap terbuka.

v0.7 — 2026-08-13

  • Resto reservations (parity Android v1.17): halaman /resto — intro "Dine at the Club", kartu space dari GET /spaces urut display_order (foto/placeholder elegan, label "Private room"/"Dining area", "Up to N guests", "Minimum spend Rp X"), quiet link "Order food & drinks" → /book?step=addons.
  • Flow reservasi /resto/reserve?id=: date picker forward-only, guests stepper 1..max_party_pax + note "For larger groups, please contact us.", grid slot 30-menit dari availability API dengan copy "N-minute seating" (slot penuh disabled), konfirmasi (space/date/time/guests + note minimum spend "settled through food & beverage purchases at the venue") → POST /spaces/reservations → success state dengan kode reservasi; error 400/409 ditampilkan sopan + slots di-refresh.
  • History: segmented filter Courts / Resto; list Resto dari GET /spaces/reservations/me (space, tanggal, jam, guests, badge status, minimum spend) + Cancel dengan konfirmasi hanya untuk Confirmed + future + source ≠ CourtBundle.
  • Court detail: callout "Includes Private VIP Room — {name}" + "Minimum spend Rp X applies, settled through F&B." bila bundled_space ada; model Court + bundledSpace.
  • Nav: link "Resto" di header + quick action "Resto" di home.
  • API client: getSpaces, getSpaceAvailability, createSpaceReservation, getMySpaceReservations, cancelSpaceReservation; helper src/lib/resto/space.ts.
  • Court detail: copy callout VIP room disesuaikan bundling best-effort — "Included when the room is available for your slot".
  • /resto: hapus quiet link "Order food & drinks" — order F&B hanya ditawarkan setelah reservasi berhasil (link "Order food & drinks" di success state /resto/reserve).
  • Resto flow reorder + pre-order menu terikat reservasi (parity Android v1.17 / iOS v1.6): pilih tanggal dipindah ke landing /resto (di atas daftar space, plus section "Your reservations" quiet reminder → link "See all" ke /history?tab=resto); /resto/reserve?id=&date= cuma tanya guests → time (tanggal dibawa dari landing, bukan dipilih ulang); copy "No minimum spend" saat space/reservasi tidak punya minimum spend.
  • Success state reservasi: CTA "Order food & drinks" ("You can also select your food & drinks now for your reservation.") + "Maybe later" → halaman baru /resto/order?reservationId= (katalog F&B standalone, checkout ditag space_reservation_id, tanpa court booking, langsung ke /payment).
  • Schema: transactions.space_reservation_id (migration 021) menautkan pre-order F&B ke reservasi; GET /spaces/reservations/me sertakan orders[]; History Resto tampilkan pesanan menu yang terikat di bawah detail reservasi (bukan entri terpisah) via ReservationOrdersSummary.
  • useCheckout: state baru spaceReservationId (di-set/reset via pre-order flow, dikirim sebagai space_reservation_id saat POST /orders); guard pembayaran & syarat pick-up time F&B kini mengizinkan checkout tanpa court booking saat ada spaceReservationId.
  • Infra baru "pay existing invoice" di useCheckout (existingTransactionId/existingInvoiceLabel/existingInvoiceAmount + setExistingInvoice, direset di reset()): /payment kini bercabang — bila diisi, skip validasi cart/build payload dan langsung repo.completeTransaction(id), judul & tombol dinamis pakai label/nominal invoice (mis. "Pay Tip", "Pay Reschedule Fee").
  • Fitur Tip di booking history: order Completed menampilkan section Tip di /history (di bawah tombol Reschedule/Cancel/Review) — belum pernah tip → CTA "Give a Tip"; sudah pernah → kartu "Thank you for your generosity" dengan nominal (1x per order, status order diturunkan dari seluruh booking dalam transaksi yang sama, mirror DeriveOrderStatus BE). Halaman baru /tip?transactionId=: chip Rp 5rb/10rb/20rb/30rb/50rb atau input manual (min Rp 5.000, tanpa batas atas) → POST /orders/:id/tip → lanjut ke /payment lewat infra existing-invoice di atas.
  • /order-summary: saat transaksi existing-invoice berlabel "Tip", hero copy jadi "Thank You" + pesan apresiasi dan Payment Summary memakai nominal invoice; tombol jadi "Back to My Bookings" ke /history untuk semua existing-invoice pay (tip maupun reschedule fee), selain itu tetap alur checkout biasa.
  • Types/repo: Transaction.transactionType/tipAmount (map dari transaction_type/tip_amount), repo.createOrderTip(orderId, amount) (POST orders/{id}/tip).

v0.6 — 2026-08-11

  • API-only: hapus Developer Mode Dummy/API toggle; repo selalu memanggil mpc-be via BFF.
  • Hapus src/lib/dummy/data.ts; util tanggal/slot pindah ke src/lib/booking/slots.ts.
  • Book: availability dari GET /courts/availability (bulk), bukan algoritma dummy.
  • Community players dari GET /users/players; empty state bila kosong.
  • Matchplay sync §10.1: create, participants, generate, update game, join; skor tersimpan di BE.
  • Google Sign-In: tampilkan belum tersedia (tanpa mock token).
  • Home: tanpa fallback dummy open matches / players.
  • FnB Pick-up time: settings API, picker di cart rail, fnb_pickup_time di checkout (parity Android).
  • Court Detail showcase (parity Android v1.16): halaman /courts?id= (hero gallery + thumbnail, badge kategori, love via favorites API, share navigator.share/copy link, perk chips, About, Specifications, sticky bar "Book This Court"); Home card court link ke detail (gambar gallery[0]); /book?mode=court&courtId= preselect By court.
  • Order Complete lengkap: section Rent/F&B/Pro Shop/Coaching/Classes/Voucher + baris "Pick-up time" + Payment Summary penuh (subtotal per kategori, PPN/PB1/service, Total Paid, Payment Method).
  • History detail: item Rent & F&B + pick-up time dari GET /transactions/customer/:id (fnb_pickup_time + items, split via katalog F&B).

v0.5 — 2026-08-10

  • repo.createMatch + home “Publish open match”.
  • Parity: matches/notifications/favorites path mengikuti Android v1.15.

v0.4 — 2026-08-10

  • Book: tabs/cart Rent + Pro Shop; inventory split ProShop (ex Merch heuristic).
  • Book court picker (By time grid + By court rail): kartu teks saja, tanpa gambar.
  • Court picker: daftar vertikal full-width (By court); harga hanya /hr (By time + By court).
  • Hapus label "Find by".
  • Schedule cart CTA Book + court rental total; court picker grid 2 kolom.
  • Label Select Court; section By court muncul/hilang dengan animasi.

v0.3 — 2026-08-09

  • Book: segmented By time / By court; quiet start-time labels (Passed/Full); home section "Courts".
  • By court: image cards for court picker (parity with By time).

v0.2 — 2026-08-09

  • Dummy courts parity: Court 1–3, displayOrder 1–3, Court 3 = VIP (API mode sudah fetch fresh — tidak ada bug stale RuntimeCatalog).

v0.1 — baseline

  • Placeholder / scaffold web app awal.