3.1 KiB
3.1 KiB
APLP Frontend — Conventions
| Status | Phase 0 hoàn tất |
1. Language & Tooling
- TypeScript cho toàn bộ code. Không dùng
anytùy tiện; ưu tiên explicit types. - Lint: oxlint (đã confirm Phase 0); format: Prettier.
- Convention: file
.tsxcho React components; kiểu dùng interface cho props.
2. Naming
| Loại | Quy ước |
|---|---|
| Component | PascalCase (CourseCard.tsx) |
| Hook | camelCase, prefix use (useLearningProgress.ts) |
| Page/route | PascalCase trong pages/ |
| API function | camelCase (fetchCourseDetail) |
| Types/interface | PascalCase (CourseDetailDto, ApiError) |
3. Component Rules
- Component nhỏ, single responsibility.
- Props dùng interface; optional props explicit.
- Logic phức tạp nên tách vào hooks.
- Components dùng chung đặt
src/shared/components; feature-specific vàofeatures/<feature>/components. - Không đặt business logic vào JSX.
4. State Management
- Server state → TanStack Query (query keys chuẩn:
['course', id]). - UI/local state →
useState; nếu cần chia sẻ toàn app → Zustand store. - Không đặt server data vào Zustand khi đã có React Query (tránh trùng source of truth).
- Tên store: domain concept (
useLearnerStore).
5. API Layer
- Gọi backend qua
src/apiwrapper. Không gọifetch/axios trực tiếp tại component. - Response mapping/error handling nằm trong api layer.
- Có hằng số endpoint riêng, không đặt URL rải rác.
6. Error & Loading States
- Mọi view fetch/save cần xử lý: loading, empty, error, success.
- Dùng shared components (Spinner, EmptyState, ErrorState / ErrorBoundary).
- Hiển thị lỗi user-friendly từ
ApiErrorcủa backend; không hiện stack trace.
7. Styling
- Dùng design tokens/theme (xác nhận stack Phase 0).
- Không hard-code color/margin lộn xộn; ưu tiên class utility/component thống nhất.
- Responsive theo grid/breakpoints chuẩn.
8. Testing
- Unit test components/hooks: Vitest.
- Render test với testing-library.
- E2E (Playwright) — optional, đánh giá sau.
- Test file đặt cạnh source (
Component.test.tsx) hoặc__tests__/— chọn 1 để thống nhất.
9. Git & Collaboration
- Commit nhỏ, message rõ (theo style repo khi setup lại).
- Dùng feature branch + review.
- Lint + typecheck + test chạy qua (lệnh chuẩn
npm run lint,npm run typecheck,npm test) trước khi merge.
10. Security
- Không lưu secret/token vào code hay log.
- Không put credentials vào env file committed (
.env→.env.example). - Không render user content bằng
dangerouslySetInnerHTMLtrừ khi đã sanatize.
11. Open Questions
| ID | Question | Status |
|---|---|---|
| CON-001 | ESLint config (airbnb/custom)? | Resolved: oxlint (default config) |
| CON-002 | Path alias (@/)? |
Resolved: có (@ → src) |
| CON-003 | Test file location convention? | Resolved: đặt cạnh source (Component.test.tsx) |
| CON-004 | Storybook có cần? | Open |