Tổng Hợp Yêu Cầu Cập Nhật App — 30/06/2026
Ngày tạo: 30/06/2026
Loại: Feature Update & Bug Fix Requests
Áp dụng cho: Mobile App (React Native)
1. Booking Calendar — Thanh Ngày Auto-scroll (Infinite Loop)
File chi tiết: Booking-Calendar-UI.md
Thanh hiển thị ngày (date strip) trong màn hình đặt lịch cần tự động cuộn qua lại vô hạn (infinite loop / auto-scroll carousel):
| Thuộc tính | Yêu cầu |
|---|---|
| Hướng cuộn | Trái → Phải → Trái (lặp liên tục) |
| Tốc độ | Chậm, mượt (không giật) |
| Tương tác tay | Dừng auto khi user chạm; tiếp tục sau 2–3s khi thả tay |
| Active item | Ngày đang chọn luôn hiển thị trong vùng nhìn thấy |
// React Native: FlatList + setInterval hoặc
// react-native-snap-carousel với loop={true} + autoplay={true}
2. Event & Tin Tức — Bố Cục Hero + List (Theo Figma)
Vấn đề hiện tại
Tất cả các bài viết Event/Tin tức đang hiển thị cùng kích thước → không có sự phân cấp trực quan.
Yêu cầu bố cục mới (theo Figma)
┌─────────────────────────────────┐
│ │
│ [ẢNH LỚN - TIN GẦN NHẤT] │ ← Hero Card (bài mới nhất)
│ │ Ảnh full-width, tiêu đề to
│ Tiêu đề bài viết mới nhất │ + mô tả ngắn + ngày đăng
│ Mô tả ngắn... 30/06/2026 │
│ │
└─────────────────────────────────┘
↓
┌──────────────────────────────────────────┐
│ [Ảnh nhỏ] Tiêu đề bài 2 28/06/2026 │ ← List nhỏ
│ [Ảnh nhỏ] Tiêu đề bài 3 27/06/2026 │ (các bài cũ hơn)
│ [Ảnh nhỏ] Tiêu đề bài 4 26/06/2026 │ Thumbnail nhỏ bên trái
│ [Ảnh nhỏ] Tiêu đề bài 5 25/06/2026 │ Text tiêu đề bên phải
└──────────────────────────────────────────┘
| Phần | Mô tả | Số lượng |
|---|---|---|
| Hero Card | Bài viết mới nhất — ảnh full-width, tiêu đề lớn, mô tả ngắn, ngày đăng | 1 bài |
| List nhỏ | Các bài cũ hơn — thumbnail nhỏ bên trái + tiêu đề + ngày đăng bên phải | Tất cả còn lại |
| Phân trang / Load more | Nút "Xem thêm" hoặc infinite scroll khi cuộn đến cuối | Khi > 10 bài |
Áp dụng cho cả 2 tab: Event (Sự kiện) và Tin tức (News) — cùng layout pattern.
3. Vòng Quay May Mắn — Popup Khi Truy Cập Lần Đầu Mỗi Ngày
Yêu cầu
Khi người dùng mở App lần đầu trong ngày (hoặc vào trang chủ lần đầu trong ngày), tự động hiện popup nhắc nhở Vòng quay may mắn.
Logic hiển thị
Mở App / vào Home
↓
Kiểm tra: Hôm nay đã hiện popup Vòng quay chưa?
├── CHƯA → Hiện popup sau 1–2 giây
└── RỒI → Bỏ qua, không hiện lại
| Thuộc tính | Chi tiết |
|---|---|
| Tần suất | 1 lần / ngày / thiết bị (reset lúc 00:00 mỗi ngày) |
| Thời điểm hiện | Sau 1–2 giây kể từ khi Home render xong (không chặn loading) |
| Nội dung popup | Ảnh/icon vòng quay + text: "Bạn có lượt quay miễn phí hôm nay!" |
| CTA | Nút "Quay ngay" → điều hướng đến màn hình Vòng quay |
| Bỏ qua | Nút "Để sau" hoặc nhấn ra ngoài → đóng popup, không hiện lại hôm nay |
| Lưu trạng thái | AsyncStorage: key last_spin_popup_date = YYYY-MM-DD |
// Pseudo-code React Native
const today = new Date().toISOString().split('T')[0]; // "2026-06-30"
const lastShown = await AsyncStorage.getItem('last_spin_popup_date');
if (lastShown !== today) {
setTimeout(() => showSpinPopup(), 1500);
await AsyncStorage.setItem('last_spin_popup_date', today);
}
4. Chi Tiết Chi Nhánh — Ẩn Section "Dịch Vụ Spa"
File ảnh gốc: z7978306939224_886c0029577133c9142f0735a06becf0.jpg
Vấn đề
Màn hình Chi tiết Chi nhánh (Branch Detail) đang hiển thị section "Dịch vụ Spa" phía dưới thông tin chi nhánh → gây nhầm lẫn ngữ cảnh, section này chỉ thuộc về trang chủ.
Yêu cầu
- Ẩn hoàn toàn component/section "Dịch vụ Spa" khỏi màn hình
BranchDetailScreen. - Section này chỉ được render trên HomeScreen, không được mount vào
BranchDetailScreen. - Kiểm tra prop hoặc route params để conditionally render:
if (screen === 'BranchDetail') return null.
5. Dropdown Select — Đổi Thành Bottom Sheet / Modal Có Scroll
File ảnh gốc: z7978306939224_886c0029577133c9142f0735a06becf0.jpg
Vấn đề hiện tại
Dropdown "Chọn nhóm dịch vụ" (và các dropdown khác trong form đặt lịch) khi mở ra, danh sách options đổ xuống inline ngay trong trang → khi có nhiều data, danh sách dài sẽ đẩy toàn bộ nội dung phía dưới xuống → layout bị vỡ, trải nghiệm xấu.
Yêu cầu thay đổi
| Hiện tại | Yêu cầu mới | |
|---|---|---|
| Cơ chế mở | Inline expand (đổ xuống tại chỗ) | Bottom Sheet / Modal popup xuất hiện từ dưới lên |
| Scroll | Đẩy content xuống | Scroll nội dung bên trong bottom sheet bằng ngón tay |
| Đóng | Nhấn lại dropdown | Vuốt xuống (swipe down) hoặc nhấn ra ngoài vùng |
| Chọn item | — | Nhấn vào item → tự động đóng bottom sheet, hiển thị giá trị đã chọn |
| Chiều cao | Co giãn theo nội dung | Tối đa 60% chiều cao màn hình, có scroll bên trong nếu vượt |
Áp dụng cho tất cả dropdown trong form Booking
- Chọn thành phố
- Chọn chi nhánh
- Chọn nhóm dịch vụ
- Chọn dịch vụ cụ thể
- Chọn số lượng người
Thiết kế Bottom Sheet
─────────────────────── (drag handle)
Chọn nhóm dịch vụ
───────────────────────
🔍 Tìm kiếm... (optional)
───────────────────────
● Massage Body 10 dịch vụ
○ Body Scrub 1 dịch vụ
○ Massage Foot 5 dịch vụ
○ Facial 3 dịch vụ
○ Healing Land 5 dịch vụ
○ ...
(cuộn ngón tay)
// React Native: dùng @gorhom/bottom-sheet hoặc react-native-modal
import BottomSheet from '@gorhom/bottom-sheet';
// snapPoints={['60%']} với nội dung ScrollView bên trong
Checklist Tổng Hợp
| # | Hạng mục | Độ ưu tiên | Trạng thái |
|---|---|---|---|
| 1 | Booking Calendar: thanh ngày auto-scroll loop | Trung bình | ☐ Chưa làm |
| 2 | Event/Tin tức: layout Hero + List theo Figma | Cao | ☐ Chưa làm |
| 3 | Vòng quay: popup lần đầu mỗi ngày | Trung bình | ☐ Chưa làm |
| 4 | Chi nhánh detail: ẩn section Dịch vụ Spa | Cao | ☐ Chưa làm |
| 5 | Dropdown Booking: đổi sang Bottom Sheet modal | Cao | ☐ Chưa làm |