Giao Diện Chọn Ngày & Giờ Đặt Lịch
Ngày cập nhật: 20/06/2026 | Cập nhật lần cuối: 30/06/2026
Ảnh feedback:
Vấn Đề Hiện Tại
Màn hình "Chọn giờ" hiện tại đang dùng dạng scroll ngang theo ngày (thanh T3/T4/T5... ở trên) kết hợp với lưới các ô khung giờ phía dưới.
Hạn chế:
- Khách chỉ thấy được 5 ngày liên tiếp → khó có cái nhìn tổng quan về lịch.
- Không trực quan, không thể biết ngày nào còn slot trống / đã hết chỗ.
- Trải nghiệm chọn ngày không quen thuộc như lịch thông thường.
Yêu Cầu Thay Đổi
Bước 1 — Màn hình chọn ngày: Hiển thị dạng Bảng Lịch (Calendar Grid)
Thay thế thanh cuộn ngày ngang hiện tại bằng giao diện lịch dạng bảng đầy đủ (tham khảo ảnh 2):

| Yếu tố | Yêu cầu |
|---|---|
| Header tháng/năm | Hiển thị tháng + năm hiện tại, có nút < > để chuyển tháng |
| Tiêu đề thứ | Hàng đầu ghi thứ: CN / T2 / T3 / T4 / T5 / T6 / T7 |
| Ngày hiện tại | Được highlight/khoanh viền để dễ nhận biết |
| Ngày đã chọn | Highlight màu cam (tone màu thương hiệu) |
| Ngày quá khứ | Hiển thị mờ (disabled), không thể chọn |
| Ngày vượt 30 ngày tới | Hiển thị mờ (disabled), không thể chọn — theo cấu hình Admin |
| Ngày hết slot | (Tùy chọn nâng cao) Có thể đánh dấu riêng nếu API hỗ trợ |
| Auto-scroll (loop) | Thanh ngày cuộn vô hạn (infinite loop) — tự động chạy qua lại liên tục, không dừng lại ở đầu/cuối |
⚠️ Cập nhật 30/06/2026 — Yêu cầu Auto-scroll cho thanh ngày:
Thanh hiển thị ngày (date strip) phía trên Calendar Grid cần chạy tự động qua lại (auto-scroll / carousel loop):
- Tốc độ cuộn: chậm, mượt mà (không giật cục).
- Hướng: trái → phải → trái → (lặp vô hạn).
- Khi người dùng chạm/kéo: dừng auto-scroll, cho phép cuộn tay; sau khi thả tay thì tiếp tục auto-scroll sau 2–3 giây.
- Ngày đang được chọn luôn nằm trong vùng hiển thị (scroll to active).
Kỹ thuật tham khảo React Native:
// Dùng FlatList với useEffect setInterval cuộn tự động// hoặc thư viện react-native-snap-carousel với loop={true} + autoplay={true}
Bước 2 — Sau khi chọn ngày: Popup chọn Khung Giờ
Khi khách click vào một ô ngày hợp lệ trên lịch → mở Popup / Bottom Sheet hiển thị các khung giờ còn trống trong ngày đó.
Giao diện popup (giữ nguyên design lưới giờ hiện tại, chỉ thay cơ chế mở):

| Yếu tố | Yêu cầu |
|---|---|
| Header popup | Hiển thị ngày đã chọn: Thứ X, DD/MM/YYYY |
| Khung giờ | Lấy từ cấu hình giờ làm việc Admin CMS (VD: 10:00–20:00, bước nhảy 30 phút) |
| Giờ đã qua | Nếu là ngày hôm nay → disable các khung giờ đã qua |
| Giờ đã được đặt | Hiển thị mờ / gạch ngang, không thể chọn |
| Giờ được chọn | Highlight màu cam, nổi bật |
| Nút Xác nhận | Chỉ active khi đã chọn đủ ngày + giờ |
| Đóng popup | Vuốt xuống (swipe down) hoặc nhấn ngoài vùng popup |
Luồng UX Hoàn Chỉnh
[Màn hình đặt lịch]
↓
[Nhấn vào trường "Chọn ngày & giờ"]
↓
[Mở màn hình Calendar dạng bảng lịch]
↓
[Khách nhấn vào ô ngày muốn đặt]
↓
[Popup / Bottom Sheet hiện ra với các khung giờ còn trống]
↓
[Khách chọn khung giờ → Nhấn "Xác nhận"]
↓
[Quay về form đặt lịch, hiển thị ngày + giờ đã chọn]
Cấu Hình Admin CMS Liên Quan
| Cấu hình | Mô tả |
|---|---|
| Giờ mở cửa / đóng cửa | Xác định khung giờ hiển thị trong popup (VD: 09:00 – 20:00) |
| Bước nhảy khung giờ | 30 phút / 60 phút (Admin cấu hình) |
| Số ngày đặt trước tối đa | Mặc định 30 ngày — Admin có thể điều chỉnh |
| Ngày nghỉ / ngày không làm | Admin có thể cấu hình ngày đóng cửa → disabled trên lịch |
Ghi Chú Bổ Sung
- Giao diện Calendar nên nhất quán với phần chọn ngày trong các màn hình khác của App (nếu có).
- Trên iOS cần đặc biệt lưu ý hiệu ứng mở Bottom Sheet phải mượt mà.
- Ưu tiên không block toàn màn hình khi chọn giờ — dùng Bottom Sheet thay vì Full-screen modal để UX tự nhiên hơn.