| # LLM Guide: NLP-IBM-Debater Workspace | |
| This repository is a React + TypeScript (Create React App) workspace prepared with Tailwind CSS and a modular app layout. Use this guide as the single source of truth when making automated or AI-assisted changes. | |
| ## Project map | |
| - `src/app/App.tsx` β entry composition (TypeScript). | |
| - `src/app/layouts/MainLayout.tsx` β basic layout wrapper (TypeScript). | |
| - `src/app/pages/` β page components (use `.tsx` extension). | |
| - `src/app/components/` β reusable UI pieces (common/navigation, use `.tsx` extension). | |
| - `common/ErrorBoundary.tsx` β error boundary component (class component, required by React). | |
| - `common/Loading.tsx` β loading spinner component. | |
| - `src/app/services/api-wrapper.ts` β centralized API client with fetch wrapper (GET/POST/PUT/PATCH/DELETE). | |
| - `src/app/hooks/` β custom React hooks (use `.ts` extension). | |
| - `useApi.ts` β hook for API calls with loading/error states. | |
| - `src/app/types/` β TypeScript type definitions (use `.ts` extension). | |
| - `api.types.ts` β API-related types. | |
| - `index.ts` β central export point for all types. | |
| - `src/app/utils/` β utility functions (use `.ts` extension, debounce, formatError, etc.). | |
| - `src/app/constants/` β app-wide constants (use `.ts` extension, API endpoints, config). | |
| - `src/index.js` β CRA entry point mounting `App` with ErrorBoundary. | |
| - `tailwind.config.js` & `postcss.config.js` β Tailwind setup. | |
| - `.env.example` β environment variables template (all `.env*` files are gitignored). | |
| ## Conventions | |
| - **File Extensions**: | |
| - Use `.tsx` for React components (components, pages, layouts) | |
| - Use `.ts` for non-JSX TypeScript files (hooks, utils, types, services) | |
| - Use `.js` only for config files (index.js, config files) | |
| - **TypeScript**: This project uses TypeScript for type safety. Always type your props, functions, and API responses. | |
| - Prefer feature-first folders under `src/app` (`components`, `pages`, `layouts`, `data`, `hooks`, `services` as needed). | |
| - Styling is Tailwind-first; avoid ad-hoc CSS files unless adding global tokens. | |
| - Keep components presentational and pass data via props; co-locate tests next to features or under `__tests__`. | |
| - Use functional components and hooks; avoid class components (except ErrorBoundary which requires a class). | |
| - Keep imports relative to `src/` (CRA default) and prefer absolute paths only if `NODE_PATH`/aliases are introduced. | |
| ## Commands | |
| - Install deps: `npm install` | |
| - Start dev server: `npm start` (loads `.env.development`) | |
| - Build for prod: `npm run build` (loads `.env.production`) | |
| - Run tests: `npm test` | |
| ## Environment Variables | |
| - **`.env.example`** β Template showing required variables (committed to git) | |
| - **All `.env*` files** β Gitignored for security (create from `.env.example`) | |
| **Important**: All environment variables exposed to the browser must start with `REACT_APP_` prefix. | |
| **Setup**: | |
| 1. Copy `.env.example` to create your local env files: | |
| - Development: `cp .env.example .env.development.local` | |
| - Production: `cp .env.example .env.production.local` | |
| 2. Update the values in your local `.env.*.local` files | |
| Current variables: | |
| - `REACT_APP_API_BASE_URL` β API base URL (defaults to `http://localhost:4000` if not set) | |
| To add new variables: | |
| 1. Add to `.env.example` as documentation | |
| 2. Update your local `.env.*.local` files | |
| 3. Access via `process.env.REACT_APP_YOUR_VAR` | |
| ## Patterns to follow | |
| - Add new UI to `src/app/pages` (use `.tsx` extension) and wire via `App.tsx`. | |
| - Reuse `MainLayout` for consistent shell elements. | |
| - Keep static strings in `src/app/data` for reuse/testing. | |
| - **API calls**: | |
| - Use `src/app/services/api-wrapper.ts` for direct API calls: `api.get()`, `api.post()`, etc. | |
| - Use `useApi` hook from `src/app/hooks/useApi.ts` for components that need loading/error states. | |
| - **Types**: Add new TypeScript types to `src/app/types/` (use `.ts` extension) and export from `index.ts`. | |
| - **Constants**: Add app-wide constants to `src/app/constants/index.ts`. | |
| - **Utils**: Add reusable utility functions to `src/app/utils/index.ts`. | |
| - **Component Props**: Always type your component props using TypeScript interfaces or types. | |
| - When adding new services, create `src/app/services/*` (use `.ts` extension) and keep fetchers pure; inject into components via hooks or props. | |
| ## Quality and safety | |
| - Use React Testing Library for behavior-first tests. | |
| - Avoid editing generated configs unless necessary; prefer small, reviewable diffs. | |
| - Document non-obvious decisions inline with concise comments. | |
| ## API Service Usage | |
| ### Direct API calls | |
| The `api-wrapper.ts` service provides a typed, centralized way to make HTTP requests: | |
| ```typescript | |
| import api from '../services/api-wrapper'; | |
| // GET request | |
| const data = await api.get<User[]>('/users'); | |
| // POST request | |
| const newUser = await api.post<User, CreateUserDto>('/users', { name: 'John' }); | |
| // With error handling | |
| try { | |
| const result = await api.get('/endpoint'); | |
| } catch (error) { | |
| // error is typed as ApiError with status, message, details | |
| console.error(error.status, error.message); | |
| } | |
| ``` | |
| ### Using the useApi hook | |
| For components that need loading and error states: | |
| ```typescript | |
| import { useApi } from '../hooks/useApi'; | |
| import Loading from '../components/common/Loading'; | |
| import type { User } from '../types'; | |
| const MyComponent: React.FC = () => { | |
| const { data, loading, error, refetch } = useApi<User[]>('/api/users'); | |
| if (loading) return <Loading />; | |
| if (error) return <div>Error: {error.message}</div>; | |
| return <div>{/* render data */}</div>; | |
| }; | |
| ``` | |
| The service automatically: | |
| - Uses `REACT_APP_API_BASE_URL` from environment variables | |
| - Sets JSON content-type headers | |
| - Handles JSON parsing | |
| - Throws typed errors for non-OK responses | |
| - Supports AbortSignal for request cancellation | |
| ## TypeScript Guidelines | |
| - **Components**: Always type props using interfaces or types | |
| ```typescript | |
| type MyComponentProps = { | |
| title: string; | |
| count?: number; | |
| }; | |
| const MyComponent: React.FC<MyComponentProps> = ({ title, count = 0 }) => { | |
| // ... | |
| }; | |
| ``` | |
| - **API Responses**: Type your API responses | |
| ```typescript | |
| type User = { | |
| id: number; | |
| name: string; | |
| }; | |
| const users = await api.get<User[]>('/api/users'); | |
| ``` | |
| - **Hooks**: Type hook return values and parameters | |
| ```typescript | |
| const { data, loading } = useApi<Debate[]>('/api/debates'); | |
| ``` | |
| ## How to help | |
| - Before large refactors, note intent and file targets in the PR description. | |
| - After code edits, run tests or `npm run build` to verify TypeScript compilation. | |
| - When adding API endpoints, use the `api-wrapper.ts` service instead of raw `fetch`. | |
| - Always use TypeScript types for props, API responses, and function parameters. | |
| - Keep this guide updated when changing structure, commands, or adding new services. | |