From f279ccabac5c779fa4b8abbfd951f83d8319c285 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Fri, 26 Sep 2025 16:32:47 +0200 Subject: [PATCH] persist history options --- .../database/converters/date_time_range.dart | 27 +++++++++++++++ .../entities/history_filter_options.dart | 11 +++++- .../entities/history_filter_options.g.dart | 34 +++++++++++++++++++ .../features/history/domain/providers.dart | 21 +++++++++++- .../features/history/domain/providers.g.dart | 2 +- 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 app/lib/data/database/converters/date_time_range.dart diff --git a/app/lib/data/database/converters/date_time_range.dart b/app/lib/data/database/converters/date_time_range.dart new file mode 100644 index 00000000..5bb7da0a --- /dev/null +++ b/app/lib/data/database/converters/date_time_range.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:json_annotation/json_annotation.dart'; + +class DateTimeRangeConverter + implements JsonConverter?> { + const DateTimeRangeConverter(); + + @override + DateTimeRange? fromJson(Map? json) { + if (json == null) return null; + + return DateTimeRange( + start: DateTime.parse(json['start'] as String), + end: DateTime.parse(json['end'] as String), + ); + } + + @override + Map? toJson(DateTimeRange? dateTimeRange) { + if (dateTimeRange == null) return null; + + return { + 'start': dateTimeRange.start.toIso8601String(), + 'end': dateTimeRange.end.toIso8601String(), + }; + } +} diff --git a/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.dart b/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.dart index a37963e7..ba5af86a 100644 --- a/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.dart +++ b/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.dart @@ -2,19 +2,28 @@ import 'package:copy_with_extension/copy_with_extension.dart'; import 'package:fast_equatable/fast_equatable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:weblibre/data/database/converters/date_time_range.dart'; part 'history_filter_options.g.dart'; +@JsonSerializable() @CopyWith() class HistoryFilterOptions with FastEquatable { + @DateTimeRangeConverter() final DateTimeRange? dateRange; final Set visitTypes; HistoryFilterOptions({required this.dateRange, required this.visitTypes}); HistoryFilterOptions.withDefaults() - : this(dateRange: null, visitTypes: {VisitType.link, VisitType.typed}); + : this(dateRange: null, visitTypes: {VisitType.link}); @override List get hashParameters => [dateRange, visitTypes]; + + factory HistoryFilterOptions.fromJson(Map json) => + _$HistoryFilterOptionsFromJson(json); + + Map toJson() => _$HistoryFilterOptionsToJson(this); } diff --git a/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.g.dart b/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.g.dart index 9d617379..a173f6db 100644 --- a/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.g.dart +++ b/app/lib/features/geckoview/features/history/domain/entities/history_filter_options.g.dart @@ -73,3 +73,37 @@ extension $HistoryFilterOptionsCopyWith on HistoryFilterOptions { _$HistoryFilterOptionsCWProxy get copyWith => _$HistoryFilterOptionsCWProxyImpl(this); } + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +HistoryFilterOptions _$HistoryFilterOptionsFromJson( + Map json, +) => HistoryFilterOptions( + dateRange: const DateTimeRangeConverter().fromJson( + json['dateRange'] as Map?, + ), + visitTypes: (json['visitTypes'] as List) + .map((e) => $enumDecode(_$VisitTypeEnumMap, e)) + .toSet(), +); + +Map _$HistoryFilterOptionsToJson( + HistoryFilterOptions instance, +) => { + 'dateRange': const DateTimeRangeConverter().toJson(instance.dateRange), + 'visitTypes': instance.visitTypes.map((e) => _$VisitTypeEnumMap[e]!).toList(), +}; + +const _$VisitTypeEnumMap = { + VisitType.link: 'link', + VisitType.typed: 'typed', + VisitType.bookmark: 'bookmark', + VisitType.embed: 'embed', + VisitType.redirectPermanent: 'redirectPermanent', + VisitType.redirectTemporary: 'redirectTemporary', + VisitType.download: 'download', + VisitType.framedLink: 'framedLink', + VisitType.reload: 'reload', +}; diff --git a/app/lib/features/geckoview/features/history/domain/providers.dart b/app/lib/features/geckoview/features/history/domain/providers.dart index b018bb69..81ea2252 100644 --- a/app/lib/features/geckoview/features/history/domain/providers.dart +++ b/app/lib/features/geckoview/features/history/domain/providers.dart @@ -17,10 +17,14 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +import 'dart:convert'; + import 'package:flutter/material.dart'; 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/user/data/providers.dart'; part 'providers.g.dart'; @@ -34,13 +38,28 @@ class HistoryFilter extends _$HistoryFilter { } } + void reset() { + state = HistoryFilterOptions.withDefaults(); + } + void setDateRange(DateTimeRange? range) { state = state.copyWith.dateRange(range); } @override HistoryFilterOptions build() { - return HistoryFilterOptions.withDefaults(); + final riverpodStorage = ref.watch(riverpodDatabaseStorageProvider); + + persist( + riverpodStorage, + key: 'HistoryFilterOptions', + decode: (encoded) => HistoryFilterOptions.fromJson( + jsonDecode(encoded) as Map, + ), + encode: (state) => jsonEncode(state.toJson()), + ); + + return stateOrNull ?? HistoryFilterOptions.withDefaults(); } } 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 1e7f498d..e6a8ce76 100644 --- a/app/lib/features/geckoview/features/history/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/history/domain/providers.g.dart @@ -41,7 +41,7 @@ final class HistoryFilterProvider } } -String _$historyFilterHash() => r'68a604fe857476f7c15be89352a7b10bc456c3d6'; +String _$historyFilterHash() => r'a30ed30dac56422144225adb2c5d2c1ba5c740dd'; abstract class _$HistoryFilter extends $Notifier { HistoryFilterOptions build();