diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart index e74b9fa6..a99360ee 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart @@ -108,7 +108,9 @@ class _BrowserViewState extends ConsumerState .deleteDataOnEngineStart(settings.deleteBrowsingDataOnQuit); if (settings.historyAutoCleanInterval > Duration.zero) { - await GeckoHistoryService().deleteVisitsBetween( + await ref + .read(historyRepositoryProvider.notifier) + .deleteVisitsBetween( DateTime(0), DateTime.now().subtract(settings.historyAutoCleanInterval), ); diff --git a/app/lib/features/geckoview/features/history/domain/providers.dart b/app/lib/features/geckoview/features/history/domain/providers.dart index 81ea2252..9b639b57 100644 --- a/app/lib/features/geckoview/features/history/domain/providers.dart +++ b/app/lib/features/geckoview/features/history/domain/providers.dart @@ -24,6 +24,7 @@ import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:riverpod/experimental/persist.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/features/geckoview/features/history/domain/entities/history_filter_options.dart'; +import 'package:weblibre/features/geckoview/features/history/domain/repositories/history.dart'; import 'package:weblibre/features/user/data/providers.dart'; part 'providers.g.dart'; @@ -67,14 +68,7 @@ class HistoryFilter extends _$HistoryFilter { Future> browsingHistory(Ref ref) { final options = ref.watch(historyFilterProvider); - final service = GeckoHistoryService(); - return service - .getDetailedVisits( - options.dateRange?.start ?? DateTime(0), - options.dateRange?.end ?? DateTime(9999), - options.visitTypes, - ) - .then( - (visits) => visits..sort((a, b) => b.visitTime.compareTo(a.visitTime)), - ); + return ref + .read(historyRepositoryProvider.notifier) + .getDetailedVisits(options); } diff --git a/app/lib/features/geckoview/features/history/domain/providers.g.dart b/app/lib/features/geckoview/features/history/domain/providers.g.dart index 40f86338..c3bedc44 100644 --- a/app/lib/features/geckoview/features/history/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/history/domain/providers.g.dart @@ -99,4 +99,4 @@ final class BrowsingHistoryProvider } } -String _$browsingHistoryHash() => r'6447fd4d8209c3befb07f2d82fa41a24bd3accb1'; +String _$browsingHistoryHash() => r'3b6ee5853387481d7544bc9733741a5519f84f40'; diff --git a/app/lib/features/geckoview/features/history/domain/repositories/history.dart b/app/lib/features/geckoview/features/history/domain/repositories/history.dart new file mode 100644 index 00000000..aab2931b --- /dev/null +++ b/app/lib/features/geckoview/features/history/domain/repositories/history.dart @@ -0,0 +1,42 @@ +import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:weblibre/features/geckoview/features/history/domain/entities/history_filter_options.dart'; + +part 'history.g.dart'; + +@Riverpod(keepAlive: true) +class HistoryRepository extends _$HistoryRepository { + final _service = GeckoHistoryService(); + + Future deleteVisitsBetween(DateTime start, DateTime end) { + return _service.deleteVisitsBetween(start, end); + } + + Future> getDetailedVisits(HistoryFilterOptions options) { + return _service + .getDetailedVisits( + options.dateRange?.start ?? DateTime(0), + options.dateRange?.end ?? DateTime(9999), + options.visitTypes, + ) + .then( + (visits) => + visits..sort((a, b) => b.visitTime.compareTo(a.visitTime)), + ); + } + + Future> getVisitsPaginated({ + required int count, + int offset = 0, + Set types = const {VisitType.link}, + }) { + return _service.getVisitsPaginated(offset, count, types); + } + + Future deleteVisit(VisitInfo info) { + return _service.deleteVisit(info); + } + + @override + void build() {} +} diff --git a/app/lib/features/geckoview/features/history/domain/repositories/history.g.dart b/app/lib/features/geckoview/features/history/domain/repositories/history.g.dart new file mode 100644 index 00000000..fa456af7 --- /dev/null +++ b/app/lib/features/geckoview/features/history/domain/repositories/history.g.dart @@ -0,0 +1,63 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'history.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(HistoryRepository) +const historyRepositoryProvider = HistoryRepositoryProvider._(); + +final class HistoryRepositoryProvider + extends $NotifierProvider { + const HistoryRepositoryProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'historyRepositoryProvider', + isAutoDispose: false, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$historyRepositoryHash(); + + @$internal + @override + HistoryRepository create() => HistoryRepository(); + + /// {@macro riverpod.override_with_value} + Override overrideWithValue(void value) { + return $ProviderOverride( + origin: this, + providerOverride: $SyncValueProvider(value), + ); + } +} + +String _$historyRepositoryHash() => r'f9ccc32275bb2f95edbe53b2245b4843e8d0c439'; + +abstract class _$HistoryRepository extends $Notifier { + void build(); + @$mustCallSuper + @override + void runBuild() { + build(); + final ref = this.ref as $Ref; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier, + void, + Object?, + Object? + >; + element.handleValue(ref, null); + } +} diff --git a/app/lib/features/geckoview/features/history/presentation/screens/history.dart b/app/lib/features/geckoview/features/history/presentation/screens/history.dart index b6e86f28..5be24eea 100644 --- a/app/lib/features/geckoview/features/history/presentation/screens/history.dart +++ b/app/lib/features/geckoview/features/history/presentation/screens/history.dart @@ -38,6 +38,7 @@ import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/dialogs/delete_data.dart'; import 'package:weblibre/features/geckoview/features/history/domain/entities/history_filter_options.dart'; import 'package:weblibre/features/geckoview/features/history/domain/providers.dart'; +import 'package:weblibre/features/geckoview/features/history/domain/repositories/history.dart'; import 'package:weblibre/features/geckoview/features/history/presentation/dialogs/delete_file.dart'; import 'package:weblibre/features/user/data/models/general_settings.dart'; import 'package:weblibre/presentation/hooks/menu_controller.dart'; @@ -106,8 +107,9 @@ class Section extends MultiSliver { builder: (context, ref, _) { return IconButton( onPressed: () async { - final service = GeckoHistoryService(); - await service.deleteVisit(item); + await ref + .read(historyRepositoryProvider.notifier) + .deleteVisit(item); final downloadedFile = item.title.mapNotNull( (title) => File(title), @@ -240,8 +242,9 @@ class HistoryScreen extends HookConsumerWidget { DeleteDecision? deleteDecision; for (final item in selectedItems.value) { - final service = GeckoHistoryService(); - await service.deleteVisit(item); + await ref + .read(historyRepositoryProvider.notifier) + .deleteVisit(item); final downloadedFile = item.title.mapNotNull( (title) => File(title),