From 06c41fdcacd6b360bed577739b76a282efcf55a9 Mon Sep 17 00:00:00 2001 From: Santo Shakil Date: Fri, 6 Nov 2026 20:48:07 +0600 Subject: [PATCH] fix(mobile): show memories right after the first login (#33030) --- .../repositories/memory.repository.dart | 4 ++++ .../infrastructure/memory.provider.dart | 6 +++++- .../infrastructure/memory_provider_test.dart | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/mobile/lib/infrastructure/repositories/memory.repository.dart b/mobile/lib/infrastructure/repositories/memory.repository.dart index f9755e7f2..90bcce456 100644 --- a/mobile/lib/infrastructure/repositories/memory.repository.dart +++ b/mobile/lib/infrastructure/repositories/memory.repository.dart @@ -93,6 +93,10 @@ class MemoryRepository extends DatabaseAccessor with $MemoryRepositoryMix Future getCount() { return _db.managers.memoryEntity.count(); } + + Stream watchChanges() { + return _db.tableUpdates(TableUpdateQuery.onAllTables([_db.memoryEntity, _db.memoryAssetEntity])); + } } extension on MemoryEntityData { diff --git a/mobile/lib/providers/infrastructure/memory.provider.dart b/mobile/lib/providers/infrastructure/memory.provider.dart index 2362fec2c..2093711d6 100644 --- a/mobile/lib/providers/infrastructure/memory.provider.dart +++ b/mobile/lib/providers/infrastructure/memory.provider.dart @@ -17,7 +17,11 @@ final memoryLaneProvider = FutureProvider.autoDispose>((ref) { final timer = Timer(nextMidnight.difference(now) + const Duration(seconds: 5), ref.invalidateSelf); ref.onDispose(timer.cancel); - final service = MemoryService(ref.watch(driftProvider).memoryRepository); + final repository = ref.watch(driftProvider).memoryRepository; + final subscription = repository.watchChanges().listen((_) => ref.invalidateSelf()); + ref.onDispose(subscription.cancel); + + final service = MemoryService(repository); return service.getMemoryLane(userId); }); diff --git a/mobile/test/providers/infrastructure/memory_provider_test.dart b/mobile/test/providers/infrastructure/memory_provider_test.dart index 6ea3334d8..c397aefdd 100644 --- a/mobile/test/providers/infrastructure/memory_provider_test.dart +++ b/mobile/test/providers/infrastructure/memory_provider_test.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:fake_async/fake_async.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -48,6 +50,7 @@ void main() { userService = MockUserService(); when(() => memoryRepository.getAll('user-1')).thenAnswer((_) async => []); + when(() => memoryRepository.watchChanges()).thenAnswer((_) => const Stream.empty()); when(() => userService.tryGetMyUser()).thenReturn(user()); when(() => userService.watchMyUser()).thenAnswer((_) => const Stream.empty()); }); @@ -71,6 +74,22 @@ void main() { }); }); + test('re-queries when the memory tables change', () { + fakeAsync((async) { + final changes = StreamController.broadcast(); + when(() => memoryRepository.watchChanges()).thenAnswer((_) => changes.stream); + final container = makeContainer(); + container.listen(memoryLaneProvider, (_, _) {}); + async.flushMicrotasks(); + verify(() => memoryRepository.getAll('user-1')).called(1); + + changes.add(null); + async.elapse(Duration.zero); + verify(() => memoryRepository.getAll('user-1')).called(1); + unawaited(changes.close()); + }); + }); + test('cancels the midnight timer when disposed', () { fakeAsync((async) { final container = makeContainer();