improve default search bang fetching

This commit is contained in:
Fabian Freund
2026-04-19 17:07:30 +02:00
parent 94e223ba78
commit f980a94682
6 changed files with 100 additions and 31 deletions
@@ -41,6 +41,21 @@ Stream<BangData?> defaultSearchBangData(Ref ref) {
return repository.watchBang(key); return repository.watchBang(key);
} }
@Riverpod(keepAlive: true)
Future<BangData?> 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() @Riverpod()
Stream<BangData?> bangData(Ref ref, BangKey key) { Stream<BangData?> bangData(Ref ref, BangKey key) {
final repository = ref.watch(bangDataRepositoryProvider.notifier); final repository = ref.watch(bangDataRepositoryProvider.notifier);
@@ -44,6 +44,44 @@ final class DefaultSearchBangDataProvider
String _$defaultSearchBangDataHash() => String _$defaultSearchBangDataHash() =>
r'5f43b8989219cf3cb2f5ca65df351b6cb100427f'; r'5f43b8989219cf3cb2f5ca65df351b6cb100427f';
@ProviderFor(defaultSearchBang)
final defaultSearchBangProvider = DefaultSearchBangProvider._();
final class DefaultSearchBangProvider
extends
$FunctionalProvider<
AsyncValue<BangData?>,
BangData?,
FutureOr<BangData?>
>
with $FutureModifier<BangData?>, $FutureProvider<BangData?> {
DefaultSearchBangProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'defaultSearchBangProvider',
isAutoDispose: false,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$defaultSearchBangHash();
@$internal
@override
$FutureProviderElement<BangData?> $createElement($ProviderPointer pointer) =>
$FutureProviderElement(pointer);
@override
FutureOr<BangData?> create(Ref ref) {
return defaultSearchBang(ref);
}
}
String _$defaultSearchBangHash() => r'39c5b18231a56763e2c620cae5f2889f7c95f6ee';
@ProviderFor(bangData) @ProviderFor(bangData)
final bangDataProvider = BangDataFamily._(); final bangDataProvider = BangDataFamily._();
@@ -64,36 +64,54 @@ GeckoSelectionActionService selectionActionService(Ref ref) {
} }
}), }),
DefaultSearchAction((text) async { DefaultSearchAction((text) async {
if (ref.mounted) { if (!ref.mounted) return;
final defaultSearchBang = await ref.read(
defaultSearchBangDataProvider.future,
);
if (ref.mounted && defaultSearchBang != null) { final searchBang = await ref.read(defaultSearchBangProvider.future);
final currentTab = ref.read(
tabStatesProvider,
)[ref.read(selectedTabProvider)];
final tabMode = if (!ref.mounted) return;
currentTab?.tabMode ??
TabMode.fromTabType(
ref
.read(generalSettingsWithDefaultsProvider)
.effectiveDefaultCreateTabType,
);
await ref if (searchBang != null) {
.read(tabRepositoryProvider.notifier) final currentTab = ref.read(
.addTab( tabStatesProvider,
url: defaultSearchBang.getTemplateUrl(text), )[ref.read(selectedTabProvider)];
parentId: currentTab?.id,
tabMode: tabMode, final tabMode =
selectTab: true, currentTab?.tabMode ??
); TabMode.fromTabType(
} else { ref
logger.e('No default search bang found'); .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 { FindInPageAction((text) async {
if (ref.mounted) { if (ref.mounted) {
@@ -55,7 +55,7 @@ final class SelectionActionServiceProvider
} }
String _$selectionActionServiceHash() => String _$selectionActionServiceHash() =>
r'5faf8c13c414406dfc2eb55fdd372677dbccdf8c'; r'78593799e8d903de415cf49ebb3acfb73e45d878';
@ProviderFor(eventService) @ProviderFor(eventService)
final eventServiceProvider = EventServiceProvider._(); final eventServiceProvider = EventServiceProvider._();
@@ -421,7 +421,7 @@ class _BrowserViewState extends ConsumerState<BrowserView>
case SharedText(): case SharedText():
final bang = final bang =
ref.read(selectedBangDataProvider()) ?? ref.read(selectedBangDataProvider()) ??
await ref.read(defaultSearchBangDataProvider.future); await ref.read(defaultSearchBangProvider.future);
await ref await ref
.read(tabRepositoryProvider.notifier) .read(tabRepositoryProvider.notifier)
@@ -580,9 +580,7 @@ class SearchScreen extends HookConsumerWidget {
final bang = final bang =
siteBang ?? siteBang ??
globalBang ?? globalBang ??
await ref.read( await ref.read(defaultSearchBangProvider.future);
defaultSearchBangDataProvider.future,
);
if (bang != null) { if (bang != null) {
newUrl = bang.getTemplateUrl(searchQuery); newUrl = bang.getTemplateUrl(searchQuery);