feat(mobile): drift recently taken page (#19814)

* feat(mobile): drift recently taken page

* fix: lint

* refactor(mobile): timeline queries (#19818)

refactor: remote assets query to take single user id

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>

---------

Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
pull/19815/head^2
Daimolean 2025-07-08 21:54:29 +07:00 committed by GitHub
parent df4a27e8a7
commit 172388c455
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 158 additions and 60 deletions

@ -58,11 +58,11 @@ class TimelineFactory {
), ),
); );
TimelineService remoteAssets(List<String> timelineUsers) => TimelineService( TimelineService remoteAssets(String ownerId) => TimelineService(
assetSource: (offset, count) => _timelineRepository assetSource: (offset, count) => _timelineRepository
.getRemoteBucketAssets(timelineUsers, offset: offset, count: count), .getRemoteBucketAssets(ownerId, offset: offset, count: count),
bucketSource: () => _timelineRepository.watchRemoteBucket( bucketSource: () => _timelineRepository.watchRemoteBucket(
timelineUsers, ownerId,
groupBy: GroupAssetsBy.month, groupBy: GroupAssetsBy.month,
), ),
); );

@ -18,13 +18,21 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
_db.remoteAlbumAssetEntity.albumId.equalsExp(_db.remoteAlbumEntity.id), _db.remoteAlbumAssetEntity.albumId.equalsExp(_db.remoteAlbumEntity.id),
useColumns: false, useColumns: false,
), ),
leftOuterJoin(
_db.remoteAssetEntity,
_db.remoteAssetEntity.id.equalsExp(_db.remoteAlbumAssetEntity.assetId),
useColumns: false,
),
leftOuterJoin( leftOuterJoin(
_db.userEntity, _db.userEntity,
_db.userEntity.id.equalsExp(_db.remoteAlbumEntity.ownerId), _db.userEntity.id.equalsExp(_db.remoteAlbumEntity.ownerId),
useColumns: false,
), ),
]); ]);
query query
..where(_db.remoteAssetEntity.deletedAt.isNull())
..addColumns([assetCount]) ..addColumns([assetCount])
..addColumns([_db.userEntity.name])
..groupBy([_db.remoteAlbumEntity.id]); ..groupBy([_db.remoteAlbumEntity.id]);
if (sortBy.isNotEmpty) { if (sortBy.isNotEmpty) {
@ -43,7 +51,7 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
.map( .map(
(row) => row.readTable(_db.remoteAlbumEntity).toDto( (row) => row.readTable(_db.remoteAlbumEntity).toDto(
assetCount: row.read(assetCount) ?? 0, assetCount: row.read(assetCount) ?? 0,
ownerName: row.readTable(_db.userEntity).name, ownerName: row.read(_db.userEntity.name)!,
), ),
) )
.get(); .get();

@ -124,6 +124,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
innerJoin( innerJoin(
_db.localAlbumAssetEntity, _db.localAlbumAssetEntity,
_db.localAlbumAssetEntity.assetId.equalsExp(_db.localAssetEntity.id), _db.localAlbumAssetEntity.assetId.equalsExp(_db.localAssetEntity.id),
useColumns: false,
), ),
]) ])
..where(_db.localAlbumAssetEntity.albumId.equals(albumId)) ..where(_db.localAlbumAssetEntity.albumId.equals(albumId))
@ -147,6 +148,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
innerJoin( innerJoin(
_db.localAlbumAssetEntity, _db.localAlbumAssetEntity,
_db.localAlbumAssetEntity.assetId.equalsExp(_db.localAssetEntity.id), _db.localAlbumAssetEntity.assetId.equalsExp(_db.localAssetEntity.id),
useColumns: false,
), ),
], ],
) )
@ -179,9 +181,13 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
_db.remoteAlbumAssetEntity, _db.remoteAlbumAssetEntity,
_db.remoteAlbumAssetEntity.assetId _db.remoteAlbumAssetEntity.assetId
.equalsExp(_db.remoteAssetEntity.id), .equalsExp(_db.remoteAssetEntity.id),
useColumns: false,
), ),
]) ])
..where(_db.remoteAlbumAssetEntity.albumId.equals(albumId)) ..where(
_db.remoteAssetEntity.deletedAt.isNull() &
_db.remoteAlbumAssetEntity.albumId.equals(albumId),
)
..groupBy([dateExp]) ..groupBy([dateExp])
..orderBy([OrderingTerm.desc(dateExp)]); ..orderBy([OrderingTerm.desc(dateExp)]);
@ -203,10 +209,14 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
_db.remoteAlbumAssetEntity, _db.remoteAlbumAssetEntity,
_db.remoteAlbumAssetEntity.assetId _db.remoteAlbumAssetEntity.assetId
.equalsExp(_db.remoteAssetEntity.id), .equalsExp(_db.remoteAssetEntity.id),
useColumns: false,
), ),
], ],
) )
..where(_db.remoteAlbumAssetEntity.albumId.equals(albumId)) ..where(
_db.remoteAssetEntity.deletedAt.isNull() &
_db.remoteAlbumAssetEntity.albumId.equals(albumId),
)
..orderBy([OrderingTerm.desc(_db.remoteAssetEntity.createdAt)]) ..orderBy([OrderingTerm.desc(_db.remoteAssetEntity.createdAt)])
..limit(count, offset: offset); ..limit(count, offset: offset);
return query return query
@ -214,15 +224,17 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
.get(); .get();
} }
Stream<List<Bucket>> watchFavoriteBucket( Stream<List<Bucket>> watchRemoteBucket(
String userId, { String ownerId, {
GroupAssetsBy groupBy = GroupAssetsBy.day, GroupAssetsBy groupBy = GroupAssetsBy.day,
}) { }) {
if (groupBy == GroupAssetsBy.none) { if (groupBy == GroupAssetsBy.none) {
return _db.remoteAssetEntity return _db.remoteAssetEntity
.count( .count(
where: (row) => where: (row) =>
row.isFavorite.equals(true) & row.ownerId.equals(userId), row.deletedAt.isNull() &
row.visibility.equalsValue(AssetVisibility.timeline) &
row.ownerId.equals(ownerId),
) )
.map(_generateBuckets) .map(_generateBuckets)
.watchSingle(); .watchSingle();
@ -234,8 +246,10 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
final query = _db.remoteAssetEntity.selectOnly() final query = _db.remoteAssetEntity.selectOnly()
..addColumns([assetCountExp, dateExp]) ..addColumns([assetCountExp, dateExp])
..where( ..where(
_db.remoteAssetEntity.ownerId.equals(userId) & _db.remoteAssetEntity.deletedAt.isNull() &
_db.remoteAssetEntity.isFavorite.equals(true), _db.remoteAssetEntity.visibility
.equalsValue(AssetVisibility.timeline) &
_db.remoteAssetEntity.ownerId.equals(ownerId),
) )
..groupBy([dateExp]) ..groupBy([dateExp])
..orderBy([OrderingTerm.desc(dateExp)]); ..orderBy([OrderingTerm.desc(dateExp)]);
@ -247,14 +261,17 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
}).watch(); }).watch();
} }
Future<List<BaseAsset>> getFavoriteBucketAssets( Future<List<BaseAsset>> getRemoteBucketAssets(
String userId, { String ownerId, {
required int offset, required int offset,
required int count, required int count,
}) { }) {
final query = _db.remoteAssetEntity.select() final query = _db.remoteAssetEntity.select()
..where( ..where(
(row) => row.isFavorite.equals(true) & row.ownerId.equals(userId), (row) =>
row.deletedAt.isNull() &
row.visibility.equalsValue(AssetVisibility.timeline) &
row.ownerId.equals(ownerId),
) )
..orderBy([(row) => OrderingTerm.desc(row.createdAt)]) ..orderBy([(row) => OrderingTerm.desc(row.createdAt)])
..limit(count, offset: offset); ..limit(count, offset: offset);
@ -262,7 +279,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return query.map((row) => row.toDto()).get(); return query.map((row) => row.toDto()).get();
} }
Stream<List<Bucket>> watchTrashBucket( Stream<List<Bucket>> watchFavoriteBucket(
String userId, { String userId, {
GroupAssetsBy groupBy = GroupAssetsBy.day, GroupAssetsBy groupBy = GroupAssetsBy.day,
}) { }) {
@ -270,7 +287,9 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return _db.remoteAssetEntity return _db.remoteAssetEntity
.count( .count(
where: (row) => where: (row) =>
row.deletedAt.isNotNull() & row.ownerId.equals(userId), row.deletedAt.isNull() &
row.isFavorite.equals(true) &
row.ownerId.equals(userId),
) )
.map(_generateBuckets) .map(_generateBuckets)
.watchSingle(); .watchSingle();
@ -282,8 +301,9 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
final query = _db.remoteAssetEntity.selectOnly() final query = _db.remoteAssetEntity.selectOnly()
..addColumns([assetCountExp, dateExp]) ..addColumns([assetCountExp, dateExp])
..where( ..where(
_db.remoteAssetEntity.ownerId.equals(userId) & _db.remoteAssetEntity.deletedAt.isNull() &
_db.remoteAssetEntity.deletedAt.isNotNull(), _db.remoteAssetEntity.ownerId.equals(userId) &
_db.remoteAssetEntity.isFavorite.equals(true),
) )
..groupBy([dateExp]) ..groupBy([dateExp])
..orderBy([OrderingTerm.desc(dateExp)]); ..orderBy([OrderingTerm.desc(dateExp)]);
@ -295,14 +315,17 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
}).watch(); }).watch();
} }
Future<List<BaseAsset>> getTrashBucketAssets( Future<List<BaseAsset>> getFavoriteBucketAssets(
String userId, { String userId, {
required int offset, required int offset,
required int count, required int count,
}) { }) {
final query = _db.remoteAssetEntity.select() final query = _db.remoteAssetEntity.select()
..where( ..where(
(row) => row.deletedAt.isNotNull() & row.ownerId.equals(userId), (row) =>
row.deletedAt.isNull() &
row.isFavorite.equals(true) &
row.ownerId.equals(userId),
) )
..orderBy([(row) => OrderingTerm.desc(row.createdAt)]) ..orderBy([(row) => OrderingTerm.desc(row.createdAt)])
..limit(count, offset: offset); ..limit(count, offset: offset);
@ -310,7 +333,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return query.map((row) => row.toDto()).get(); return query.map((row) => row.toDto()).get();
} }
Stream<List<Bucket>> watchArchiveBucket( Stream<List<Bucket>> watchTrashBucket(
String userId, { String userId, {
GroupAssetsBy groupBy = GroupAssetsBy.day, GroupAssetsBy groupBy = GroupAssetsBy.day,
}) { }) {
@ -318,8 +341,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return _db.remoteAssetEntity return _db.remoteAssetEntity
.count( .count(
where: (row) => where: (row) =>
row.visibility.equalsValue(AssetVisibility.archive) & row.deletedAt.isNotNull() & row.ownerId.equals(userId),
row.ownerId.equals(userId),
) )
.map(_generateBuckets) .map(_generateBuckets)
.watchSingle(); .watchSingle();
@ -332,8 +354,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
..addColumns([assetCountExp, dateExp]) ..addColumns([assetCountExp, dateExp])
..where( ..where(
_db.remoteAssetEntity.ownerId.equals(userId) & _db.remoteAssetEntity.ownerId.equals(userId) &
_db.remoteAssetEntity.visibility _db.remoteAssetEntity.deletedAt.isNotNull(),
.equalsValue(AssetVisibility.archive),
) )
..groupBy([dateExp]) ..groupBy([dateExp])
..orderBy([OrderingTerm.desc(dateExp)]); ..orderBy([OrderingTerm.desc(dateExp)]);
@ -345,16 +366,14 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
}).watch(); }).watch();
} }
Future<List<BaseAsset>> getArchiveBucketAssets( Future<List<BaseAsset>> getTrashBucketAssets(
String userId, { String userId, {
required int offset, required int offset,
required int count, required int count,
}) { }) {
final query = _db.remoteAssetEntity.select() final query = _db.remoteAssetEntity.select()
..where( ..where(
(row) => (row) => row.deletedAt.isNotNull() & row.ownerId.equals(userId),
row.ownerId.equals(userId) &
row.visibility.equalsValue(AssetVisibility.archive),
) )
..orderBy([(row) => OrderingTerm.desc(row.createdAt)]) ..orderBy([(row) => OrderingTerm.desc(row.createdAt)])
..limit(count, offset: offset); ..limit(count, offset: offset);
@ -362,7 +381,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return query.map((row) => row.toDto()).get(); return query.map((row) => row.toDto()).get();
} }
Stream<List<Bucket>> watchLockedFolderBucket( Stream<List<Bucket>> watchArchiveBucket(
String userId, { String userId, {
GroupAssetsBy groupBy = GroupAssetsBy.day, GroupAssetsBy groupBy = GroupAssetsBy.day,
}) { }) {
@ -370,7 +389,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return _db.remoteAssetEntity return _db.remoteAssetEntity
.count( .count(
where: (row) => where: (row) =>
row.visibility.equalsValue(AssetVisibility.locked) & row.deletedAt.isNull() &
row.visibility.equalsValue(AssetVisibility.archive) &
row.ownerId.equals(userId), row.ownerId.equals(userId),
) )
.map(_generateBuckets) .map(_generateBuckets)
@ -383,9 +403,10 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
final query = _db.remoteAssetEntity.selectOnly() final query = _db.remoteAssetEntity.selectOnly()
..addColumns([assetCountExp, dateExp]) ..addColumns([assetCountExp, dateExp])
..where( ..where(
_db.remoteAssetEntity.ownerId.equals(userId) & _db.remoteAssetEntity.deletedAt.isNull() &
_db.remoteAssetEntity.ownerId.equals(userId) &
_db.remoteAssetEntity.visibility _db.remoteAssetEntity.visibility
.equalsValue(AssetVisibility.locked), .equalsValue(AssetVisibility.archive),
) )
..groupBy([dateExp]) ..groupBy([dateExp])
..orderBy([OrderingTerm.desc(dateExp)]); ..orderBy([OrderingTerm.desc(dateExp)]);
@ -397,7 +418,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
}).watch(); }).watch();
} }
Future<List<BaseAsset>> getLockedFolderBucketAssets( Future<List<BaseAsset>> getArchiveBucketAssets(
String userId, { String userId, {
required int offset, required int offset,
required int count, required int count,
@ -405,8 +426,9 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
final query = _db.remoteAssetEntity.select() final query = _db.remoteAssetEntity.select()
..where( ..where(
(row) => (row) =>
row.visibility.equalsValue(AssetVisibility.locked) & row.deletedAt.isNull() &
row.ownerId.equals(userId), row.ownerId.equals(userId) &
row.visibility.equalsValue(AssetVisibility.archive),
) )
..orderBy([(row) => OrderingTerm.desc(row.createdAt)]) ..orderBy([(row) => OrderingTerm.desc(row.createdAt)])
..limit(count, offset: offset); ..limit(count, offset: offset);
@ -414,7 +436,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return query.map((row) => row.toDto()).get(); return query.map((row) => row.toDto()).get();
} }
Stream<List<Bucket>> watchVideoBucket( Stream<List<Bucket>> watchLockedFolderBucket(
String userId, { String userId, {
GroupAssetsBy groupBy = GroupAssetsBy.day, GroupAssetsBy groupBy = GroupAssetsBy.day,
}) { }) {
@ -422,8 +444,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return _db.remoteAssetEntity return _db.remoteAssetEntity
.count( .count(
where: (row) => where: (row) =>
row.type.equalsValue(AssetType.video) & row.deletedAt.isNull() &
row.visibility.equalsValue(AssetVisibility.timeline) & row.visibility.equalsValue(AssetVisibility.locked) &
row.ownerId.equals(userId), row.ownerId.equals(userId),
) )
.map(_generateBuckets) .map(_generateBuckets)
@ -436,10 +458,10 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
final query = _db.remoteAssetEntity.selectOnly() final query = _db.remoteAssetEntity.selectOnly()
..addColumns([assetCountExp, dateExp]) ..addColumns([assetCountExp, dateExp])
..where( ..where(
_db.remoteAssetEntity.ownerId.equals(userId) & _db.remoteAssetEntity.deletedAt.isNull() &
_db.remoteAssetEntity.type.equalsValue(AssetType.video) & _db.remoteAssetEntity.ownerId.equals(userId) &
_db.remoteAssetEntity.visibility _db.remoteAssetEntity.visibility
.equalsValue(AssetVisibility.timeline), .equalsValue(AssetVisibility.locked),
) )
..groupBy([dateExp]) ..groupBy([dateExp])
..orderBy([OrderingTerm.desc(dateExp)]); ..orderBy([OrderingTerm.desc(dateExp)]);
@ -451,7 +473,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
}).watch(); }).watch();
} }
Future<List<BaseAsset>> getVideoBucketAssets( Future<List<BaseAsset>> getLockedFolderBucketAssets(
String userId, { String userId, {
required int offset, required int offset,
required int count, required int count,
@ -459,10 +481,9 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
final query = _db.remoteAssetEntity.select() final query = _db.remoteAssetEntity.select()
..where( ..where(
(row) => (row) =>
_db.remoteAssetEntity.type.equalsValue(AssetType.video) & row.deletedAt.isNull() &
_db.remoteAssetEntity.visibility row.visibility.equalsValue(AssetVisibility.locked) &
.equalsValue(AssetVisibility.timeline) & row.ownerId.equals(userId),
_db.remoteAssetEntity.ownerId.equals(userId),
) )
..orderBy([(row) => OrderingTerm.desc(row.createdAt)]) ..orderBy([(row) => OrderingTerm.desc(row.createdAt)])
..limit(count, offset: offset); ..limit(count, offset: offset);
@ -470,8 +491,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
return query.map((row) => row.toDto()).get(); return query.map((row) => row.toDto()).get();
} }
Stream<List<Bucket>> watchRemoteBucket( Stream<List<Bucket>> watchVideoBucket(
List<String> userIds, { String userId, {
GroupAssetsBy groupBy = GroupAssetsBy.day, GroupAssetsBy groupBy = GroupAssetsBy.day,
}) { }) {
if (groupBy == GroupAssetsBy.none) { if (groupBy == GroupAssetsBy.none) {
@ -479,8 +500,9 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
.count( .count(
where: (row) => where: (row) =>
row.deletedAt.isNull() & row.deletedAt.isNull() &
row.type.equalsValue(AssetType.video) &
row.visibility.equalsValue(AssetVisibility.timeline) & row.visibility.equalsValue(AssetVisibility.timeline) &
row.ownerId.isIn(userIds), row.ownerId.equals(userId),
) )
.map(_generateBuckets) .map(_generateBuckets)
.watchSingle(); .watchSingle();
@ -493,9 +515,10 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
..addColumns([assetCountExp, dateExp]) ..addColumns([assetCountExp, dateExp])
..where( ..where(
_db.remoteAssetEntity.deletedAt.isNull() & _db.remoteAssetEntity.deletedAt.isNull() &
_db.remoteAssetEntity.ownerId.equals(userId) &
_db.remoteAssetEntity.type.equalsValue(AssetType.video) &
_db.remoteAssetEntity.visibility _db.remoteAssetEntity.visibility
.equalsValue(AssetVisibility.timeline) & .equalsValue(AssetVisibility.timeline),
_db.remoteAssetEntity.ownerId.isIn(userIds),
) )
..groupBy([dateExp]) ..groupBy([dateExp])
..orderBy([OrderingTerm.desc(dateExp)]); ..orderBy([OrderingTerm.desc(dateExp)]);
@ -507,8 +530,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
}).watch(); }).watch();
} }
Future<List<BaseAsset>> getRemoteBucketAssets( Future<List<BaseAsset>> getVideoBucketAssets(
List<String> userIds, { String userId, {
required int offset, required int offset,
required int count, required int count,
}) { }) {
@ -516,10 +539,11 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
..where( ..where(
(row) => (row) =>
row.deletedAt.isNull() & row.deletedAt.isNull() &
row.type.equalsValue(AssetType.video) &
row.visibility.equalsValue(AssetVisibility.timeline) & row.visibility.equalsValue(AssetVisibility.timeline) &
row.ownerId.isIn(userIds), row.ownerId.equals(userId),
) )
..orderBy([(t) => OrderingTerm.desc(t.createdAt)]) ..orderBy([(row) => OrderingTerm.desc(row.createdAt)])
..limit(count, offset: offset); ..limit(count, offset: offset);
return query.map((row) => row.toDto()).get(); return query.map((row) => row.toDto()).get();

@ -0,0 +1,35 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@RoutePage()
class DriftRecentlyTakenPage extends StatelessWidget {
const DriftRecentlyTakenPage({super.key});
@override
Widget build(BuildContext context) {
return ProviderScope(
overrides: [
timelineServiceProvider.overrideWith(
(ref) {
final user = ref.watch(currentUserProvider);
if (user == null) {
throw Exception(
'User must be logged in to access recently taken',
);
}
final timelineService =
ref.watch(timelineFactoryProvider).remoteAssets(user.id);
ref.onDispose(timelineService.dispose);
return timelineService;
},
),
],
child: const Timeline(),
);
}
}

@ -132,6 +132,11 @@ final _features = [
icon: Icons.video_collection_outlined, icon: Icons.video_collection_outlined,
onTap: (ctx, _) => ctx.pushRoute(const DriftVideoRoute()), onTap: (ctx, _) => ctx.pushRoute(const DriftVideoRoute()),
), ),
_Feature(
name: 'Recently Taken',
icon: Icons.schedule_outlined,
onTap: (ctx, _) => ctx.pushRoute(const DriftRecentlyTakenRoute()),
),
]; ];
@RoutePage() @RoutePage()

