Tài liệu này mô tả kế hoạch kỹ thuật để liên kết danh sách các cây đã sở hữu (unlockedTreeIds) của người dùng với danh sách các hạt giống có thể lựa chọn trên màn hình tập trung Pomodoro (Home).
Important
- Sau khi liên kết, người dùng đăng ký tài khoản mới sẽ bắt đầu với 0 xu và chỉ có duy nhất cây Sồi mặc định (
default_oak) để lựa chọn. Các loại cây khác (như Thông, Anh Đào, Phong, v.v.) sẽ cần được mua từ tab Store trước khi có thể xuất hiện và chọn lựa tại tab Home. - Danh sách cây được lấy tập trung từ repository thông qua tệp cấu hình trees.json. Danh sách tĩnh
DataSource.plantscũ sẽ bị loại bỏ để đảm bảo tính nhất quán của ID tài nguyên.
- Định nghĩa thêm đối tượng tĩnh
DEFAULT_TREEtrongTreeType.companiontương ứng với cây Sồi mặc định (default_oak) để làm giá trị khởi tạo mặc định cho UI và Service khi chưa tải xong dữ liệu.
- Khai báo thêm giao diện
forestRepositoryvào interfaceAppContainer. - Triển khai khởi tạo lười biếng (
lazy) choforestRepositorytrongDefaultAppContainersử dụngProdForestRepository(context).
- Thay đổi giá trị khởi tạo của thuộc tính
currentTreetrongTimerStatetừDataSource.plants[0]thànhTreeType.DEFAULT_TREE.
- Loại bỏ hoàn toàn danh sách tĩnh
plantsđể tránh dư thừa dữ liệu. Giữ lại danh sách nhạc chuông hoàn thànhwinRingtonephục vụ cho cài đặt hệ thống.
- Thay đổi giá trị khởi tạo của
selectedTreethànhTreeType.DEFAULT_TREE. - Thêm thuộc tính
unlockedTrees: List<TreeType>đại diện cho danh sách các cây người dùng đã sở hữu (mặc định khởi tạo chỉ cóTreeType.DEFAULT_TREE).
- Cập nhật hàm tạo để nhận thêm
forestRepository: ForestRepository. - Cập nhật
PomodoroViewModel.Factoryđể cung cấpforestRepositorytừAppContainer. - Thêm cơ chế tải danh sách toàn bộ loài cây từ
forestRepository.getAllTrees()khi khởi tạo ViewModel. - Lắng nghe sự thay đổi của người dùng từ
userRepository.getCurrentUserProfileFlow(), lọc danh sách cây toàn phần dựa theounlockedTreeIdscủa người dùng và cập nhật vàoPomodoroUiState.unlockedTrees. - Khi cập nhật cây được chọn thông qua
updateSelectedTree(value: TreeType), gọi thêmtimerManager.setTree(value)(thay thế cho lời gọi hàm cũtimerManager.setTreeId(...)không tồn tại).
- Cập nhật
TreeSelectionRowđể truyềnpomodoroUiState.unlockedTreesvào tham sốitems()củaLazyRowthay vì sử dụng danh sách tĩnhDataSource.plantscũ.
- Lập một tài khoản mới tinh (tên tùy chọn, ví dụ
test_user_link@example.com). - Xác nhận rằng khi vào tab Home, bạn chỉ nhìn thấy duy nhất cây Sồi (
default_oak) trong thanh chọn cây và số coin hiển thị là0 xu. - Hoàn thành thử một phiên tập trung Pomodoro ngắn (ví dụ: đặt thời gian 1 phút) để nhận xu, hoặc chỉnh sửa trực tiếp số coin trên bảng Firestore
userscủa user tương ứng lên300 xu. - Chuyển sang tab Store, xác nhận cây Thông (
pine) hiển thị giá300 xuở trạng thái BUYABLE. - Nhấn mua cây Thông và xác nhận thành công. Số xu bị trừ tương ứng và hiển thị của cây Thông chuyển sang OWNED.
- Quay lại tab Home, kiểm tra xem cây Thông đã xuất hiện bên cạnh cây Sồi trong danh sách chọn chưa. Chọn cây Thông mới mua và chạy đếm giờ để xác nhận cây mọc thành công là cây Thông.