dismiss suggestion

This commit is contained in:
Fabian Freund
2025-05-17 20:33:48 +02:00
parent f265e4954c
commit 76bfe3658c
3 changed files with 48 additions and 12 deletions
@@ -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/hooks/listenable_callback.dart';
import 'package:lensai/presentation/widgets/auto_suggest_text_field.dart'; import 'package:lensai/presentation/widgets/auto_suggest_text_field.dart';
import 'package:lensai/utils/uri_parser.dart' as uri_parser; import 'package:lensai/utils/uri_parser.dart' as uri_parser;
import 'package:nullability/nullability.dart';
class AddressWithSuggestionsField extends HookConsumerWidget { class AddressWithSuggestionsField extends HookConsumerWidget {
const AddressWithSuggestionsField({ const AddressWithSuggestionsField({
@@ -27,15 +28,26 @@ class AddressWithSuggestionsField extends HookConsumerWidget {
final addressTextFocusNode = useFocusNode(); final addressTextFocusNode = useFocusNode();
final suggestion = useState<String?>(null); final suggestion = useState<String?>(null);
final lastText = useRef<String>(addressTextController.text);
useListenableCallback(addressTextController, () async { useListenableCallback(addressTextController, () async {
if (addressTextController.text.isNotEmpty) { if (addressTextController.text.isNotEmpty) {
final result = await ref if (suggestion.value.isNotEmpty &&
.read(engineSuggestionsProvider.notifier) lastText.value.length > 1 &&
.getAutocompleteSuggestion(addressTextController.text); 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( return AutoSuggestTextField(
@@ -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/presentation/widgets/auto_suggest_text_field.dart';
import 'package:lensai/utils/form_validators.dart'; import 'package:lensai/utils/form_validators.dart';
import 'package:lensai/utils/uri_parser.dart' as uri_parser; import 'package:lensai/utils/uri_parser.dart' as uri_parser;
import 'package:nullability/nullability.dart';
class EditUrlDialog extends HookConsumerWidget { class EditUrlDialog extends HookConsumerWidget {
final Uri initialUrl; final Uri initialUrl;
@@ -26,15 +27,26 @@ class EditUrlDialog extends HookConsumerWidget {
final addressTextFocusNode = useFocusNode(); final addressTextFocusNode = useFocusNode();
final suggestion = useState<String?>(null); final suggestion = useState<String?>(null);
final lastText = useRef<String>(addressTextController.text);
useListenableCallback(addressTextController, () async { useListenableCallback(addressTextController, () async {
if (addressTextController.text.isNotEmpty) { if (addressTextController.text.isNotEmpty) {
final result = await ref if (suggestion.value.isNotEmpty &&
.read(engineSuggestionsProvider.notifier) lastText.value.length > 1 &&
.getAutocompleteSuggestion(addressTextController.text); 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( return Form(
@@ -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/auto_suggest_text_field.dart';
import 'package:lensai/presentation/widgets/speech_to_text_button.dart'; import 'package:lensai/presentation/widgets/speech_to_text_button.dart';
import 'package:lensai/presentation/widgets/url_icon.dart'; import 'package:lensai/presentation/widgets/url_icon.dart';
import 'package:nullability/nullability.dart';
class SearchField extends HookConsumerWidget { class SearchField extends HookConsumerWidget {
final TextEditingController textEditingController; final TextEditingController textEditingController;
@@ -42,16 +43,27 @@ class SearchField extends HookConsumerWidget {
); );
final suggestion = useState<String?>(null); final suggestion = useState<String?>(null);
final lastText = useRef<String>(textEditingController.text);
if (showSuggestions) { if (showSuggestions) {
useListenableCallback(textEditingController, () async { useListenableCallback(textEditingController, () async {
if (textEditingController.text.isNotEmpty) { if (textEditingController.text.isNotEmpty) {
final result = await ref if (suggestion.value.isNotEmpty &&
.read(engineSuggestionsProvider.notifier) lastText.value.length > 1 &&
.getAutocompleteSuggestion(textEditingController.text); 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;
}); });
} }