From 4ad80b4efb9a63b156e81ec397f76624a6d6b8aa Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Fri, 7 Jun 2024 07:46:40 +0200 Subject: [PATCH] avoid overflow of suggestions --- .../features/kagi/data/services/chat.g.dart | 2 +- .../search_browser/domain/providers.dart | 23 +++++++++++++++++++ .../search_browser/domain/providers.g.dart | 16 +++++++++++++ .../presentation/screens/browser.dart | 4 ++++ .../presentation/widgets/tabs/search_tab.dart | 21 ++++++++++++++--- 5 files changed, 62 insertions(+), 4 deletions(-) diff --git a/app/lib/features/kagi/data/services/chat.g.dart b/app/lib/features/kagi/data/services/chat.g.dart index 09d10f6c..aef3e736 100644 --- a/app/lib/features/kagi/data/services/chat.g.dart +++ b/app/lib/features/kagi/data/services/chat.g.dart @@ -6,7 +6,7 @@ part of 'chat.dart'; // RiverpodGenerator // ************************************************************************** -String _$kagiChatServiceHash() => r'80ead208a1d7ca0da98bd20f11c99efd0d682c8f'; +String _$kagiChatServiceHash() => r'fda3874c955812fa62d555afaca352a3776dd692'; /// See also [KagiChatService]. @ProviderFor(KagiChatService) diff --git a/app/lib/features/search_browser/domain/providers.dart b/app/lib/features/search_browser/domain/providers.dart index 44f9bd76..2ca121d8 100644 --- a/app/lib/features/search_browser/domain/providers.dart +++ b/app/lib/features/search_browser/domain/providers.dart @@ -1,9 +1,12 @@ // ignore_for_file: use_setters_to_change_properties +import 'dart:async'; + import 'package:bang_navigator/features/search_browser/domain/entities/sheet.dart'; import 'package:bang_navigator/features/search_browser/domain/services/create_tab.dart'; import 'package:flutter/widgets.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:rxdart/rxdart.dart'; part 'providers.g.dart'; @@ -42,3 +45,23 @@ class BottomSheet extends _$BottomSheet { state = null; } } + +@Riverpod(keepAlive: true) +class BottomSheetExtend extends _$BottomSheetExtend { + late StreamController _extentStreamController; + + void add(double extent) { + _extentStreamController.add(extent); + } + + @override + Stream build() { + _extentStreamController = StreamController(); + ref.onDispose(() async { + await _extentStreamController.close(); + }); + + return _extentStreamController.stream + .sampleTime(const Duration(milliseconds: 50)); + } +} diff --git a/app/lib/features/search_browser/domain/providers.g.dart b/app/lib/features/search_browser/domain/providers.g.dart index 6f5df026..e919c703 100644 --- a/app/lib/features/search_browser/domain/providers.g.dart +++ b/app/lib/features/search_browser/domain/providers.g.dart @@ -37,5 +37,21 @@ final bottomSheetProvider = ); typedef _$BottomSheet = AutoDisposeNotifier; +String _$bottomSheetExtendHash() => r'81ae254499d1d7f57309274b0f18747b94d6dda3'; + +/// See also [BottomSheetExtend]. +@ProviderFor(BottomSheetExtend) +final bottomSheetExtendProvider = + StreamNotifierProvider.internal( + BottomSheetExtend.new, + name: r'bottomSheetExtendProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$bottomSheetExtendHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$BottomSheetExtend = StreamNotifier; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/app/lib/features/search_browser/presentation/screens/browser.dart b/app/lib/features/search_browser/presentation/screens/browser.dart index 4e8a25e8..5134ba6b 100644 --- a/app/lib/features/search_browser/presentation/screens/browser.dart +++ b/app/lib/features/search_browser/presentation/screens/browser.dart @@ -357,6 +357,10 @@ class KagiScreen extends HookConsumerWidget { if (notification.extent <= 0.1) { ref.read(bottomSheetProvider.notifier).dismiss(); return true; + } else { + ref + .read(bottomSheetExtendProvider.notifier) + .add(notification.extent); } return false; diff --git a/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart b/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart index 3bfe6251..85b3045d 100644 --- a/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart +++ b/app/lib/features/search_browser/presentation/widgets/tabs/search_tab.dart @@ -1,4 +1,5 @@ import 'package:bang_navigator/features/kagi/domain/repositories/autosuggest.dart'; +import 'package:bang_navigator/features/search_browser/domain/providers.dart'; import 'package:bang_navigator/features/search_browser/presentation/widgets/sheets/shared_content_sheet.dart'; import 'package:bang_navigator/features/search_browser/presentation/widgets/speech_to_text_button.dart'; import 'package:bang_navigator/features/search_browser/utils/url_builder.dart' @@ -87,6 +88,8 @@ class _AutocompleteOptions extends StatelessWidget { } class SearchTab extends HookConsumerWidget { + static const _maxOptionsHeight = 158.0; + final SharedContent? sharedContent; final OnSubmitUri onSubmit; @@ -118,12 +121,24 @@ class SearchTab extends HookConsumerWidget { Consumer( builder: (context, ref, child) { final optionsStream = ref.watch(autosuggestRepositoryProvider); + final openDirection = ref.watch( + bottomSheetExtendProvider.select((value) { + final extend = value.valueOrNull; + if (extend == null || + (MediaQuery.of(context).size.height * (1 - extend)) > + _maxOptionsHeight) { + return OptionsViewOpenDirection.up; + } else { + return OptionsViewOpenDirection.down; + } + }), + ); return ExternalResultsAutocomplete( textEditingController: textController, optionsStream: optionsStream, focusNode: focusNode, - optionsViewOpenDirection: OptionsViewOpenDirection.up, + optionsViewOpenDirection: openDirection, displayStringForOption: // ignore: avoid_redundant_argument_values RawAutocomplete.defaultStringForOption, @@ -135,8 +150,8 @@ class SearchTab extends HookConsumerWidget { onSelected: onSelected, options: options, //Must match RawAutocomplete parent - openDirection: OptionsViewOpenDirection.up, - maxOptionsHeight: 200.0, + openDirection: openDirection, + maxOptionsHeight: _maxOptionsHeight, ); }, onTextChanged: (textEditingValue) {