Skip to content

Commit

Permalink
fix(mobile): debounce map layer update (#6861)
Browse files Browse the repository at this point in the history
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
  • Loading branch information
shenlong-tanwen and shenlong-tanwen committed Feb 5, 2024
1 parent f4ab5d3 commit 1d93889
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 1 deletion.
11 changes: 11 additions & 0 deletions mobile/lib/extensions/maplibrecontroller_extensions.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:math';

import 'package:flutter/services.dart';
Expand All @@ -6,6 +7,8 @@ import 'package:immich_mobile/modules/map/utils/map_utils.dart';
import 'package:maplibre_gl/maplibre_gl.dart';

extension MapMarkers on MaplibreMapController {
static var _completer = Completer()..complete();

Future<void> addGeoJSONSourceForMarkers(List<MapMarker> markers) async {
return addSource(
MapUtils.defaultSourceId,
Expand All @@ -16,6 +19,12 @@ extension MapMarkers on MaplibreMapController {
}

Future<void> reloadAllLayersForMarkers(List<MapMarker> markers) async {
// Wait for previous reload to complete
if (!_completer.isCompleted) {
return _completer.future;
}
_completer = Completer();

// !! Make sure to remove layers before sources else the native
// maplibre library would crash when removing the source saying that
// the source is still in use
Expand All @@ -36,6 +45,8 @@ extension MapMarkers on MaplibreMapController {
MapUtils.defaultHeatMapLayerId,
MapUtils.defaultHeatMapLayerProperties,
);

_completer.complete();
}

Future<Symbol?> addMarkerAtLatLng(LatLng centre) async {
Expand Down
5 changes: 4 additions & 1 deletion mobile/lib/modules/map/views/map_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class MapPage extends HookConsumerWidget {
final bottomSheetStreamController = useStreamController<MapEvent>();
final selectedMarker = useValueNotifier<_AssetMarkerMeta?>(null);
final assetsDebouncer = useDebouncer();
final layerDebouncer = useDebouncer(interval: const Duration(seconds: 1));
final isLoading = useProcessingOverlay();
final scrollController = useScrollController();
final markerDebouncer =
Expand Down Expand Up @@ -77,7 +78,9 @@ class MapPage extends HookConsumerWidget {
// removes all sources and layers and re-adds them with the updated markers
Future<void> reloadLayers() async {
if (mapController.value != null) {
mapController.value!.reloadAllLayersForMarkers(markers.value);
layerDebouncer.run(
() => mapController.value!.reloadAllLayersForMarkers(markers.value),
);
}
}

Expand Down

0 comments on commit 1d93889

Please sign in to comment.