From f980a946826ddbb1fc1f841040cb0750de757354 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sun, 19 Apr 2026 17:07:30 +0200 Subject: [PATCH] improve default search bang fetching --- .../bangs/domain/providers/bangs.dart | 15 ++++ .../bangs/domain/providers/bangs.g.dart | 38 ++++++++++ .../features/geckoview/domain/providers.dart | 70 ++++++++++++------- .../geckoview/domain/providers.g.dart | 2 +- .../widgets/browser_modules/browser_view.dart | 2 +- .../search/presentation/screens/search.dart | 4 +- 6 files changed, 100 insertions(+), 31 deletions(-) diff --git a/apps/weblibre/lib/features/bangs/domain/providers/bangs.dart b/apps/weblibre/lib/features/bangs/domain/providers/bangs.dart index 03bb94ef..6f5ef3ab 100644 --- a/apps/weblibre/lib/features/bangs/domain/providers/bangs.dart +++ b/apps/weblibre/lib/features/bangs/domain/providers/bangs.dart @@ -41,6 +41,21 @@ Stream defaultSearchBangData(Ref ref) { return repository.watchBang(key); } +@Riverpod(keepAlive: true) +Future defaultSearchBang(Ref ref) { + final key = ref.watch( + generalSettingsWithDefaultsProvider.select( + (value) => value.defaultSearchProvider, + ), + ); + + if (key == null) { + return Future.value(); + } + + return ref.read(bangDataRepositoryProvider.notifier).getBang(key); +} + @Riverpod() Stream bangData(Ref ref, BangKey key) { final repository = ref.watch(bangDataRepositoryProvider.notifier); diff --git a/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart b/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart index 0b8d59c8..57158c31 100644 --- a/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart +++ b/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart @@ -44,6 +44,44 @@ final class DefaultSearchBangDataProvider String _$defaultSearchBangDataHash() => r'5f43b8989219cf3cb2f5ca65df351b6cb100427f'; +@ProviderFor(defaultSearchBang) +final defaultSearchBangProvider = DefaultSearchBangProvider._(); + +final class DefaultSearchBangProvider + extends + $FunctionalProvider< + AsyncValue, + BangData?, + FutureOr + > + with $FutureModifier, $FutureProvider { + DefaultSearchBangProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'defaultSearchBangProvider', + isAutoDispose: false, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$defaultSearchBangHash(); + + @$internal + @override + $FutureProviderElement $createElement($ProviderPointer pointer) => + $FutureProviderElement(pointer); + + @override + FutureOr create(Ref ref) { + return defaultSearchBang(ref); + } +} + +String _$defaultSearchBangHash() => r'39c5b18231a56763e2c620cae5f2889f7c95f6ee'; + @ProviderFor(bangData) final bangDataProvider = BangDataFamily._(); diff --git a/apps/weblibre/lib/features/geckoview/domain/providers.dart b/apps/weblibre/lib/features/geckoview/domain/providers.dart index 761f1bf9..99d9737c 100644 --- a/apps/weblibre/lib/features/geckoview/domain/providers.dart +++ b/apps/weblibre/lib/features/geckoview/domain/providers.dart @@ -64,36 +64,54 @@ GeckoSelectionActionService selectionActionService(Ref ref) { } }), DefaultSearchAction((text) async { - if (ref.mounted) { - final defaultSearchBang = await ref.read( - defaultSearchBangDataProvider.future, - ); + if (!ref.mounted) return; - if (ref.mounted && defaultSearchBang != null) { - final currentTab = ref.read( - tabStatesProvider, - )[ref.read(selectedTabProvider)]; + final searchBang = await ref.read(defaultSearchBangProvider.future); - final tabMode = - currentTab?.tabMode ?? - TabMode.fromTabType( - ref - .read(generalSettingsWithDefaultsProvider) - .effectiveDefaultCreateTabType, - ); + if (!ref.mounted) return; - await ref - .read(tabRepositoryProvider.notifier) - .addTab( - url: defaultSearchBang.getTemplateUrl(text), - parentId: currentTab?.id, - tabMode: tabMode, - selectTab: true, - ); - } else { - logger.e('No default search bang found'); - } + if (searchBang != null) { + final currentTab = ref.read( + tabStatesProvider, + )[ref.read(selectedTabProvider)]; + + final tabMode = + currentTab?.tabMode ?? + TabMode.fromTabType( + ref + .read(generalSettingsWithDefaultsProvider) + .effectiveDefaultCreateTabType, + ); + + await ref + .read(tabRepositoryProvider.notifier) + .addTab( + url: searchBang.getTemplateUrl(text), + parentId: currentTab?.id, + tabMode: tabMode, + selectTab: true, + ); + return; } + + logger.w('No search bang found, falling back to search screen'); + + final router = await ref.read(routerProvider.future); + if (!ref.mounted) return; + + final settings = ref.read(generalSettingsWithDefaultsProvider); + final selectedTabState = ref.read( + tabStatesProvider, + )[ref.read(selectedTabProvider)]; + + await router.push( + SearchRoute( + tabType: + selectedTabState?.tabMode.toTabType() ?? + settings.effectiveDefaultCreateTabType, + searchText: text, + ).location, + ); }), FindInPageAction((text) async { if (ref.mounted) { diff --git a/apps/weblibre/lib/features/geckoview/domain/providers.g.dart b/apps/weblibre/lib/features/geckoview/domain/providers.g.dart index f48ff7a2..f38a8351 100644 --- a/apps/weblibre/lib/features/geckoview/domain/providers.g.dart +++ b/apps/weblibre/lib/features/geckoview/domain/providers.g.dart @@ -55,7 +55,7 @@ final class SelectionActionServiceProvider } String _$selectionActionServiceHash() => - r'5faf8c13c414406dfc2eb55fdd372677dbccdf8c'; + r'78593799e8d903de415cf49ebb3acfb73e45d878'; @ProviderFor(eventService) final eventServiceProvider = EventServiceProvider._(); diff --git a/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart b/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart index d1fe0b6e..4d939b22 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart @@ -421,7 +421,7 @@ class _BrowserViewState extends ConsumerState case SharedText(): final bang = ref.read(selectedBangDataProvider()) ?? - await ref.read(defaultSearchBangDataProvider.future); + await ref.read(defaultSearchBangProvider.future); await ref .read(tabRepositoryProvider.notifier) diff --git a/apps/weblibre/lib/features/geckoview/features/search/presentation/screens/search.dart b/apps/weblibre/lib/features/geckoview/features/search/presentation/screens/search.dart index 5f7820a1..b4e393ad 100644 --- a/apps/weblibre/lib/features/geckoview/features/search/presentation/screens/search.dart +++ b/apps/weblibre/lib/features/geckoview/features/search/presentation/screens/search.dart @@ -580,9 +580,7 @@ class SearchScreen extends HookConsumerWidget { final bang = siteBang ?? globalBang ?? - await ref.read( - defaultSearchBangDataProvider.future, - ); + await ref.read(defaultSearchBangProvider.future); if (bang != null) { newUrl = bang.getTemplateUrl(searchQuery);