From 72a53f43c82f59b4be43e3d5c61f8dd83af51536 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Fri, 27 Jun 2025 18:59:27 +0530 Subject: [PATCH] feat: use sqlite timeline user provider (#19577) use sqlite timeline user provider Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- .../repositories/timeline.repository.dart | 15 +++++++++++++++ .../pages/dev/main_timeline.page.dart | 8 ++++---- .../infrastructure/timeline.provider.dart | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/mobile/lib/infrastructure/repositories/timeline.repository.dart b/mobile/lib/infrastructure/repositories/timeline.repository.dart index 7f5591c047..18abac99de 100644 --- a/mobile/lib/infrastructure/repositories/timeline.repository.dart +++ b/mobile/lib/infrastructure/repositories/timeline.repository.dart @@ -15,6 +15,21 @@ class DriftTimelineRepository extends DriftDatabaseRepository { const DriftTimelineRepository(super._db) : _db = _db; + Stream> watchTimelineUserIds(String userId) { + final query = _db.partnerEntity.selectOnly() + ..addColumns([_db.partnerEntity.sharedById]) + ..where( + _db.partnerEntity.inTimeline.equals(true) & + _db.partnerEntity.sharedWithId.equals(userId), + ); + + return query + .map((row) => row.read(_db.partnerEntity.sharedById)!) + .watch() + // Add current user ID to the list + .map((users) => users..add(userId)); + } + List _generateBuckets(int count) { final numBuckets = (count / kTimelineNoneSegmentSize).floor(); final buckets = List.generate( diff --git a/mobile/lib/presentation/pages/dev/main_timeline.page.dart b/mobile/lib/presentation/pages/dev/main_timeline.page.dart index 8c04f129eb..5ed7d88c4b 100644 --- a/mobile/lib/presentation/pages/dev/main_timeline.page.dart +++ b/mobile/lib/presentation/pages/dev/main_timeline.page.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.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 MainTimelinePage extends StatelessWidget { @@ -17,9 +16,10 @@ class MainTimelinePage extends StatelessWidget { overrides: [ timelineServiceProvider.overrideWith( (ref) { - final timelineService = ref - .watch(timelineFactoryProvider) - .main(ref.watch(timelineUsersIdsProvider)); + final timelineUsers = + ref.watch(timelineUsersProvider).valueOrNull ?? []; + final timelineService = + ref.watch(timelineFactoryProvider).main(timelineUsers); ref.onDispose(() => unawaited(timelineService.dispose())); return timelineService; }, diff --git a/mobile/lib/providers/infrastructure/timeline.provider.dart b/mobile/lib/providers/infrastructure/timeline.provider.dart index 4172e559c4..0bf8b1b143 100644 --- a/mobile/lib/providers/infrastructure/timeline.provider.dart +++ b/mobile/lib/providers/infrastructure/timeline.provider.dart @@ -4,6 +4,7 @@ import 'package:immich_mobile/infrastructure/repositories/timeline.repository.da import 'package:immich_mobile/presentation/widgets/timeline/timeline.state.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/setting.provider.dart'; +import 'package:immich_mobile/providers/user.provider.dart'; final timelineRepositoryProvider = Provider( (ref) => DriftTimelineRepository(ref.watch(driftProvider)), @@ -25,3 +26,16 @@ final timelineFactoryProvider = Provider( settingsService: ref.watch(settingsProvider), ), ); + +final timelineUsersProvider = StreamProvider>( + (ref) { + final currentUserId = ref.watch(currentUserProvider.select((u) => u?.id)); + if (currentUserId == null) { + return Stream.value([]); + } + + return ref + .watch(timelineRepositoryProvider) + .watchTimelineUserIds(currentUserId); + }, +);