# Phase 7: Real-time Updates Implementation ## Overview Phase 7 adds real-time location updates to Maps V2 with two independent features: 1. **Live Mode** - User's own points appear in real-time (toggle-able via settings) 2. **Family Locations** - Family members' locations are always visible (when family feature is enabled) ## Architecture ### Key Components #### 1. Family Layer ([family_layer.js](layers/family_layer.js)) - Displays family member locations on the map - Each member gets a unique color (6 colors cycle) - Shows member names as labels - Includes pulse animation for recent updates - Always visible when family feature is enabled (independent of Live Mode) #### 2. WebSocket Manager ([utils/websocket_manager.js](utils/websocket_manager.js)) - Manages ActionCable connection lifecycle - Automatic reconnection with exponential backoff (max 5 attempts) - Connection state tracking and callbacks - Error handling #### 3. Map Channel ([channels/map_channel.js](channels/map_channel.js)) Wraps existing ActionCable channels: - **FamilyLocationsChannel** - Always subscribed when family feature enabled - **PointsChannel** - Only subscribed when Live Mode is enabled - **NotificationsChannel** - Always subscribed **Important**: The `enableLiveMode` option controls PointsChannel subscription: ```javascript createMapChannel({ enableLiveMode: true, // Toggle PointsChannel on/off connected: callback, disconnected: callback, received: callback }) ``` #### 4. Realtime Controller ([controllers/maps_v2_realtime_controller.js](../../controllers/maps_v2_realtime_controller.js)) - Stimulus controller managing real-time updates - Handles Live Mode toggle from settings panel - Routes received data to appropriate layers - Shows toast notifications for events - Updates connection indicator ## User Controls ### Live Mode Toggle Located in Settings Panel: - **Checkbox**: "Live Mode (Show New Points)" - **Action**: `maps-v2-realtime#toggleLiveMode` - **Effect**: Subscribes/unsubscribes to PointsChannel - **Default**: Disabled (user must opt-in) ### Family Locations - Always enabled when family feature is on - No user toggle (automatically managed) - Independent of Live Mode setting ## Connection Indicator Visual indicator at top-center of map: - **Disconnected**: Red pulsing dot with "Connecting..." text - **Connected**: Green solid dot with "Connected" text - Automatically updates based on ActionCable connection state ## Data Flow ### Live Mode (User's Own Points) ``` Point.create (Rails) → after_create_commit :broadcast_coordinates → PointsChannel.broadcast_to(user, point_data) → RealtimeController.handleReceived({ type: 'new_point', point: ... }) → PointsLayer.update(adds new point to map) → Toast notification: "New location recorded" ``` ### Family Locations ``` Point.create (Rails) → after_create_commit :broadcast_coordinates → if should_broadcast_to_family? → FamilyLocationsChannel.broadcast_to(family, member_data) → RealtimeController.handleReceived({ type: 'family_location', member: ... }) → FamilyLayer.updateMember(member) → Member marker updates with pulse animation ``` ## Integration with Existing Code ### Backend (Rails) No changes needed! Leverages existing: - `Point#broadcast_coordinates` (app/models/point.rb:77) - `Point#broadcast_to_family` (app/models/point.rb:106) - `FamilyLocationsChannel` (app/channels/family_locations_channel.rb) - `PointsChannel` (app/channels/points_channel.rb) ### Frontend (Maps V2) - Family layer added to layer stack (between photos and points) - Settings panel includes Live Mode toggle - Connection indicator shows ActionCable status - Realtime controller coordinates all real-time features ## Settings Persistence Settings are managed by `SettingsManager`: - Live Mode state could be persisted to localStorage (future enhancement) - Family locations always follow family feature flag - No server-side settings changes needed ## Error Handling All components include defensive error handling: - Try-catch blocks around channel subscriptions - Graceful degradation if ActionCable unavailable - Console warnings for debugging - Page continues to load even if real-time features fail ## Testing E2E tests cover: - Family layer existence and sub-layers - Connection indicator visibility - Live Mode toggle functionality - Regression tests for all previous phases - Performance metrics Test file: [e2e/v2/phase-7-realtime.spec.js](../../../../e2e/v2/phase-7-realtime.spec.js) ## Known Limitations 1. **Initialization Issue**: Realtime controller currently disabled by default due to map initialization race condition 2. **Persistence**: Live Mode state not persisted across page reloads 3. **Performance**: No rate limiting on incoming points (could be added if needed) ## Future Enhancements 1. **Settings Persistence**: Save Live Mode state to localStorage 2. **Rate Limiting**: Throttle point updates if too frequent 3. **Replay Feature**: Show recent points when enabling Live Mode 4. **Family Member Controls**: Individual toggle for each family member 5. **Sound Notifications**: Optional sound when new points arrive 6. **Battery Optimization**: Adjust update frequency based on battery level ## Configuration No environment variables needed. Features are controlled by: - `DawarichSettings.family_feature_enabled?` - Enables family locations - User toggle - Enables Live Mode ## Deployment Phase 7 is ready for deployment once the initialization issue is resolved. All infrastructure is in place: - ✅ All code files created - ✅ Error handling implemented - ✅ Integration with existing ActionCable - ✅ E2E tests written - ⚠️ Realtime controller needs initialization debugging ## Files Modified/Created ### New Files - `app/javascript/maps_v2/layers/family_layer.js` - `app/javascript/maps_v2/utils/websocket_manager.js` - `app/javascript/maps_v2/channels/map_channel.js` - `app/javascript/controllers/maps_v2_realtime_controller.js` - `e2e/v2/phase-7-realtime.spec.js` - `app/javascript/maps_v2/PHASE_7_IMPLEMENTATION.md` (this file) ### Modified Files - `app/javascript/controllers/maps_v2_controller.js` - Added family layer integration - `app/views/maps_v2/index.html.erb` - Added connection indicator UI - `app/views/maps_v2/_settings_panel.html.erb` - Added Live Mode toggle ## Summary Phase 7 successfully implements real-time location updates with clear separation of concerns: - **Family locations** are always visible (when feature enabled) - **Live Mode** is user-controlled (opt-in for own points) - Both features use existing Rails infrastructure - Graceful error handling prevents page breakage - Complete E2E test coverage The implementation respects user privacy by making Live Mode opt-in while keeping family sharing always available as a collaborative feature.