refactor setting providers; include content blocking settings;

This commit is contained in:
Fabian Freund
2025-08-23 06:30:25 +02:00
parent 7a89c622dc
commit ce657dd26a
53 changed files with 958 additions and 404 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ Stream<double> iconCacheSizeMegabytes(Ref ref) {
@Riverpod()
bool incognitoModeEnabled(Ref ref) {
return ref.watch(
generalSettingsRepositoryProvider.select(
generalSettingsWithDefaultsProvider.select(
(value) => value.deleteBrowsingDataOnQuit != null,
),
);
@@ -43,7 +43,7 @@ final iconCacheSizeMegabytesProvider =
// ignore: unused_element
typedef IconCacheSizeMegabytesRef = AutoDisposeStreamProviderRef<double>;
String _$incognitoModeEnabledHash() =>
r'3968c2d4945be09a0bc08ce0d70b0390187c44e8';
r'36957b70a5261f9d3ad228e07cc8dd5c8f616082';
/// See also [incognitoModeEnabled].
@ProviderFor(incognitoModeEnabled)
@@ -20,6 +20,7 @@
import 'dart:async';
import 'package:drift/drift.dart';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/features/user/data/models/engine_settings.dart';
import 'package:weblibre/features/user/data/providers.dart';
@@ -33,9 +34,72 @@ typedef UpdateEngineSettingsFunc =
class EngineSettingsRepository extends _$EngineSettingsRepository {
final _partitionKey = 'engine';
Future<void> updateSettings(UpdateEngineSettingsFunc updateWithCurrent) {
final oldJson = state.toJson();
final newJson = updateWithCurrent(state).toJson();
EngineSettings _deserializeSettings(
List<MapEntry<String, DriftAny?>> entries,
) {
final db = ref.read(userDatabaseProvider);
final settings = Map.fromEntries(entries);
return EngineSettings.fromJson({
'incognitoMode': settings['incognitoMode']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'javascriptEnabled': settings['javascriptEnabled']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'trackingProtectionPolicy': settings['trackingProtectionPolicy']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'httpsOnlyMode': settings['httpsOnlyMode']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'globalPrivacyControlEnabled': settings['globalPrivacyControlEnabled']
?.readAs(DriftSqlType.bool, db.typeMapping),
'cookieBannerHandlingMode': settings['cookieBannerHandlingMode']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'cookieBannerHandlingModePrivateBrowsing':
settings['cookieBannerHandlingModePrivateBrowsing']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'cookieBannerHandlingGlobalRules':
settings['cookieBannerHandlingGlobalRules']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'cookieBannerHandlingGlobalRulesSubFrames':
settings['cookieBannerHandlingGlobalRulesSubFrames']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'webContentIsolationStrategy': settings['webContentIsolationStrategy']
?.readAs(DriftSqlType.string, db.typeMapping),
'userAgent': settings['userAgent']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'queryParameterStripping': settings['queryParameterStripping']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'bounceTrackingProtectionMode': settings['bounceTrackingProtectionMode']
?.readAs(DriftSqlType.string, db.typeMapping),
});
}
Future<void> updateSettings(
UpdateEngineSettingsFunc updateWithCurrent,
) async {
final current = await fetchSettings();
final oldJson = current.toJson();
final newJson = updateWithCurrent(current).toJson();
return ref.read(userDatabaseProvider).transaction(() async {
for (final MapEntry(:key, :value) in newJson.entries) {
@@ -49,69 +113,33 @@ class EngineSettingsRepository extends _$EngineSettingsRepository {
});
}
Future<EngineSettings> fetchSettings() {
return ref
.read(userDatabaseProvider)
.settingDao
.getAllSettingsOfPartitionKey(_partitionKey)
.get()
.then(_deserializeSettings);
}
@override
EngineSettings build() {
Stream<EngineSettings> build() {
final db = ref.watch(userDatabaseProvider);
final watchSub = db.settingDao
return db.settingDao
.getAllSettingsOfPartitionKey(_partitionKey)
.watch()
.listen((entries) {
final settings = Map.fromEntries(entries);
state = EngineSettings.fromJson({
'incognitoMode': settings['incognitoMode']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'javascriptEnabled': settings['javascriptEnabled']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'trackingProtectionPolicy': settings['trackingProtectionPolicy']
?.readAs(DriftSqlType.string, db.typeMapping),
'httpsOnlyMode': settings['httpsOnlyMode']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'globalPrivacyControlEnabled':
settings['globalPrivacyControlEnabled']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'cookieBannerHandlingMode': settings['cookieBannerHandlingMode']
?.readAs(DriftSqlType.string, db.typeMapping),
'cookieBannerHandlingModePrivateBrowsing':
settings['cookieBannerHandlingModePrivateBrowsing']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'cookieBannerHandlingGlobalRules':
settings['cookieBannerHandlingGlobalRules']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'cookieBannerHandlingGlobalRulesSubFrames':
settings['cookieBannerHandlingGlobalRulesSubFrames']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
'webContentIsolationStrategy':
settings['webContentIsolationStrategy']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
'userAgent': settings['userAgent']?.readAs(
DriftSqlType.string,
db.typeMapping,
),
});
.map((entries) {
return _deserializeSettings(entries);
});
ref.onDispose(() async {
await watchSub.cancel();
});
return EngineSettings.withDefaults();
}
}
@Riverpod()
EngineSettings engineSettingsWithDefaults(Ref ref) {
return ref.watch(
engineSettingsRepositoryProvider.select(
(value) => value.valueOrNull ?? EngineSettings.withDefaults(),
),
);
}
@@ -6,13 +6,32 @@ part of 'engine_settings.dart';
// RiverpodGenerator
// **************************************************************************
String _$engineSettingsWithDefaultsHash() =>
r'018e37f31f893e203b86038e84b0ddf5e72454d4';
/// See also [engineSettingsWithDefaults].
@ProviderFor(engineSettingsWithDefaults)
final engineSettingsWithDefaultsProvider =
AutoDisposeProvider<EngineSettings>.internal(
engineSettingsWithDefaults,
name: r'engineSettingsWithDefaultsProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$engineSettingsWithDefaultsHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef EngineSettingsWithDefaultsRef = AutoDisposeProviderRef<EngineSettings>;
String _$engineSettingsRepositoryHash() =>
r'87e308c8bd4390d1d5c401532a0c35cd96f6176e';
r'aa522c35377280c451f6ac9e5f7063eab7ba6efc';
/// See also [EngineSettingsRepository].
@ProviderFor(EngineSettingsRepository)
final engineSettingsRepositoryProvider =
NotifierProvider<EngineSettingsRepository, EngineSettings>.internal(
StreamNotifierProvider<EngineSettingsRepository, EngineSettings>.internal(
EngineSettingsRepository.new,
name: r'engineSettingsRepositoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +41,6 @@ final engineSettingsRepositoryProvider =
allTransitiveDependencies: null,
);
typedef _$EngineSettingsRepository = Notifier<EngineSettings>;
typedef _$EngineSettingsRepository = StreamNotifier<EngineSettings>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
@@ -22,6 +22,7 @@ import 'dart:convert';
import 'package:drift/drift.dart';
import 'package:nullability/nullability.dart';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/features/user/data/models/general_settings.dart';
import 'package:weblibre/features/user/data/providers.dart';
@@ -95,7 +96,7 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository {
}
//Eager fetch, when up to date settings are required
Future<GeneralSettings> fetch() {
Future<GeneralSettings> fetchSettings() {
return ref
.read(userDatabaseProvider)
.settingDao
@@ -104,9 +105,13 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository {
.then(_deserializeSettings);
}
Future<void> updateSettings(UpdateGeneralSettingsFunc updateWithCurrent) {
final oldJson = state.toJson();
final newJson = updateWithCurrent(state).toJson();
Future<void> updateSettings(
UpdateGeneralSettingsFunc updateWithCurrent,
) async {
final current = await fetchSettings();
final oldJson = current.toJson();
final newJson = updateWithCurrent(current).toJson();
final db = ref.read(userDatabaseProvider);
@@ -120,20 +125,23 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository {
}
@override
GeneralSettings build() {
Stream<GeneralSettings> build() {
final db = ref.watch(userDatabaseProvider);
final watchSub = db.settingDao
return db.settingDao
.getAllSettingsOfPartitionKey(_partitionKey)
.watch()
.listen((event) {
state = _deserializeSettings(event);
.map((event) {
return _deserializeSettings(event);
});
ref.onDispose(() async {
await watchSub.cancel();
});
return GeneralSettings.withDefaults();
}
}
@Riverpod()
GeneralSettings generalSettingsWithDefaults(Ref ref) {
return ref.watch(
generalSettingsRepositoryProvider.select(
(value) => value.valueOrNull ?? GeneralSettings.withDefaults(),
),
);
}
@@ -6,13 +6,33 @@ part of 'general_settings.dart';
// RiverpodGenerator
// **************************************************************************
String _$generalSettingsWithDefaultsHash() =>
r'd2a20cb527f8bf5a16e273933cf7ccc9d0851dc4';
/// See also [generalSettingsWithDefaults].
@ProviderFor(generalSettingsWithDefaults)
final generalSettingsWithDefaultsProvider =
AutoDisposeProvider<GeneralSettings>.internal(
generalSettingsWithDefaults,
name: r'generalSettingsWithDefaultsProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$generalSettingsWithDefaultsHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef GeneralSettingsWithDefaultsRef =
AutoDisposeProviderRef<GeneralSettings>;
String _$generalSettingsRepositoryHash() =>
r'538e03e9eff8beefc0918614c86d8919224c3039';
r'7e1c4d6051c4c3972b6998dee89d13b49be32e48';
/// See also [GeneralSettingsRepository].
@ProviderFor(GeneralSettingsRepository)
final generalSettingsRepositoryProvider =
NotifierProvider<GeneralSettingsRepository, GeneralSettings>.internal(
StreamNotifierProvider<GeneralSettingsRepository, GeneralSettings>.internal(
GeneralSettingsRepository.new,
name: r'generalSettingsRepositoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +42,6 @@ final generalSettingsRepositoryProvider =
allTransitiveDependencies: null,
);
typedef _$GeneralSettingsRepository = Notifier<GeneralSettings>;
typedef _$GeneralSettingsRepository = StreamNotifier<GeneralSettings>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package