Commit c07ef204 authored by ThinhNC's avatar ThinhNC

fix(frontend): resolve ZMP black screen

parent 060b0c04
...@@ -12,12 +12,16 @@ File này lưu trữ các quyết định thiết kế dài hạn và trạng th ...@@ -12,12 +12,16 @@ File này lưu trữ các quyết định thiết kế dài hạn và trạng th
- **Phong cách Icon**: Tự thiết kế các inline SVG dạng blob dày, tròn trịa, nhiều màu sắc pastel thay vì dùng icon nét mảnh phẳng thông thường. - **Phong cách Icon**: Tự thiết kế các inline SVG dạng blob dày, tròn trịa, nhiều màu sắc pastel thay vì dùng icon nét mảnh phẳng thông thường.
- **Quản lý Routing**: Sử dụng cấu hình router của ZMP UI / React Router tích hợp bên trong template để dẫn hướng giữa các màn hình nghiệp vụ và `/style-guide`. - **Quản lý Routing**: Sử dụng cấu hình router của ZMP UI / React Router tích hợp bên trong template để dẫn hướng giữa các màn hình nghiệp vụ và `/style-guide`.
- **Cấu hình API**: Base URL mặc định là `http://localhost:7777/api/v1` (tương tác trực tiếp với port 7777 của Backend). - **Cấu hình API**: Base URL mặc định là `http://localhost:7777/api/v1` (tương tác trực tiếp với port 7777 của Backend).
- **Vite/ZMP entry**: Giữ `index.html` tại root repository và không cấu hình Vite `root: "./src"`. ZMP CLI khởi chạy dev server với project root; cấu hình khác sẽ khiến iframe app trả 404. Build output chuẩn là `www/` tại root.
- **Luồng xác thực**: Khi app mount, `AuthInitializer` gọi `/auth/me`; `AuthGuard` chỉ render private route sau khi khởi tạo xong và chuyển người dùng chưa đăng nhập tới `/login`. Cookie HTTP-only là cơ chế xác thực ưu tiên.
## Trạng thái đã biết ## Trạng thái đã biết
- Đã sao chép khung boilerplate từ Zalo Mini App blank template (React + Vite + TypeScript). - Đã cấu hình React 18, Vite 5, ZMP SDK/UI, Tailwind và bộ base components Claymorphism.
- Đã cài đặt và cấu hình `zmp-sdk``zmp-ui` làm thư viện nền tảng cơ bản. - Đã có các màn hình đăng nhập, đăng ký, quên mật khẩu, đặt lại mật khẩu, trang chủ, hồ sơ và Style Guide.
- Đang bắt đầu quá trình triển khai cấu hình Tailwind, import Fonts, viết các base components phong cách Claymorphism, và dựng trang Style Guide để kiểm thử trực quan. - Đã kết nối frontend với API xác thực, React Query và Zustand auth store.
- Dev server đã được sửa để nội dung app tại cổng 2999 trả 200 và render đúng thay vì màn hình đen do sai Vite root.
- Các module tài chính chính (ví, giao dịch, ngân sách, tiết kiệm, báo cáo, AI Assistant) chưa được triển khai trong frontend hiện tại.
## Khi cập nhật file này ## Khi cập nhật file này
......
...@@ -14,36 +14,32 @@ ...@@ -14,36 +14,32 @@
- **State Management**: Zustand cho state toàn cục (auth, ui settings). - **State Management**: Zustand cho state toàn cục (auth, ui settings).
- **Form Validation**: Zod + React Hook Form. - **Form Validation**: Zod + React Hook Form.
## Cấu trúc thư mục (Feature-based) ## Cấu trúc thư mục hiện tại
```text ```text
src/ ├── index.html # HTML entry ở root; ZMP CLI yêu cầu vị trí này khi chạy dev
├── app.ts # Điểm vào chính của ứng dụng ├── app-config.json # Cấu hình khung hiển thị Zalo Mini App
├── components/ ├── vite.config.mts # Vite config; không đổi root sang ./src
│ ├── ui/ # Base components Claymorphism (Button, Card, Input, v.v.) ├── www/ # Build output được sinh bởi `npm run build`
│ └── shared/ # Components nghiệp vụ dùng chung (TransactionItem, WalletCard) └── src/
├── pages/ # Thư mục chứa các trang nghiệp vụ ├── app.ts # React entry, mount vào #app
│ ├── home/ # Trang chủ ├── components/
│ ├── wallet/ # Quản lý ví │ ├── ui/ # Base components Claymorphism
│ ├── transaction/ # Giao dịch │ └── shared/ # AuthGuard và component nghiệp vụ dùng chung
│ ├── budget/ # Ngân sách ├── pages/
│ ├── saving-goal/ # Mục tiêu tiết kiệm │ ├── auth/ # Đăng nhập, đăng ký, quên/đặt lại mật khẩu
│ ├── report/ # Báo cáo tài chính │ ├── profile/ # Trang hồ sơ người dùng
│ ├── ai-assistant/ # Trợ lý AI tài chính │ ├── index.tsx # Trang chủ sau đăng nhập
│ └── style-guide/ # Trang thử nghiệm & tài liệu Design System │ └── style-guide.tsx # Trang kiểm thử Design System
├── css/ ├── css/ # Tailwind directives và style bổ sung
│ ├── tailwind.scss # Import directives của Tailwind ├── lib/ # Axios client và React Query client
│ └── app.scss # CSS tùy chỉnh và các lớp phong cách bổ sung ├── services/ # Module gọi API, hiện có auth.service.ts
├── hooks/ # Custom hooks dùng chung ├── stores/ # Zustand stores, hiện có auth-store.ts
├── services/ # Module gọi API (auth.service.ts, wallet.service.ts) └── types/ # Kiểu dữ liệu dùng chung với backend
├── lib/
│ ├── api-client.ts # Axios instance có đính kèm Bearer Token & Interceptor tự refresh
│ └── query-client.ts # Cấu hình TanStack Query Client
├── stores/ # Zustand stores (ví dụ: auth-store.ts)
├── types/ # Kiểu dữ liệu TypeScript khớp với BE
└── utils/ # Hàm tiện ích (định dạng tiền tệ, ngày tháng)
``` ```
Các module ví, giao dịch, ngân sách, mục tiêu tiết kiệm, báo cáo và AI Assistant là phạm vi sản phẩm dự kiến, chưa có page trong code hiện tại.
## Luồng API & Dữ liệu ## Luồng API & Dữ liệu
```text ```text
...@@ -55,6 +51,8 @@ Component / Page ...@@ -55,6 +51,8 @@ Component / Page
``` ```
- **Base URL (Development)**: `http://localhost:7777/api/v1` (Port 7777 khớp với Backend `.env`). - **Base URL (Development)**: `http://localhost:7777/api/v1` (Port 7777 khớp với Backend `.env`).
- **Khởi tạo đăng nhập**: `AuthInitializer` gọi `GET /auth/me`; route riêng tư đi qua `AuthGuard` và chuyển về `/login` khi chưa xác thực.
- **Token**: Ưu tiên cookie HTTP-only; Axios vẫn hỗ trợ Bearer token từ auth store cho luồng tương thích hiện có.
- **Response Format**: - **Response Format**:
```json ```json
{ {
...@@ -64,3 +62,9 @@ Component / Page ...@@ -64,3 +62,9 @@ Component / Page
"errors": [] | null "errors": [] | null
} }
``` ```
## Dev server và build
- `npm run start` chạy ZMP CLI: khung mô phỏng ở `http://localhost:3000`, nội dung app ở `http://localhost:2999`.
- `index.html` phải nằm ở root repository. Nếu đặt trong `src/`, iframe nội dung sẽ trả 404 và giao diện có thể chỉ hiện màn hình đen.
- `npm run build` phải sinh output tại `www/` ở root repository, không phải `src/www/`.
...@@ -16,8 +16,10 @@ ...@@ -16,8 +16,10 @@
``` ```
- Khởi động môi trường dev cục bộ để kiểm tra giao diện trực quan: - Khởi động môi trường dev cục bộ để kiểm tra giao diện trực quan:
```bash ```bash
zmp start npm run start
``` ```
- Xác nhận khung mô phỏng `http://localhost:3000` và iframe app `http://localhost:2999` đều phản hồi. Cổng 2999 trả 404 thường có nghĩa `index.html` không còn ở root hoặc Vite `root` bị cấu hình sai.
- Xác nhận build output nằm trong `www/` ở root repository; không chấp nhận output nhầm tại `src/www/`.
- Kiểm tra độ tương thích responsive trên các kích thước màn hình thiết bị di động (tối thiểu là tỷ lệ màn hình 375x812 tiêu chuẩn). - Kiểm tra độ tương thích responsive trên các kích thước màn hình thiết bị di động (tối thiểu là tỷ lệ màn hình 375x812 tiêu chuẩn).
## 4. Trước khi bàn giao ## 4. Trước khi bàn giao
......
...@@ -14,6 +14,8 @@ pids ...@@ -14,6 +14,8 @@ pids
# Dependency directories # Dependency directories
node_modules/ node_modules/
.chrome-cdp/
.chrome-codex/
# Optional npm cache directory # Optional npm cache directory
.npm .npm
......
...@@ -23,6 +23,6 @@ ...@@ -23,6 +23,6 @@
<div id="app"></div> <div id="app"></div>
<!-- built script files will be auto injected --> <!-- built script files will be auto injected -->
<script type="module" src="/app.ts"></script> <script type="module" src="/src/app.ts"></script>
</body> </body>
</html> </html>
...@@ -6,7 +6,6 @@ import path from "path"; ...@@ -6,7 +6,6 @@ import path from "path";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default () => { export default () => {
return defineConfig({ return defineConfig({
root: "./src",
base: "", base: "",
plugins: [zaloMiniApp(), react()], plugins: [zaloMiniApp(), react()],
build: { build: {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment