Yêu Cầu Thiết Kế Lại: Vòng Quay May Mắn (Lucky Wheel)
Ngày tạo: 30/06/2026
Loại: UX/UI Redesign — Lucky Wheel Feature
Ảnh tham chiếu:
- Ảnh 1 — Hiện trạng popup vòng quay (thô)
- Ảnh 2 — Tham khảo thiết kế vòng quay trong popup
- Ảnh 3 — Tham khảo hiệu ứng chúc mừng khi trúng
1. Vấn Đề Hiện Tại — Thiết Kế "Thô"
Popup nhắc quay hiện tại chỉ gồm: icon tròn đơn giản + tiêu đề + 2 nút → không có vòng quay thực sự bên trong popup, không có hiệu ứng, trải nghiệm nhàm và không gây hứng thú.

2. Yêu Cầu Thiết Kế Lại
2.1 Popup Chứa Vòng Quay Thực Sự (Spin In-Popup)
Khi popup Vòng quay mở lên, vòng quay phải hiển thị ngay bên trong popup — người dùng quay trực tiếp tại đó, không cần chuyển sang màn hình khác.

| Yếu tố | Yêu cầu |
|---|---|
| Nền popup | Tối, gradient hoặc dark overlay tạo cảm giác "sân khấu" — không nền trắng phẳng |
| Vòng quay | Hiển thị đầy đủ bánh xe với các ô giải thưởng, màu sắc đa dạng, chữ trong ô rõ ràng |
| Kim chỉ (Pointer) | Mũi tên/kim cố định ở trên hoặc trung tâm, làm rõ ô nào được chọn khi dừng |
| Nút Spin | Nằm ở giữa vòng quay (hình tròn) hoặc bên dưới — nổi bật, có animation nhấp nháy nhẹ khi chờ |
| Tiêu đề | Text phía trên vòng quay: "Vòng Quay May Mắn" hoặc "Thử vận may hôm nay!" |
| Kết quả | Hiển thị tên giải thưởng trúng ngay trên/trong vòng quay khi dừng xoay |
| Đóng popup | Nút ✕ góc trên phải (chỉ hiện sau khi quay xong hoặc sau 5 giây) |
| Đồng bộ nhãn | Nhãn giải thưởng/voucher trúng phải trùng khớp 100% với nhãn ghi trên múi bánh của vòng quay. |
Cấu trúc popup
┌─────────────────────────────────────────┐
│ ✕ (góc phải, chỉ hiện sau khi quay) │
│ │
│ 🎯 Vòng Quay May Mắn 🎯 │
│ "Bạn có 1 lượt quay hôm nay!" │
│ │
│ ╭───────────────╮ │
│ ◄ │ 🎡 WHEEL │ ► │
│ │ [S P I N] │ │
│ ╰───────────────╯ │
│ │
│ [ QUAY NGAY ] │
│ [ Để sau ] │
└─────────────────────────────────────────┘
2.2 Hiệu Ứng Chúc Mừng Phủ Toàn Màn Hình Khi Trúng
Ngay khi vòng quay dừng và có kết quả trúng thưởng, hiệu ứng chúc mừng phải phủ lên toàn màn hình (full-screen overlay).

| Yếu tố | Yêu cầu |
|---|---|
| Confetti / Pháo hoa | Các mảnh giấy màu, ngôi sao, hình thú bay tung khắp màn hình (animation từ trên rơi xuống) |
| Màu sắc | Đa màu: đỏ, vàng, xanh, tím, cam — tông màu vui nhộn, lễ hội |
| Thông báo trúng thưởng | Hộp/card nổi lên ở giữa màn hình hiển thị: tên giải thưởng, mô tả, và nút nhận thưởng |
| Text chúc mừng | "🎉 Chúc mừng bạn!" / "Bạn vừa trúng [Tên giải]!" — font lớn, nổi bật |
| Thời gian hiệu ứng | Confetti chạy 3–5 giây, sau đó fade out nhẹ |
| Nút CTA | "Nhận thưởng" → điều hướng đến ví/voucher. "Đóng" → tắt overlay |
| Âm thanh | Tiếng trống/chuông thắng (tùy chọn, có thể tắt theo setting điện thoại) |
Trạng thái hiệu ứng theo kết quả
| Kết quả | Hiệu ứng |
|---|---|
| Trúng giải lớn (GPoint, Voucher giá trị cao) | Full confetti mạnh, âm thanh to, text "JACKPOT!" hoặc "ĐẠI THẮNG!" |
| Trúng giải nhỏ (GPoint ít, ưu đãi nhỏ) | Confetti nhẹ, âm thanh nhỏ hơn, text "Chúc mừng!" |
| Không trúng / May mắn lần sau | Không có confetti, chỉ hiện thông báo nhẹ nhàng |
3. Luồng UX Hoàn Chỉnh
[Mở App lần đầu trong ngày]
↓
[Sau 1–2s: Popup Vòng quay xuất hiện]
↓
[Popup hiển thị vòng quay đầy đủ + nút "Quay ngay"]
↓
[User nhấn "Quay ngay"]
↓
[Vòng quay xoay với animation mượt mà 3–5s]
↓
[Vòng dừng → highlight ô trúng]
↓ (nếu có giải thưởng)
[HIỆU ỨNG CONFETTI phủ toàn màn hình]
[Card thông báo trúng thưởng nổi lên giữa màn hình]
↓
[User nhấn "Nhận thưởng" → vào ví/voucher]
hoặc [Nhấn "Đóng" → trở về Home]
4. Checklist Kỹ Thuật
Vòng Quay (Lucky Wheel Component)
- Dùng
react-native-reanimated+react-native-svgđể render vòng quay mượt mà - Hoặc dùng thư viện có sẵn:
react-native-wheel-of-fortune - Dữ liệu ô giải thưởng lấy từ API (
/lucky-wheel/prizes) — không hardcode - Animation xoay: easing
decelerate(bắt đầu nhanh, chậm dần trước khi dừng) - Kết quả xác định từ server (không tính trên client để tránh gian lận)
- Đồng bộ nhãn: Tên giải thưởng hiển thị trên popup thông báo kết quả và lưu vào ví/database phải trùng khớp hoàn toàn với text được ghi trên múi bánh (phân vùng) của vòng quay.
Hiệu Ứng Confetti
- Dùng thư viện
react-native-confetti-cannonhoặc@nandorojo/burnt - Confetti là
AbsolutePositionedoverlay,zIndexcao nhất - Tự động fade out sau 4 giây
- Card kết quả xuất hiện với animation
springtừ dưới lên
Popup Modal
- Dùng
react-native-modalhoặc@gorhom/bottom-sheetcho popup vòng quay - Backdrop blur/dark khi popup mở
- Không thể dismiss popup bằng cách nhấn ra ngoài khi đang xoay
- Nút "Để sau": lưu
AsyncStoragengày đã show, không hiện lại hôm nay