mirror of
https://github.com/immich-app/immich.git
synced 2024-12-24 10:37:28 +02:00
cb391342d7
* feat(mobile): map page - add map view * map: add map-markers * feat(map): add relative date filter * fix: do not let users scroll past map bounds * fix: fetch relative date from store to state on init * feat(mobile):re-fetch markers only on filter change * feat(mobile) - asset bottom sheet in map page * feat(mobile): display markers based on bottom sheet scroll * fix: exif-bottom-sheet - rebase conflict * feat(mobile): map-view - strongly typed map page events * feat(map): zoom to asset * chore: dart analyzer fixes * map-page move attribution to top-right * feat(mobile): map view - asset selection handling * feat(mobile): map-view display map in places row * fix: make asset marker icon responsive * optimise map page rebuilds * refactor(mobile): map page * feat(mobile): map-view: Go to location * map-view(mobile): minor refactor * fix(mobile): Handle invalid coords gracefully * small styling --------- Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
59 lines
1.6 KiB
Dart
59 lines
1.6 KiB
Dart
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/modules/map/providers/map_state.provider.dart';
|
|
import 'package:immich_mobile/modules/map/services/map.service.dart';
|
|
import 'package:immich_mobile/shared/models/asset.dart';
|
|
import 'package:latlong2/latlong.dart';
|
|
|
|
final mapMarkersProvider =
|
|
FutureProvider.autoDispose<Set<AssetMarkerData>>((ref) async {
|
|
final service = ref.read(mapServiceProvider);
|
|
final mapState = ref.read(mapStateNotifier);
|
|
DateTime? fileCreatedAfter;
|
|
bool? isFavorite;
|
|
|
|
if (mapState.relativeTime != 0) {
|
|
fileCreatedAfter =
|
|
DateTime.now().subtract(Duration(days: mapState.relativeTime));
|
|
}
|
|
|
|
if (mapState.showFavoriteOnly) {
|
|
isFavorite = true;
|
|
}
|
|
|
|
final markers = await service.getMapMarkers(
|
|
isFavorite: isFavorite,
|
|
fileCreatedAfter: fileCreatedAfter,
|
|
);
|
|
|
|
final assetMarkerData = await Future.wait(
|
|
markers.map((e) async {
|
|
final asset = await service.getAssetForMarkerId(e.id);
|
|
bool hasInvalidCoords = e.lat < -90 || e.lat > 90;
|
|
hasInvalidCoords = hasInvalidCoords || (e.lon < -180 || e.lon > 180);
|
|
if (asset == null || hasInvalidCoords) return null;
|
|
return AssetMarkerData(asset, LatLng(e.lat, e.lon));
|
|
}),
|
|
);
|
|
|
|
return assetMarkerData.nonNulls.toSet();
|
|
});
|
|
|
|
class AssetMarkerData {
|
|
final LatLng point;
|
|
final Asset asset;
|
|
|
|
const AssetMarkerData(this.asset, this.point);
|
|
|
|
@override
|
|
bool operator ==(Object other) {
|
|
if (identical(this, other)) return true;
|
|
|
|
return other is AssetMarkerData && other.asset.remoteId == asset.remoteId;
|
|
}
|
|
|
|
@override
|
|
int get hashCode {
|
|
return asset.remoteId.hashCode;
|
|
}
|
|
}
|