feat(mobile): drift people page

This commit is contained in:
wuzihao051119 2025-07-06 14:44:57 +08:00
parent 2f5d75ce21
commit df8b9df5ee
6 changed files with 80 additions and 1 deletions

View File

@ -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 {

View File

@ -213,6 +213,21 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
.map((row) => row.readTable(_db.remoteAssetEntity).toDto())
.get();
}
Stream<List<Bucket>> watchPeopleBucket(
String userId, {
GroupAssetsBy groupBy = GroupAssetsBy.day,
}) {
}
Future<List<BaseAsset>> getPeopleBucketAssets(
String userId, {
required int offset,
required int count,
}) {
}
}
extension on Expression<DateTime> {

View File

@ -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(),
);
}
}

View File

@ -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()

View File

@ -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: '/'),

View File

@ -670,6 +670,22 @@ class DriftMemoryRouteArgs {
}
}
/// generated route for
/// [DriftPeoplePage]
class DriftPeopleRoute extends PageRouteInfo<void> {
const DriftPeopleRoute({List<PageRouteInfo>? 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<EditImageRouteArgs> {