feat(mobile): drift map page

This commit is contained in:
wuzihao051119 2025-07-16 15:18:27 +08:00 committed by mertalev
parent da5deffd03
commit d308d023c2
No known key found for this signature in database
GPG key ID: DF6ABC77AAD98C95
15 changed files with 783 additions and 0 deletions

View file

@ -0,0 +1,21 @@
import 'package:maplibre_gl/maplibre_gl.dart';
class Marker {
final LatLng location;
final String assetId;
const Marker({
required this.location,
required this.assetId,
});
@override
bool operator ==(covariant Marker other) {
if (identical(this, other)) return true;
return other.location == location && other.assetId == assetId;
}
@override
int get hashCode => location.hashCode ^ assetId.hashCode;
}

View file

@ -0,0 +1,36 @@
import 'package:immich_mobile/domain/models/map.model.dart';
import 'package:immich_mobile/infrastructure/repositories/map.repository.dart';
import 'package:maplibre_gl/maplibre_gl.dart';
typedef MapMarkerSource = Stream<List<Marker>> Function(LatLngBounds bounds);
class MapFactory {
final DriftMapRepository _mapRepository;
const MapFactory({
required DriftMapRepository mapRepository,
}) : _mapRepository = mapRepository;
MapService main(List<String> timelineUsers) => MapService(
markerSource: (bounds) =>
_mapRepository.watchMainMarker(timelineUsers, bounds: bounds),
);
MapService remoteAlbum({required String albumId}) => MapService(
markerSource: (bounds) =>
_mapRepository.watchRemoteAlbumMarker(albumId, bounds: bounds),
);
}
class MapService {
final MapMarkerSource _markerSource;
const MapService({
required MapMarkerSource markerSource,
}) : _markerSource = markerSource;
Stream<List<Marker>> Function(LatLngBounds bounds) get watchMarkers =>
_markerSource;
Future<void> dispose() async {}
}

View file

@ -10,6 +10,7 @@ import 'package:immich_mobile/domain/services/setting.service.dart';
import 'package:immich_mobile/domain/utils/event_stream.dart';
import 'package:immich_mobile/infrastructure/repositories/timeline.repository.dart';
import 'package:immich_mobile/utils/async_mutex.dart';
import 'package:maplibre_gl/maplibre_gl.dart';
typedef TimelineAssetSource = Future<List<BaseAsset>> Function(int index, int count);
@ -57,6 +58,9 @@ class TimelineFactory {
TimelineService(_timelineRepository.person(userId, personId, groupBy));
TimelineService fromAssets(List<BaseAsset> assets) => TimelineService(_timelineRepository.fromAssets(assets));
TimelineService map(LatLngBounds bounds) =>
TimelineService(_timelineRepository.map(bounds, groupBy));
}
class TimelineService {