# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview This is a React-based **Ship Monitoring System** (Hệ thống giám sát tàu cá) built with **UmiJS Max** framework for Mobifone. The application provides real-time monitoring of fishing vessels with GPS tracking, alarm management, and trip logging capabilities. **Domain**: Maritime & Fishing Industry **Target Users**: Fishing vessel operators and monitoring centers **Language**: Vietnamese (Primary) with English development comments ## Technology Stack ### Core Framework - **UmiJS Max 4.5.0** - Enterprise-level React application framework - **React 18** - UI library with hooks and functional components - **TypeScript** - Type-safe JavaScript - **Ant Design 5.x** - UI component library with Pro Components - **TailwindCSS** - Utility-first CSS framework ### Mapping & Visualization - **OpenLayers 10.6.1** - Interactive maps and geospatial visualization - **GeoJSON** - Geospatial data format - **WKT (Well-Known Text)** - Geometry representation ### State Management - **UmiJS Model Plugin** - Global state management - **Event Bus Pattern** - Custom event-driven communication - **React Hooks** - Local state management ### Development Tools - **Husky + Lint-staged** - Git hooks for code quality - **Prettier** - Code formatting - **ESLint** - Code linting - **pnpm** - Package manager ## Project Structure ``` src/ ├── app.tsx # Global app configuration & layout ├── access.ts # User permissions & access control ├── constants/ # Application constants & enums │ ├── index.ts # Global constants │ └── enums.ts # Application enums ├── models/ # Global state models (UmiJS Model plugin) │ ├── global.ts # Global state │ ├── getTrip.ts # Trip management state │ └── getSos.ts # SOS/Alarm state ├── pages/ # Application pages (routes) │ ├── Auth/ # Authentication page │ ├── Home/ # Map monitoring page │ └── Trip/ # Trip management page ├── components/ # Reusable UI components │ ├── 403/ # Access denied page │ ├── 404/ # Not found page │ ├── 500/ # Server error page │ └── Footer/ # Footer component ├── services/ # API services & controllers │ ├── controller/ # API endpoint controllers │ │ ├── AuthController.ts │ │ ├── DeviceController.ts │ │ ├── MapController.ts │ │ ├── TripController.ts │ │ └── UserController.ts │ └── service/ # Business logic services │ └── MapService.ts ├── utils/ # Utility functions │ ├── eventBus.ts # Custom event bus │ ├── localStorageUtils.ts │ ├── jwtTokenUtils.ts │ ├── mapUtils.ts │ ├── geomUtils.ts │ ├── format.ts │ └── cacheStore.ts ├── types/ # TypeScript type definitions │ └── geojson.d.ts ├── assets/ # Static assets (icons, images) └── .umi-production/ # UmiJS build artifacts (auto-generated) ``` ## Key Architectural Patterns ### 1. Event-Driven Architecture The application uses a custom **Event Bus** pattern for decoupled component communication: ```typescript // src/utils/eventBus.ts export const eventBus = new EventBus(); // Components emit events eventBus.emit('gpsData:update', data); // Components listen to events eventBus.on('gpsData:update', handleUpdate); ``` **Key Events:** - `gpsData:update` - GPS position updates - `ship:update` - Ship marker updates - `alarm:update` - Alarm status changes - `trackpoints:update` - Track history updates - `entities:update` - Geographic entities updates ### 2. Real-time Data Flow ``` GPS API (5s interval) → Event Bus → Multiple Components ↓ Ship Marker Updates Alarm Status Updates Track History Updates Zone Boundary Updates ``` ### 3. Controller Pattern API endpoints are organized in controllers following REST conventions: ```typescript // src/services/controller/DeviceController.ts export async function getGPS(): Promise export async function queryAlarms(): Promise export async function queryEntities(): Promise ``` ### 4. UmiJS Model Pattern Global state management using UmiJS Models: ```typescript // src/models/getTrip.ts export default function useGetTripModel() { const [data, setData] = useState(null); const getApi = useCallback(async () => { // API call and state update }, []); return { data, loading, getApi }; } ``` ## Development Workflow ### Available Scripts ```bash npm run dev # Start development server npm run build # Build for production npm run format # Format code with Prettier npm run setup # Initial setup ``` ### Package Management - **Primary**: `pnpm` (configured in .umirc.ts) - **Fallback**: `npm` ### Code Quality Tools - **Prettier**: Code formatting (80 char width, single quotes) - **ESLint**: Code linting via UmiJS `max lint` - **Husky**: Git hooks for pre-commit checks - **Lint-staged**: Staged file processing ### Environment Configuration - **Development**: `REACT_APP_ENV=dev` (localhost:8000) - **Test**: `REACT_APP_ENV=test` (test server) - **Production**: `REACT_APP_ENV=prod` (production server) ## Key Features & Components ### 1. Real-time GPS Monitoring (`/map`) - **VietNamMap**: Interactive OpenLayers map - **Ship Tracking**: Real-time vessel position updates - **Alarm Management**: Visual alert system - **Zone Boundaries**: Geographic restriction zones - **SOS Functionality**: Emergency button ### 2. Trip Management (`/trip`) - **Trip Creation/Update**: Fishing trip lifecycle - **Haul Logging**: Fish catch records - **Crew Management**: Team member tracking - **Cost Tracking**: Expense management - **Alarm Table**: Real-time alerts display ### 3. Authentication System - **JWT Token Management**: Secure authentication - **Auto-refresh**: Token expiration handling - **Route Protection**: Login redirects ### 4. Dynamic API Configuration The application supports **dynamic API endpoints** based on deployment environment: ```typescript // Auto-detects device IP and configures API accordingly const deviceApiUrl = `http://${window.location.hostname}:81`; ``` ## Map & Geospatial Features ### Map Components - **VietNamMap**: Main map component - **BaseMap**: OpenLayers integration - **MapManager**: Map state and interaction management ### Geographic Data - **GPS Coordinates**: WGS84 format - **GeoJSON**: Layer data format - **WKT**: Well-Known Text for geometries - **Zone Types**: Fishing zones, restricted areas ### Ship Icons & States - **Online/Offline**: Connection status - **Fishing/Non-fishing**: Activity state - **Alarm Levels**: Warning, alarm, SOS states - **Custom Icons**: Activity-specific markers ## API Integration ### Base URL Configuration - **Development**: `http://192.168.30.103:81` - **Test**: `https://test-sgw-device.gms.vn` - **Production**: `https://prod-sgw-device.gms.vn` ### Key API Endpoints ```typescript GPS: /api/sgw/gps Trips: /api/sgw/trip Alarms: /api/io/alarms Entities: /api/io/entities Ship Info: /api/sgw/shipinfo SOS: /api/sgw/sos ``` ### Request Interceptors - **Authentication**: JWT token injection - **Error Handling**: Global error management - **Timeout**: 20-second timeout ## State Management ### Global State Models 1. **global.ts** - User authentication state 2. **getTrip.ts** - Trip management state 3. **getSos.ts** - SOS and alarm state ### Local State Patterns - **useState**: Local component state - **useEffect**: Side effects and subscriptions - **useCallback**: Function memoization - **useRef**: DOM references and persistent values ## Development Guidelines ### Code Style - **TypeScript**: Strict typing enabled - **Component Structure**: Functional components with hooks - **File Naming**: PascalCase for components, camelCase for functions - **Import Organization**: Third-party libs → Local imports ### Best Practices 1. **Error Boundaries**: Implement error boundaries for maps 2. **Performance**: Use React.memo for expensive components 3. **Memory Management**: Clean up event listeners and intervals 4. **API Calls**: Use proper error handling and loading states 5. **Type Safety**: Define TypeScript interfaces for all API responses ### Testing Approach - **Component Testing**: React Testing Library (if added) - **Integration Testing**: Manual testing with real API endpoints - **E2E Testing**: Browser testing scenarios ## Deployment ### Build Process ```bash npm run build # Creates dist/ folder for deployment ``` ### Static Deployment 1. Build application 2. Copy `dist` folder to target device 3. Serve via web server (nginx, apache, etc.) 4. Ensure backend API runs on port 81 ### Multi-Device Support - **Auto-detection**: Application detects device IP - **Dynamic API**: Base URL configured automatically - **CORS**: Ensure proper CORS configuration on backend ## Troubleshooting ### Common Issues 1. **Map Loading**: Check OpenLayers dependencies 2. **API Calls**: Verify proxy configuration and network access 3. **Event Bus**: Ensure proper event listener cleanup 4. **State Management**: Check model initialization 5. **Authentication**: Verify JWT token expiration ### Debug Mode - Enable console logging for GPS updates - Check network requests in browser dev tools - Monitor event bus emissions - Verify map coordinate transformations ## Contributing ### Adding New Features 1. Create new page in `src/pages/` 2. Add route in `.umirc.ts` 3. Create API controller in `src/services/controller/` 4. Add TypeScript types in `src/types/` 5. Update constants in `src/constants/` ### Code Review Checklist - TypeScript types defined - Error handling implemented - Performance considerations - Accessibility compliance - Code style guidelines followed - Testing coverage (if applicable) --- **Last Updated**: 2025-01-20 **Maintainers**: Mobifone Development Team **Version**: 1.2.2 - Dynamic API