6.4 KiB
| id | title | status | assignee | created_date | updated_date | labels | dependencies | priority | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| task-039 | MapShape Integration: Connect Subsystems to Canvas Shape | Done | 2025-12-05 02:12 | 2025-12-05 03:41 |
|
|
high |
Description
Evolve MapShapeUtil.tsx to integrate the 6 implemented subsystems (privacy, mycelium, lenses, conics, discovery, presence) into the canvas map shape. Currently the MapShape is a standalone map viewer - it needs to become the central hub for all open-mapping features.
Acceptance Criteria
- #1 MapShape props extended for subsystem toggles
- #2 Presence layer integrated with opt-in location sharing
- #3 Lens system accessible via UI
- #4 Route/waypoint visualization working
- #5 Collaboration sync via Automerge
- #6 Discovery game elements visible on map
Implementation Notes
MapShape Evolution Progress (Dec 5, 2025):
Completed:
-
Extended IMapShape Props - Added comprehensive subsystem configuration types:
MapPresenceConfig- Location sharing with privacy levelsMapLensConfig- Alternative map projectionsMapDiscoveryConfig- Games, anchors, spores, huntsMapRoutingConfig- Waypoints, routes, alternativesMapConicsConfig- Possibility cones visualization
-
Header UI Controls - Subsystem toolbar with:
- ⚙️ Expandable subsystem panel
- Toggle buttons for each subsystem
- Lens selector dropdown (6 lens types)
- Share location button for presence
- Active subsystem indicators in header
-
Visualization Layers Added:
- Route polyline layer (MapLibre GeoJSON source/layer)
- Waypoint markers management
- Routing panel (bottom-right) with stats
- Presence panel (bottom-left) with share button
- Discovery panel (top-right) with checkboxes
- Lens indicator badge (top-left when active)
Still Needed:
- Actual MapLibre marker implementation for waypoints
- Integration with OSRM routing backend
- Connect presence system to actual location services
- Wire up discovery system to anchor/spore data
Additional Implementation (Dec 5, 2025):
Routing System - Fully Working:
- ✅ MapLibre.Marker implementation with draggable waypoints
- ✅ Click-to-add-waypoint when routing enabled
- ✅ OSRM routing service integration (public server)
- ✅ Auto-route calculation after adding/dragging waypoints
- ✅ Route polyline rendering with GeoJSON layer
- ✅ Clear route button with full state reset
- ✅ Loading indicator during route calculation
- ✅ Distance/duration display in routing panel
Presence System - Fully Working:
- ✅ Browser Geolocation API integration
- ✅ Location watching with configurable accuracy
- ✅ User location marker with pulsing animation
- ✅ Error handling (permission denied, unavailable, timeout)
- ✅ "Go to My Location" button with flyTo animation
- ✅ Privacy level affects GPS accuracy settings
- ✅ Real-time coordinate display when sharing
Still TODO:
- Discovery system anchor visualization
- Automerge sync for collaborative editing
Phase 5: Automerge Sync Integration - Analyzing existing sync architecture. TLDraw shapes sync automatically via TLStoreToAutomerge.ts. MapShape props should already sync since they're part of the shape record.
Automerge Sync Implementation Complete (Dec 5, 2025):
-
Collaborative sharedLocations - Added
sharedLocations: Record<string, SharedLocation>to MapPresenceConfig props -
Conflict-free updates - Each user updates only their own key in sharedLocations, allowing Automerge CRDT to handle concurrent updates automatically
-
Location sync effect - When user shares location, their coordinate is published to sharedLocations with userId, userName, color, timestamp, and privacyLevel
-
Auto-cleanup - User's entry is removed from sharedLocations when they stop sharing
-
Collaborator markers - Renders MapLibre markers for all other users' shared locations (different from user's own pulsing marker)
-
Stale location filtering - Collaborator locations older than 5 minutes are not rendered
-
UI updates - Presence panel now shows count of online collaborators
How it works:
-
MapShape props sync automatically via existing TLDraw → Automerge infrastructure
-
When user calls editor.updateShape() to update MapShape props, changes flow through TLStoreToAutomerge.ts
-
Remote changes come back via Automerge patches and update the shape's props
-
Each user only writes to their own key in sharedLocations, so no conflicts occur
Discovery Visualization Complete (Dec 5, 2025):
Added Display Types for Automerge Sync:
DiscoveryAnchorMarker- Simplified anchor data for map markersSporeMarker- Mycelium spore data with strength and connectionsHuntMarker- Treasure hunt waypoints with sequence numbers
MapDiscoveryConfig Extended:
anchors: DiscoveryAnchorMarker[]- Synced anchor dataspores: SporeMarker[]- Synced spore data with connection graphhunts: HuntMarker[]- Synced treasure hunt waypoints
Marker Rendering Implemented:
-
Anchor Markers - Circular markers with type-specific colors (physical=green, nfc=blue, qr=purple, virtual=amber). Hidden anchors shown with reduced opacity until discovered.
-
Spore Markers - Pulsing circular markers with radial gradients. Size scales with spore strength (40-100%). Animation keyframes for organic feel.
-
Mycelium Network - GeoJSON LineString layer connecting spores. Dashed green lines with 60% opacity visualize the network connections.
-
Hunt Markers - Numbered square markers for treasure hunts. Amber when not found, green with checkmark when discovered.
Discovery Panel Enhanced:
- Stats display showing counts: 📍 anchors, 🍄 spores, 🏆 hunts
- "+Add Anchor" button - Creates demo anchor at map center
- "+Add Spore" button - Creates demo spore with random connection
- "+Add Hunt Point" button - Creates treasure hunt waypoint
- "Clear All" button - Removes all discovery elements
How Automerge Sync Works:
- Discovery data stored in MapShape.props.discovery
- Shape updates via editor.updateShape() flow through TLStoreToAutomerge
- All collaborators see markers appear in real-time
- Each user can add/modify elements, CRDT handles conflicts