From 76bfe3658c3c3a3cc1643e931a8c76b4794c3ce2 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sat, 17 May 2025 20:33:48 +0200 Subject: [PATCH] dismiss suggestion --- .../address_with_suggestions_field.dart | 20 +++++++++++++++---- .../presentation/widgets/edit_url_dialog.dart | 20 +++++++++++++++---- .../presentation/widgets/search_field.dart | 20 +++++++++++++++---- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/address_with_suggestions_field.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/address_with_suggestions_field.dart index 28a627f7..1bbf4e89 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/address_with_suggestions_field.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/address_with_suggestions_field.dart @@ -8,6 +8,7 @@ import 'package:lensai/features/geckoview/features/search/domain/providers/engin import 'package:lensai/presentation/hooks/listenable_callback.dart'; import 'package:lensai/presentation/widgets/auto_suggest_text_field.dart'; import 'package:lensai/utils/uri_parser.dart' as uri_parser; +import 'package:nullability/nullability.dart'; class AddressWithSuggestionsField extends HookConsumerWidget { const AddressWithSuggestionsField({ @@ -27,15 +28,26 @@ class AddressWithSuggestionsField extends HookConsumerWidget { final addressTextFocusNode = useFocusNode(); final suggestion = useState(null); + final lastText = useRef(addressTextController.text); useListenableCallback(addressTextController, () async { if (addressTextController.text.isNotEmpty) { - final result = await ref - .read(engineSuggestionsProvider.notifier) - .getAutocompleteSuggestion(addressTextController.text); + if (suggestion.value.isNotEmpty && + lastText.value.length > 1 && + addressTextController.text == + lastText.value.substring(0, lastText.value.length - 1)) { + suggestion.value = null; + addressTextController.text = lastText.value; + } else if (addressTextController.text != lastText.value) { + final result = await ref + .read(engineSuggestionsProvider.notifier) + .getAutocompleteSuggestion(addressTextController.text); - suggestion.value = result; + suggestion.value = result; + } } + + lastText.value = addressTextController.text; }); return AutoSuggestTextField( diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/edit_url_dialog.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/edit_url_dialog.dart index bc0efd14..28e03f19 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/edit_url_dialog.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/edit_url_dialog.dart @@ -6,6 +6,7 @@ import 'package:lensai/presentation/hooks/listenable_callback.dart'; import 'package:lensai/presentation/widgets/auto_suggest_text_field.dart'; import 'package:lensai/utils/form_validators.dart'; import 'package:lensai/utils/uri_parser.dart' as uri_parser; +import 'package:nullability/nullability.dart'; class EditUrlDialog extends HookConsumerWidget { final Uri initialUrl; @@ -26,15 +27,26 @@ class EditUrlDialog extends HookConsumerWidget { final addressTextFocusNode = useFocusNode(); final suggestion = useState(null); + final lastText = useRef(addressTextController.text); useListenableCallback(addressTextController, () async { if (addressTextController.text.isNotEmpty) { - final result = await ref - .read(engineSuggestionsProvider.notifier) - .getAutocompleteSuggestion(addressTextController.text); + if (suggestion.value.isNotEmpty && + lastText.value.length > 1 && + addressTextController.text == + lastText.value.substring(0, lastText.value.length - 1)) { + suggestion.value = null; + addressTextController.text = lastText.value; + } else if (addressTextController.text != lastText.value) { + final result = await ref + .read(engineSuggestionsProvider.notifier) + .getAutocompleteSuggestion(addressTextController.text); - suggestion.value = result; + suggestion.value = result; + } } + + lastText.value = addressTextController.text; }); return Form( diff --git a/app/lib/features/geckoview/features/search/presentation/widgets/search_field.dart b/app/lib/features/geckoview/features/search/presentation/widgets/search_field.dart index 2dea0c0b..2e8d9a9e 100644 --- a/app/lib/features/geckoview/features/search/presentation/widgets/search_field.dart +++ b/app/lib/features/geckoview/features/search/presentation/widgets/search_field.dart @@ -8,6 +8,7 @@ import 'package:lensai/presentation/hooks/listenable_callback.dart'; import 'package:lensai/presentation/widgets/auto_suggest_text_field.dart'; import 'package:lensai/presentation/widgets/speech_to_text_button.dart'; import 'package:lensai/presentation/widgets/url_icon.dart'; +import 'package:nullability/nullability.dart'; class SearchField extends HookConsumerWidget { final TextEditingController textEditingController; @@ -42,16 +43,27 @@ class SearchField extends HookConsumerWidget { ); final suggestion = useState(null); + final lastText = useRef(textEditingController.text); if (showSuggestions) { useListenableCallback(textEditingController, () async { if (textEditingController.text.isNotEmpty) { - final result = await ref - .read(engineSuggestionsProvider.notifier) - .getAutocompleteSuggestion(textEditingController.text); + if (suggestion.value.isNotEmpty && + lastText.value.length > 1 && + textEditingController.text == + lastText.value.substring(0, lastText.value.length - 1)) { + suggestion.value = null; + textEditingController.text = lastText.value; + } else if (textEditingController.text != lastText.value) { + final result = await ref + .read(engineSuggestionsProvider.notifier) + .getAutocompleteSuggestion(textEditingController.text); - suggestion.value = result; + suggestion.value = result; + } } + + lastText.value = textEditingController.text; }); }