@@ -38,6 +38,10 @@ class ApiService {
3838 Function ? _onSessionExpiring;
3939 List <String > _channels = [];
4040
41+ /// Callback to get current GPS coordinates for heartbeat
42+ /// Returns (lat, lon) or null if GPS is not available
43+ ({double lat, double lon})? Function ()? _gpsProvider;
44+
4145 /// Regional channels from auth response (e.g., ['public', 'ottawa', 'testing'] )
4246 List <String > get channels => List .unmodifiable (_channels);
4347
@@ -271,15 +275,18 @@ class ApiService {
271275
272276 /// Enable heartbeat mode (called when auto mode starts)
273277 /// Heartbeat fires after 3 minutes of API inactivity to keep session alive
274- void enableHeartbeat () {
278+ /// @param gpsProvider Callback to get current GPS coordinates for heartbeat
279+ void enableHeartbeat ({({double lat, double lon})? Function ()? gpsProvider}) {
275280 _heartbeatEnabled = true ;
281+ _gpsProvider = gpsProvider;
276282 _resetHeartbeatTimer ();
277283 debugLog ('[API] Heartbeat mode enabled (3 min idle timeout)' );
278284 }
279285
280286 /// Disable heartbeat mode (called when auto mode stops)
281287 void disableHeartbeat () {
282288 _heartbeatEnabled = false ;
289+ _gpsProvider = null ;
283290 _heartbeatTimer? .cancel ();
284291 _heartbeatTimer = null ;
285292 debugLog ('[API] Heartbeat mode disabled' );
@@ -293,7 +300,11 @@ class ApiService {
293300 _heartbeatTimer? .cancel ();
294301 _heartbeatTimer = Timer (heartbeatIdleTimeout, () async {
295302 debugLog ('[API] Heartbeat timer fired (3 min idle), sending keepalive' );
296- final result = await sendHeartbeat ();
303+
304+ // Get GPS coordinates from provider (matching wardrive.js behavior)
305+ final coords = _gpsProvider? .call ();
306+ final result = await sendHeartbeat (lat: coords? .lat, lon: coords? .lon);
307+
297308 if (result? ['success' ] == true ) {
298309 debugLog ('[API] Heartbeat successful' );
299310 _resetHeartbeatTimer (); // Schedule next heartbeat
0 commit comments