dawarich/app/javascript/maps_v2/PHASE_7_IMPLEMENTATION.md
Eugene Burmakin f49b6d4434 Phase 7
2025-11-21 19:46:51 +01:00

6.7 KiB

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)

  • 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)

  • 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)

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:

createMapChannel({
  enableLiveMode: true, // Toggle PointsChannel on/off
  connected: callback,
  disconnected: callback,
  received: callback
})

4. Realtime Controller (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

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.