diff --git a/mobile/lib/domain/services/timeline.service.dart b/mobile/lib/domain/services/timeline.service.dart index 618ccd250f..5bd6f4844e 100644 --- a/mobile/lib/domain/services/timeline.service.dart +++ b/mobile/lib/domain/services/timeline.service.dart @@ -53,6 +53,13 @@ class TimelineFactory { bucketSource: () => _timelineRepository.watchRemoteBucket(albumId, groupBy: groupBy), ); + + TimelineService people(String userId) => TimelineService( + assetSource: (offset, count) => _timelineRepository + .getPeopleBucketAssets(userId, offset: offset, count: count), + bucketSource: () => + _timelineRepository.watchPeopleBucket(userId, groupBy: groupBy), + ); } class TimelineService { diff --git a/mobile/lib/infrastructure/repositories/timeline.repository.dart b/mobile/lib/infrastructure/repositories/timeline.repository.dart index fcd92cb30c..5a41c1e361 100644 --- a/mobile/lib/infrastructure/repositories/timeline.repository.dart +++ b/mobile/lib/infrastructure/repositories/timeline.repository.dart @@ -213,6 +213,21 @@ class DriftTimelineRepository extends DriftDatabaseRepository { .map((row) => row.readTable(_db.remoteAssetEntity).toDto()) .get(); } + + Stream> watchPeopleBucket( + String userId, { + GroupAssetsBy groupBy = GroupAssetsBy.day, + }) { + + } + + Future> getPeopleBucketAssets( + String userId, { + required int offset, + required int count, + }) { + + } } extension on Expression { diff --git a/mobile/lib/presentation/pages/dev/drift_people.page.dart b/mobile/lib/presentation/pages/dev/drift_people.page.dart new file mode 100644 index 0000000000..6f5937aaf8 --- /dev/null +++ b/mobile/lib/presentation/pages/dev/drift_people.page.dart @@ -0,0 +1,32 @@ +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 DriftPeoplePage extends StatelessWidget { + const DriftPeoplePage({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 prople'); + } + + final timelineService = ref.watch(timelineFactoryProvider).people(user.id); + ref.onDispose(timelineService.dispose); + return timelineService; + }, + ), + ], + child: const Timeline(), + ); + } +} diff --git a/mobile/lib/presentation/pages/dev/feat_in_development.page.dart b/mobile/lib/presentation/pages/dev/feat_in_development.page.dart index f10c042e10..2fdb096b2f 100644 --- a/mobile/lib/presentation/pages/dev/feat_in_development.page.dart +++ b/mobile/lib/presentation/pages/dev/feat_in_development.page.dart @@ -96,6 +96,11 @@ final _features = [ icon: Icons.timeline_rounded, onTap: (ctx, _) => ctx.pushRoute(const TabShellRoute()), ), + _Feature( + name: 'People', + icon: Icons.people_outline_rounded, + onTap: (ctx, _) => ctx.pushRoute(const DriftPeopleRoute()), + ), ]; @RoutePage() diff --git a/mobile/lib/routing/router.dart b/mobile/lib/routing/router.dart index 56e1aa0f96..4bf2af93ee 100644 --- a/mobile/lib/routing/router.dart +++ b/mobile/lib/routing/router.dart @@ -66,6 +66,7 @@ import 'package:immich_mobile/pages/search/person_result.page.dart'; import 'package:immich_mobile/pages/search/recently_taken.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/presentation/pages/dev/drift_people.page.dart'; import 'package:immich_mobile/presentation/pages/dev/feat_in_development.page.dart'; import 'package:immich_mobile/presentation/pages/dev/local_timeline.page.dart'; import 'package:immich_mobile/presentation/pages/dev/main_timeline.page.dart'; @@ -392,7 +393,10 @@ class AppRouter extends RootStackRouter { page: DriftMemoryRoute.page, guards: [_authGuard, _duplicateGuard], ), - + AutoRoute( + page: DriftPeopleRoute.page, + guards: [_authGuard, _duplicateGuard], + ), // required to handle all deeplinks in deep_link.service.dart // auto_route_library#1722 RedirectRoute(path: '*', redirectTo: '/'), diff --git a/mobile/lib/routing/router.gr.dart b/mobile/lib/routing/router.gr.dart index f8f37970f9..8e20811fc1 100644 --- a/mobile/lib/routing/router.gr.dart +++ b/mobile/lib/routing/router.gr.dart @@ -670,6 +670,22 @@ class DriftMemoryRouteArgs { } } +/// generated route for +/// [DriftPeoplePage] +class DriftPeopleRoute extends PageRouteInfo { + const DriftPeopleRoute({List? children}) + : super(DriftPeopleRoute.name, initialChildren: children); + + static const String name = 'DriftPeopleRoute'; + + static PageInfo page = PageInfo( + name, + builder: (data) { + return const DriftPeoplePage(); + }, + ); +} + /// generated route for /// [EditImagePage] class EditImageRoute extends PageRouteInfo {