From 603004ec23c98ee33adff1d48fe0defc9bfc301a Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sun, 4 May 2025 12:15:04 +0200 Subject: [PATCH] reworked find in page --- .../features/geckoview/domain/providers.dart | 4 + .../geckoview/domain/providers.g.dart | 2 +- .../features/browser/domain/providers.dart | 14 -- .../features/browser/domain/providers.g.dart | 16 -- .../browser_modules/bottom_app_bar.dart | 6 +- .../domain/repositories/find_in_page.dart | 29 --- .../domain/repositories/find_in_page.g.dart | 165 ------------------ .../controllers/find_in_page.dart | 67 +++++++ ..._visibility.g.dart => find_in_page.g.dart} | 22 +-- .../controllers/find_in_page_visibility.dart | 19 -- .../domain/entities/find_in_page_state.dart | 17 ++ .../domain/entities/find_in_page_state.g.dart | 66 +++++++ .../presentation/widgets/find_in_page.dart | 39 +++-- .../entities/default_selection_actions.dart | 9 + .../domain/services/gecko_find_in_page.dart | 4 - 15 files changed, 200 insertions(+), 279 deletions(-) delete mode 100644 app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.dart delete mode 100644 app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.g.dart create mode 100644 app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart rename app/lib/features/geckoview/features/find_in_page/presentation/controllers/{find_in_page_visibility.g.dart => find_in_page.g.dart} (50%) delete mode 100644 app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.dart create mode 100644 app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.dart create mode 100644 app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.g.dart diff --git a/app/lib/features/geckoview/domain/providers.dart b/app/lib/features/geckoview/domain/providers.dart index 71d55487..c4cf5a27 100644 --- a/app/lib/features/geckoview/domain/providers.dart +++ b/app/lib/features/geckoview/domain/providers.dart @@ -7,6 +7,7 @@ import 'package:lensai/core/routing/routes.dart'; import 'package:lensai/features/bangs/domain/providers/bangs.dart'; import 'package:lensai/features/geckoview/domain/providers/tab_state.dart'; import 'package:lensai/features/geckoview/domain/repositories/tab.dart'; +import 'package:lensai/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart'; import 'package:riverpod/riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:share_plus/share_plus.dart'; @@ -50,6 +51,9 @@ GeckoSelectionActionService selectionActionService(Ref ref) { logger.e('No default search bang found'); } }), + FindInPageAction((text) { + ref.read(findInPageControllerProvider.notifier).findAll(text: text); + }), ShareAction((text) async { await SharePlus.instance.share(ShareParams(text: text)); }), diff --git a/app/lib/features/geckoview/domain/providers.g.dart b/app/lib/features/geckoview/domain/providers.g.dart index bb2d91db..632f5536 100644 --- a/app/lib/features/geckoview/domain/providers.g.dart +++ b/app/lib/features/geckoview/domain/providers.g.dart @@ -7,7 +7,7 @@ part of 'providers.dart'; // ************************************************************************** String _$selectionActionServiceHash() => - r'fc7344fa34f0e27772309303083804866336197b'; + r'9393acfbc2cc0864d9e9b116e65e4c2713da2ab1'; /// See also [selectionActionService]. @ProviderFor(selectionActionService) diff --git a/app/lib/features/geckoview/features/browser/domain/providers.dart b/app/lib/features/geckoview/features/browser/domain/providers.dart index 1b4937d2..4fa34276 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.dart @@ -54,20 +54,6 @@ class SelectedBangData extends _$SelectedBangData { } } -@Riverpod(keepAlive: true) -class ShowFindInPage extends _$ShowFindInPage { - // ignore: document_ignores api decision - // ignore: use_setters_to_change_properties - void update(bool show) { - state = show; - } - - @override - bool build() { - return false; - } -} - @Riverpod() EquatableValue> availableTabIds( Ref ref, diff --git a/app/lib/features/geckoview/features/browser/domain/providers.g.dart b/app/lib/features/geckoview/features/browser/domain/providers.g.dart index 874b8321..162d0bd4 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.g.dart @@ -852,21 +852,5 @@ class _SelectedBangDataProviderElement String? get domain => (origin as SelectedBangDataProvider).domain; } -String _$showFindInPageHash() => r'7ee5703f7d0c7e8a8dd6b0849d7b1e0a41fe24d9'; - -/// See also [ShowFindInPage]. -@ProviderFor(ShowFindInPage) -final showFindInPageProvider = NotifierProvider.internal( - ShowFindInPage.new, - name: r'showFindInPageProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$showFindInPageHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$ShowFindInPage = 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/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart index 104e00f4..434f3016 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart @@ -17,7 +17,7 @@ import 'package:lensai/features/geckoview/features/browser/presentation/widgets/ import 'package:lensai/features/geckoview/features/browser/presentation/widgets/edit_url_dialog.dart'; import 'package:lensai/features/geckoview/features/browser/presentation/widgets/extension_badge_icon.dart'; import 'package:lensai/features/geckoview/features/browser/presentation/widgets/tabs_action_button.dart'; -import 'package:lensai/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.dart'; +import 'package:lensai/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart'; import 'package:lensai/features/geckoview/features/readerview/presentation/widgets/reader_button.dart'; import 'package:lensai/presentation/hooks/menu_controller.dart'; import 'package:lensai/presentation/icons/tor_icons.dart'; @@ -316,9 +316,7 @@ class BrowserBottomAppBar extends HookConsumerWidget { if (selectedTabId != null) MenuItemButton( onPressed: () { - ref - .read(findInPageVisibilityControllerProvider.notifier) - .show(); + ref.read(findInPageControllerProvider.notifier).show(); }, leadingIcon: const Icon(Icons.search), child: const Text('Find in page'), diff --git a/app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.dart b/app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.dart deleted file mode 100644 index 50a77b22..00000000 --- a/app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -part 'find_in_page.g.dart'; - -@Riverpod() -class FindInPageRepository extends _$FindInPageRepository { - late GeckoFindInPageService _service; - - @override - void build(String? tabId) { - _service = - (tabId != null) - ? GeckoFindInPageService(tabId: tabId) - : GeckoFindInPageService.forActiveTab(); - } - - Future findAll({required String text}) { - return _service.findAll(text); - } - - Future findNext({bool forward = true}) { - return _service.findNext(forward); - } - - Future clearMatches() { - return _service.clearMatches(); - } -} diff --git a/app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.g.dart b/app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.g.dart deleted file mode 100644 index 95b38ebc..00000000 --- a/app/lib/features/geckoview/features/find_in_page/domain/repositories/find_in_page.g.dart +++ /dev/null @@ -1,165 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'find_in_page.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$findInPageRepositoryHash() => - r'a307a7169cfc559a687483962bd595d808c159bf'; - -/// Copied from Dart SDK -class _SystemHash { - _SystemHash._(); - - static int combine(int hash, int value) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + value); - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); - return hash ^ (hash >> 6); - } - - static int finish(int hash) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); - // ignore: parameter_assignments - hash = hash ^ (hash >> 11); - return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); - } -} - -abstract class _$FindInPageRepository - extends BuildlessAutoDisposeNotifier { - late final String? tabId; - - void build(String? tabId); -} - -/// See also [FindInPageRepository]. -@ProviderFor(FindInPageRepository) -const findInPageRepositoryProvider = FindInPageRepositoryFamily(); - -/// See also [FindInPageRepository]. -class FindInPageRepositoryFamily extends Family { - /// See also [FindInPageRepository]. - const FindInPageRepositoryFamily(); - - /// See also [FindInPageRepository]. - FindInPageRepositoryProvider call(String? tabId) { - return FindInPageRepositoryProvider(tabId); - } - - @override - FindInPageRepositoryProvider getProviderOverride( - covariant FindInPageRepositoryProvider provider, - ) { - return call(provider.tabId); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'findInPageRepositoryProvider'; -} - -/// See also [FindInPageRepository]. -class FindInPageRepositoryProvider - extends AutoDisposeNotifierProviderImpl { - /// See also [FindInPageRepository]. - FindInPageRepositoryProvider(String? tabId) - : this._internal( - () => FindInPageRepository()..tabId = tabId, - from: findInPageRepositoryProvider, - name: r'findInPageRepositoryProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$findInPageRepositoryHash, - dependencies: FindInPageRepositoryFamily._dependencies, - allTransitiveDependencies: - FindInPageRepositoryFamily._allTransitiveDependencies, - tabId: tabId, - ); - - FindInPageRepositoryProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.tabId, - }) : super.internal(); - - final String? tabId; - - @override - void runNotifierBuild(covariant FindInPageRepository notifier) { - return notifier.build(tabId); - } - - @override - Override overrideWith(FindInPageRepository Function() create) { - return ProviderOverride( - origin: this, - override: FindInPageRepositoryProvider._internal( - () => create()..tabId = tabId, - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - tabId: tabId, - ), - ); - } - - @override - AutoDisposeNotifierProviderElement - createElement() { - return _FindInPageRepositoryProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is FindInPageRepositoryProvider && other.tabId == tabId; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, tabId.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin FindInPageRepositoryRef on AutoDisposeNotifierProviderRef { - /// The parameter `tabId` of this provider. - String? get tabId; -} - -class _FindInPageRepositoryProviderElement - extends AutoDisposeNotifierProviderElement - with FindInPageRepositoryRef { - _FindInPageRepositoryProviderElement(super.provider); - - @override - String? get tabId => (origin as FindInPageRepositoryProvider).tabId; -} - -// 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/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart new file mode 100644 index 00000000..da8d2008 --- /dev/null +++ b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart @@ -0,0 +1,67 @@ +import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; +import 'package:lensai/extensions/nullable.dart'; +import 'package:lensai/features/geckoview/domain/providers/selected_tab.dart'; +import 'package:lensai/features/geckoview/domain/providers/tab_state.dart'; +import 'package:lensai/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'find_in_page.g.dart'; + +@Riverpod() +class FindInPageController extends _$FindInPageController { + void show() { + state = state.copyWith.visible(true); + } + + void hide() { + state = FindInPageState.hidden(); + } + + Future findAll({required String text}) { + final service = GeckoFindInPageService( + tabId: ref.read(selectedTabProvider), + ); + + state = FindInPageState(visible: true, searchText: text); + + return service.findAll(text); + } + + Future findNext({bool forward = true}) { + final service = GeckoFindInPageService( + tabId: ref.read(selectedTabProvider), + ); + + state = state.copyWith.visible(true); + + return service.findNext(forward); + } + + Future clearMatches() { + final service = GeckoFindInPageService( + tabId: ref.read(selectedTabProvider), + ); + + return service.clearMatches(); + } + + @override + FindInPageState build() { + ref.listen(selectedTabStateProvider, (previous, next) async { + if (state.visible && state.searchText.isNotEmpty) { + if (previous != null) { + final loadingOrReloading = + previous.isLoading == true && next?.isLoading == false; + final tabSwitch = previous.id != next?.id; + + if (loadingOrReloading || tabSwitch) { + await clearMatches(); + await findAll(text: state.searchText!); + } + } + } + }); + + return FindInPageState.hidden(); + } +} diff --git a/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.g.dart b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.g.dart similarity index 50% rename from app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.g.dart rename to app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.g.dart index 0a58ce9e..a4b637c4 100644 --- a/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.g.dart +++ b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.g.dart @@ -1,28 +1,28 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'find_in_page_visibility.dart'; +part of 'find_in_page.dart'; // ************************************************************************** // RiverpodGenerator // ************************************************************************** -String _$findInPageVisibilityControllerHash() => - r'365819c6b181ff2cefc022360413a918457e06d7'; +String _$findInPageControllerHash() => + r'bb8584767aa8ad93e3bccd69d1012daaa8c5e9ea'; -/// See also [FindInPageVisibilityController]. -@ProviderFor(FindInPageVisibilityController) -final findInPageVisibilityControllerProvider = - AutoDisposeNotifierProvider.internal( - FindInPageVisibilityController.new, - name: r'findInPageVisibilityControllerProvider', +/// See also [FindInPageController]. +@ProviderFor(FindInPageController) +final findInPageControllerProvider = + AutoDisposeNotifierProvider.internal( + FindInPageController.new, + name: r'findInPageControllerProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$findInPageVisibilityControllerHash, + : _$findInPageControllerHash, dependencies: null, allTransitiveDependencies: null, ); -typedef _$FindInPageVisibilityController = AutoDisposeNotifier; +typedef _$FindInPageController = AutoDisposeNotifier; // 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/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.dart b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.dart deleted file mode 100644 index daccf25c..00000000 --- a/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -part 'find_in_page_visibility.g.dart'; - -@Riverpod() -class FindInPageVisibilityController extends _$FindInPageVisibilityController { - void show() { - state = true; - } - - void hide() { - state = false; - } - - @override - bool build() { - return false; - } -} diff --git a/app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.dart b/app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.dart new file mode 100644 index 00000000..502efb3b --- /dev/null +++ b/app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.dart @@ -0,0 +1,17 @@ +import 'package:copy_with_extension/copy_with_extension.dart'; +import 'package:fast_equatable/fast_equatable.dart'; + +part 'find_in_page_state.g.dart'; + +@CopyWith() +class FindInPageState with FastEquatable { + final bool visible; + final String? searchText; + + FindInPageState({required this.visible, required this.searchText}); + + FindInPageState.hidden() : visible = false, searchText = null; + + @override + List get hashParameters => [visible, searchText]; +} diff --git a/app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.g.dart b/app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.g.dart new file mode 100644 index 00000000..7382041f --- /dev/null +++ b/app/lib/features/geckoview/features/find_in_page/presentation/domain/entities/find_in_page_state.g.dart @@ -0,0 +1,66 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'find_in_page_state.dart'; + +// ************************************************************************** +// CopyWithGenerator +// ************************************************************************** + +abstract class _$FindInPageStateCWProxy { + FindInPageState visible(bool visible); + + FindInPageState searchText(String? searchText); + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `FindInPageState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// FindInPageState(...).copyWith(id: 12, name: "My name") + /// ```` + FindInPageState call({bool visible, String? searchText}); +} + +/// Proxy class for `copyWith` functionality. This is a callable class and can be used as follows: `instanceOfFindInPageState.copyWith(...)`. Additionally contains functions for specific fields e.g. `instanceOfFindInPageState.copyWith.fieldName(...)` +class _$FindInPageStateCWProxyImpl implements _$FindInPageStateCWProxy { + const _$FindInPageStateCWProxyImpl(this._value); + + final FindInPageState _value; + + @override + FindInPageState visible(bool visible) => this(visible: visible); + + @override + FindInPageState searchText(String? searchText) => + this(searchText: searchText); + + @override + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `FindInPageState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// FindInPageState(...).copyWith(id: 12, name: "My name") + /// ```` + FindInPageState call({ + Object? visible = const $CopyWithPlaceholder(), + Object? searchText = const $CopyWithPlaceholder(), + }) { + return FindInPageState( + visible: + visible == const $CopyWithPlaceholder() + ? _value.visible + // ignore: cast_nullable_to_non_nullable + : visible as bool, + searchText: + searchText == const $CopyWithPlaceholder() + ? _value.searchText + // ignore: cast_nullable_to_non_nullable + : searchText as String?, + ); + } +} + +extension $FindInPageStateCopyWith on FindInPageState { + /// Returns a callable class that can be used as follows: `instanceOfFindInPageState.copyWith(...)` or like so:`instanceOfFindInPageState.copyWith.fieldName(...)`. + // ignore: library_private_types_in_public_api + _$FindInPageStateCWProxy get copyWith => _$FindInPageStateCWProxyImpl(this); +} diff --git a/app/lib/features/geckoview/features/find_in_page/presentation/widgets/find_in_page.dart b/app/lib/features/geckoview/features/find_in_page/presentation/widgets/find_in_page.dart index 442d10d6..b0b8ba27 100644 --- a/app/lib/features/geckoview/features/find_in_page/presentation/widgets/find_in_page.dart +++ b/app/lib/features/geckoview/features/find_in_page/presentation/widgets/find_in_page.dart @@ -2,8 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:lensai/features/geckoview/domain/providers/tab_state.dart'; -import 'package:lensai/features/geckoview/features/find_in_page/domain/repositories/find_in_page.dart'; -import 'package:lensai/features/geckoview/features/find_in_page/presentation/controllers/find_in_page_visibility.dart'; +import 'package:lensai/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart'; class FindInPageWidget extends HookConsumerWidget { final EdgeInsetsGeometry padding; @@ -12,15 +11,15 @@ class FindInPageWidget extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final showFindInPage = ref.watch(findInPageVisibilityControllerProvider); - final findInteractionController = ref.watch( - findInPageRepositoryProvider(null).notifier, + final findInPageState = ref.watch(findInPageControllerProvider); + + final textController = useTextEditingController( + text: findInPageState.searchText, + keys: [findInPageState.searchText], ); - final textController = useTextEditingController(); - return Visibility( - visible: showFindInPage, + visible: findInPageState.visible, child: Padding( padding: padding, child: Material( @@ -38,9 +37,13 @@ class FindInPageWidget extends HookConsumerWidget { keyboardType: TextInputType.text, onSubmitted: (value) async { if (value == '') { - await findInteractionController.clearMatches(); + await ref + .read(findInPageControllerProvider.notifier) + .clearMatches(); } else { - await findInteractionController.findAll(text: value); + await ref + .read(findInPageControllerProvider.notifier) + .findAll(text: value); } }, ), @@ -69,23 +72,27 @@ class FindInPageWidget extends HookConsumerWidget { IconButton( icon: const Icon(Icons.arrow_upward), onPressed: () async { - await findInteractionController.findNext(forward: false); + await ref + .read(findInPageControllerProvider.notifier) + .findNext(forward: false); }, ), IconButton( icon: const Icon(Icons.arrow_downward), onPressed: () async { - await findInteractionController.findNext(); + await ref + .read(findInPageControllerProvider.notifier) + .findNext(); }, ), IconButton( icon: const Icon(Icons.clear), onPressed: () async { - ref - .read(findInPageVisibilityControllerProvider.notifier) - .hide(); + ref.read(findInPageControllerProvider.notifier).hide(); - await findInteractionController.clearMatches(); + await ref + .read(findInPageControllerProvider.notifier) + .clearMatches(); textController.clear(); }, ), diff --git a/packages/flutter_mozilla_components/lib/src/domain/entities/default_selection_actions.dart b/packages/flutter_mozilla_components/lib/src/domain/entities/default_selection_actions.dart index ec25789e..646ab7fe 100644 --- a/packages/flutter_mozilla_components/lib/src/domain/entities/default_selection_actions.dart +++ b/packages/flutter_mozilla_components/lib/src/domain/entities/default_selection_actions.dart @@ -60,6 +60,15 @@ class PrivateSearchAction extends BaseSelectionAction { ); } +class FindInPageAction extends BaseSelectionAction { + FindInPageAction(PerformAction action) + : super( + id: 'CUSTOM_CONTEXT_MENU_FIND_IN_PAGE', + title: 'Find in page', + performAction: action, + ); +} + class ShareAction extends BaseSelectionAction { ShareAction(PerformAction action) : super( diff --git a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_find_in_page.dart b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_find_in_page.dart index 72ab706e..545672b2 100644 --- a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_find_in_page.dart +++ b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_find_in_page.dart @@ -9,10 +9,6 @@ class GeckoFindInPageService { GeckoFindInPageService({required this.tabId, GeckoFindApi? api}) : _api = api ?? _apiInstance; - GeckoFindInPageService.forActiveTab({GeckoFindApi? api}) - : _api = api ?? _apiInstance, - tabId = null; - Future findAll(String text) { return _api.findAll(tabId, text); }