# Task Breakdown: 08 - Kiosk Scanner (Frontend/UI)

**Referensi Dokumen:** FR-08 (UI & Auth), NFR-08.2
**Tujuan:** Menampilkan halaman HTML scanner kamera yang kokoh berbasis JS interaktif (`html5-qrcode`). Area ini tidak menggunakan Session Login user melainkan memverifikasi status *string token* dalam *URL route* aslinya.

## 1. Routing & Auth Middleware Kiosk
- [ ] Buat custom Middleware `KioskAuthMiddleware`.
  - Berperan mencegat URL *route* kiosk (misal: `/kiosk/{token}`).
  - Jika token Kiosk yang dimasukkan ke URL tidak ditemukan dalam tabel `KIOSK_TOKENS` berstatus aktif, atau jika sudah melewati `expires_at`, kembalikan tanggapan Forbidden 403 HTTP dan halangi rendering Blade. 

## 2. Kiosk UI Controller Target
- [ ] Buat `KioskController`:
  - Mengelola `show($token)` → Menampilkan View Scanner Blade.
  - Mengelola `health($token)` → Endpoint *Ping/Polling* JS untuk mendeteksi matinya server (*Internet loss warning*). Mengembalikan obyek status JSON `{status: "ok"}`.

## 3. UI Javascript Interactivity (html5-qrcode + Alpine.js)
- [ ] Integrasikan `html5-qrcode` hanya di view ini saja.
- [ ] Sediakan UI Card Feedback dinamis via Alpine:
  - Default: View kamera dengan notifikasi siap memindai.
  - Sukses Check In/Out: Tampilkan pop-up / *Card Override* berwarna hijau sukses beserta nama dan foto yang dikirim dari Backend *POST API* (scan record logic), auto-hide setelah 2-3 detik.
  - Gagal/Ditolak: Tampilkan *Feedback Error* berwarna merah mencolok jika ditolak sistem.
- [ ] Sediakan fitur `Connectivity Polling`: 
  - Ping URL `health` setiap 10-30 detik. Jika `Fetch Error`, *disable* area kamera, beri popup "Koneksi Terputus dengan Server". Menolak paksa seluruh scan di frontend sebelum membaik.

## 4. Acceptance Criteria
- [ ] Halaman pemindai murni hanya terbuka bagi siapa saja yang memiliki link rahasia token valid.
- [ ] Kamera mem-blokir frame otomatis jika *health ping* gagal tersambung ke backend.
- [ ] Memory-leak tertangani sewajarnya (restart scanning JS setelah popup hijau *checkout* selesai auto-close).