@ -5,6 +5,7 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart'; import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart'; import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@RoutePage() @RoutePage()
class DriftAssetSelectionTimelinePage extends ConsumerWidget { class DriftAssetSelectionTimelinePage extends ConsumerWidget {
@ -29,10 +30,15 @@ class DriftAssetSelectionTimelinePage extends ConsumerWidget {
), ),
timelineServiceProvider.overrideWith( timelineServiceProvider.overrideWith(
(ref) { (ref) {
final timelineUsers = final user = ref.watch(currentUserProvider);
ref.watch(timelineUsersProvider).valueOrNull ?? []; if (user == null) {
throw Exception(
'User must be logged in to access recently taken',
);
}
final timelineService = final timelineService =
ref.watch(timelineFactoryProvider).remoteAssets(timelineUsers); ref.watch(timelineFactoryProvider).remoteAssets(user.id);
ref.onDispose(timelineService.dispose); ref.onDispose(timelineService.dispose);
return timelineService; return timelineService;
}, },

@ -68,6 +68,7 @@ import 'package:immich_mobile/pages/search/recently_taken.page.dart';
import 'package:immich_mobile/pages/search/search.page.dart'; import 'package:immich_mobile/pages/search/search.page.dart';
import 'package:immich_mobile/pages/share_intent/share_intent.page.dart'; import 'package:immich_mobile/pages/share_intent/share_intent.page.dart';
import 'package:immich_mobile/presentation/pages/dev/drift_favorite.page.dart'; import 'package:immich_mobile/presentation/pages/dev/drift_favorite.page.dart';
import 'package:immich_mobile/presentation/pages/dev/drift_recently_taken.page.dart';
import 'package:immich_mobile/presentation/pages/dev/drift_video.page.dart'; import 'package:immich_mobile/presentation/pages/dev/drift_video.page.dart';
import 'package:immich_mobile/presentation/pages/dev/drift_trash.page.dart'; import 'package:immich_mobile/presentation/pages/dev/drift_trash.page.dart';
import 'package:immich_mobile/presentation/pages/dev/drift_archive.page.dart'; import 'package:immich_mobile/presentation/pages/dev/drift_archive.page.dart';
@ -428,7 +429,10 @@ class AppRouter extends RootStackRouter {
page: DriftAssetSelectionTimelineRoute.page, page: DriftAssetSelectionTimelineRoute.page,
guards: [_authGuard, _duplicateGuard], guards: [_authGuard, _duplicateGuard],
), ),
AutoRoute(
page: DriftRecentlyTakenRoute.page,
guards: [_authGuard, _duplicateGuard],
),
// required to handle all deeplinks in deep_link.service.dart // required to handle all deeplinks in deep_link.service.dart
// auto_route_library#1722 // auto_route_library#1722
RedirectRoute(path: '*', redirectTo: '/'), RedirectRoute(path: '*', redirectTo: '/'),

@ -783,6 +783,22 @@ class DriftMemoryRouteArgs {
} }
} }
/// generated route for
/// [DriftRecentlyTakenPage]
class DriftRecentlyTakenRoute extends PageRouteInfo<void> {
const DriftRecentlyTakenRoute({List<PageRouteInfo>? children})
: super(DriftRecentlyTakenRoute.name, initialChildren: children);
static const String name = 'DriftRecentlyTakenRoute';
static PageInfo page = PageInfo(
name,
builder: (data) {
return const DriftRecentlyTakenPage();
},
);
}
/// generated route for /// generated route for
/// [DriftTrashPage] /// [DriftTrashPage]
class DriftTrashRoute extends PageRouteInfo<void> { class DriftTrashRoute extends PageRouteInfo<void> {