From 764612e2528b4c9645935cbcef2bd06fe5f02cfa Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Fri, 27 Jun 2025 22:04:00 +0200 Subject: [PATCH] option to disable autosuggest --- .../domain/providers/search_suggestions.dart | 4 +++ .../providers/search_suggestions.g.dart | 2 +- .../presentation/pages/default_search.dart | 9 +++++-- .../domain/autosuggest/duckduckgo.g.dart | 2 +- .../search/domain/autosuggest/empty.dart | 17 ++++++++++++ .../search/domain/autosuggest/empty.g.dart | 27 +++++++++++++++++++ .../i_search_suggestion_provider.dart | 3 ++- .../screens/general_settings.dart | 16 ++++++----- .../user/data/models/general_settings.g.dart | 1 + 9 files changed, 69 insertions(+), 12 deletions(-) create mode 100644 app/lib/features/search/domain/autosuggest/empty.dart create mode 100644 app/lib/features/search/domain/autosuggest/empty.g.dart diff --git a/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.dart b/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.dart index a12ce545..8b84b01c 100644 --- a/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.dart +++ b/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.dart @@ -3,6 +3,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/features/geckoview/features/search/domain/repositories/search_suggestions.dart'; import 'package:weblibre/features/search/domain/autosuggest/brave.dart'; import 'package:weblibre/features/search/domain/autosuggest/duckduckgo.dart'; +import 'package:weblibre/features/search/domain/autosuggest/empty.dart'; import 'package:weblibre/features/search/domain/autosuggest/kagi.dart'; import 'package:weblibre/features/search/domain/autosuggest/qwant.dart'; import 'package:weblibre/features/search/domain/entities/abstract/i_search_suggestion_provider.dart'; @@ -19,6 +20,9 @@ ISearchSuggestionProvider defaultSearchSuggestions(Ref ref) { ); return switch (provider) { + SearchSuggestionProviders.none => ref.watch( + emptyAutosuggestServiceProvider.notifier, + ), SearchSuggestionProviders.brave => ref.watch( braveAutosuggestServiceProvider.notifier, ), diff --git a/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.g.dart b/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.g.dart index b9bf173e..0eb555c3 100644 --- a/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.g.dart +++ b/app/lib/features/geckoview/features/search/domain/providers/search_suggestions.g.dart @@ -7,7 +7,7 @@ part of 'search_suggestions.dart'; // ************************************************************************** String _$defaultSearchSuggestionsHash() => - r'e503757071dd29988cd25e360b56a5a646800d5b'; + r'eb96a5db465422558a26e22abb3f843a82c17452'; /// See also [defaultSearchSuggestions]. @ProviderFor(defaultSearchSuggestions) diff --git a/app/lib/features/onboarding/presentation/pages/default_search.dart b/app/lib/features/onboarding/presentation/pages/default_search.dart index 31649b3f..49a1a151 100644 --- a/app/lib/features/onboarding/presentation/pages/default_search.dart +++ b/app/lib/features/onboarding/presentation/pages/default_search.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nullability/nullability.dart'; import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/features/bangs/domain/providers/bangs.dart'; import 'package:weblibre/features/search/domain/entities/abstract/i_search_suggestion_provider.dart'; @@ -114,14 +115,18 @@ class DefaultSearchPage extends HookConsumerWidget { ), ), width: double.infinity, - leadingIcon: BangIcon(trigger: activeAutosuggest.relatedBang), + leadingIcon: activeAutosuggest.relatedBang.mapNotNull( + (trigger) => BangIcon(trigger: trigger), + ), dropdownMenuEntries: SearchSuggestionProviders.values.map(( provider, ) { return DropdownMenuEntry( value: provider, label: provider.label, - leadingIcon: BangIcon(trigger: provider.relatedBang), + leadingIcon: provider.relatedBang.mapNotNull( + (trigger) => BangIcon(trigger: trigger), + ), ); }).toList(), onSelected: (value) async { diff --git a/app/lib/features/search/domain/autosuggest/duckduckgo.g.dart b/app/lib/features/search/domain/autosuggest/duckduckgo.g.dart index f517483e..45f09844 100644 --- a/app/lib/features/search/domain/autosuggest/duckduckgo.g.dart +++ b/app/lib/features/search/domain/autosuggest/duckduckgo.g.dart @@ -7,7 +7,7 @@ part of 'duckduckgo.dart'; // ************************************************************************** String _$duckDuckGoAutosuggestServiceHash() => - r'1679e6d9bce7cb380b1ee60c768abe2fddb79478'; + r'd9f30a577b276049b252be890bc73eb18aa118f2'; /// See also [DuckDuckGoAutosuggestService]. @ProviderFor(DuckDuckGoAutosuggestService) diff --git a/app/lib/features/search/domain/autosuggest/empty.dart b/app/lib/features/search/domain/autosuggest/empty.dart new file mode 100644 index 00000000..d419be31 --- /dev/null +++ b/app/lib/features/search/domain/autosuggest/empty.dart @@ -0,0 +1,17 @@ +import 'package:exceptions/exceptions.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:weblibre/features/search/domain/entities/abstract/i_search_suggestion_provider.dart'; + +part 'empty.g.dart'; + +@Riverpod(keepAlive: true) +class EmptyAutosuggestService extends _$EmptyAutosuggestService + implements ISearchSuggestionProvider { + @override + void build() {} + + @override + Future>> getSuggestions(String query) { + return Future.value(Result.success([])); + } +} diff --git a/app/lib/features/search/domain/autosuggest/empty.g.dart b/app/lib/features/search/domain/autosuggest/empty.g.dart new file mode 100644 index 00000000..8aee4d5c --- /dev/null +++ b/app/lib/features/search/domain/autosuggest/empty.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'empty.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$emptyAutosuggestServiceHash() => + r'7fbe81807baf379cf621ef46fba00e46778978f8'; + +/// See also [EmptyAutosuggestService]. +@ProviderFor(EmptyAutosuggestService) +final emptyAutosuggestServiceProvider = + NotifierProvider.internal( + EmptyAutosuggestService.new, + name: r'emptyAutosuggestServiceProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$emptyAutosuggestServiceHash, + dependencies: null, + allTransitiveDependencies: null, + ); + +typedef _$EmptyAutosuggestService = Notifier; +// 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 diff --git a/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart b/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart index 15d88cad..7e9d3548 100644 --- a/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart +++ b/app/lib/features/search/domain/entities/abstract/i_search_suggestion_provider.dart @@ -1,13 +1,14 @@ import 'package:exceptions/exceptions.dart'; enum SearchSuggestionProviders { + none('Disabled', null), brave('Brave', 'brave'), ddg('DuckDuckGo', 'ddg'), kagi('Kagi', 'kagi'), qwant('Qwant', 'qwant'); final String label; - final String relatedBang; + final String? relatedBang; const SearchSuggestionProviders(this.label, this.relatedBang); } diff --git a/app/lib/features/settings/presentation/screens/general_settings.dart b/app/lib/features/settings/presentation/screens/general_settings.dart index 022e8682..dc76f6aa 100644 --- a/app/lib/features/settings/presentation/screens/general_settings.dart +++ b/app/lib/features/settings/presentation/screens/general_settings.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nullability/nullability.dart'; import 'package:weblibre/features/search/domain/entities/abstract/i_search_suggestion_provider.dart'; import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart'; import 'package:weblibre/features/settings/presentation/widgets/bang_icon.dart'; @@ -120,18 +121,19 @@ class GeneralSettingsScreen extends HookConsumerWidget { ), ), width: double.infinity, - leadingIcon: BangIcon( - trigger: generalSettings - .defaultSearchSuggestionsProvider - .relatedBang, - ), + leadingIcon: generalSettings + .defaultSearchSuggestionsProvider + .relatedBang + .mapNotNull( + (trigger) => BangIcon(trigger: trigger), + ), dropdownMenuEntries: SearchSuggestionProviders.values .map((provider) { return DropdownMenuEntry( value: provider, label: provider.label, - leadingIcon: BangIcon( - trigger: provider.relatedBang, + leadingIcon: provider.relatedBang.mapNotNull( + (trigger) => BangIcon(trigger: trigger), ), ); }) diff --git a/app/lib/features/user/data/models/general_settings.g.dart b/app/lib/features/user/data/models/general_settings.g.dart index 58411efc..32be39a8 100644 --- a/app/lib/features/user/data/models/general_settings.g.dart +++ b/app/lib/features/user/data/models/general_settings.g.dart @@ -202,6 +202,7 @@ const _$DeleteBrowsingDataTypeEnumMap = { }; const _$SearchSuggestionProvidersEnumMap = { + SearchSuggestionProviders.none: 'none', SearchSuggestionProviders.brave: 'brave', SearchSuggestionProviders.ddg: 'ddg', SearchSuggestionProviders.kagi: 'kagi',