avoid overflow of suggestions

This commit is contained in:
Fabian Freund
2024-06-07 07:46:40 +02:00
parent fa5b65eec7
commit 4ad80b4efb
5 changed files with 62 additions and 4 deletions
@@ -6,7 +6,7 @@ part of 'chat.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$kagiChatServiceHash() => r'80ead208a1d7ca0da98bd20f11c99efd0d682c8f'; String _$kagiChatServiceHash() => r'fda3874c955812fa62d555afaca352a3776dd692';
/// See also [KagiChatService]. /// See also [KagiChatService].
@ProviderFor(KagiChatService) @ProviderFor(KagiChatService)
@@ -1,9 +1,12 @@
// ignore_for_file: use_setters_to_change_properties // 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/entities/sheet.dart';
import 'package:bang_navigator/features/search_browser/domain/services/create_tab.dart'; import 'package:bang_navigator/features/search_browser/domain/services/create_tab.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:rxdart/rxdart.dart';
part 'providers.g.dart'; part 'providers.g.dart';
@@ -42,3 +45,23 @@ class BottomSheet extends _$BottomSheet {
state = null; state = null;
} }
} }
@Riverpod(keepAlive: true)
class BottomSheetExtend extends _$BottomSheetExtend {
late StreamController<double> _extentStreamController;
void add(double extent) {
_extentStreamController.add(extent);
}
@override
Stream<double> build() {
_extentStreamController = StreamController();
ref.onDispose(() async {
await _extentStreamController.close();
});
return _extentStreamController.stream
.sampleTime(const Duration(milliseconds: 50));
}
}
@@ -37,5 +37,21 @@ final bottomSheetProvider =
); );
typedef _$BottomSheet = AutoDisposeNotifier<Sheet?>; typedef _$BottomSheet = AutoDisposeNotifier<Sheet?>;
String _$bottomSheetExtendHash() => r'81ae254499d1d7f57309274b0f18747b94d6dda3';
/// See also [BottomSheetExtend].
@ProviderFor(BottomSheetExtend)
final bottomSheetExtendProvider =
StreamNotifierProvider<BottomSheetExtend, double>.internal(
BottomSheetExtend.new,
name: r'bottomSheetExtendProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bottomSheetExtendHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BottomSheetExtend = StreamNotifier<double>;
// ignore_for_file: type=lint // ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
@@ -357,6 +357,10 @@ class KagiScreen extends HookConsumerWidget {
if (notification.extent <= 0.1) { if (notification.extent <= 0.1) {
ref.read(bottomSheetProvider.notifier).dismiss(); ref.read(bottomSheetProvider.notifier).dismiss();
return true; return true;
} else {
ref
.read(bottomSheetExtendProvider.notifier)
.add(notification.extent);
} }
return false; return false;
@@ -1,4 +1,5 @@
import 'package:bang_navigator/features/kagi/domain/repositories/autosuggest.dart'; 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/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/presentation/widgets/speech_to_text_button.dart';
import 'package:bang_navigator/features/search_browser/utils/url_builder.dart' import 'package:bang_navigator/features/search_browser/utils/url_builder.dart'
@@ -87,6 +88,8 @@ class _AutocompleteOptions<T extends Object> extends StatelessWidget {
} }
class SearchTab extends HookConsumerWidget { class SearchTab extends HookConsumerWidget {
static const _maxOptionsHeight = 158.0;
final SharedContent? sharedContent; final SharedContent? sharedContent;
final OnSubmitUri onSubmit; final OnSubmitUri onSubmit;
@@ -118,12 +121,24 @@ class SearchTab extends HookConsumerWidget {
Consumer( Consumer(
builder: (context, ref, child) { builder: (context, ref, child) {
final optionsStream = ref.watch(autosuggestRepositoryProvider); 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<String>( return ExternalResultsAutocomplete<String>(
textEditingController: textController, textEditingController: textController,
optionsStream: optionsStream, optionsStream: optionsStream,
focusNode: focusNode, focusNode: focusNode,
optionsViewOpenDirection: OptionsViewOpenDirection.up, optionsViewOpenDirection: openDirection,
displayStringForOption: displayStringForOption:
// ignore: avoid_redundant_argument_values // ignore: avoid_redundant_argument_values
RawAutocomplete.defaultStringForOption, RawAutocomplete.defaultStringForOption,
@@ -135,8 +150,8 @@ class SearchTab extends HookConsumerWidget {
onSelected: onSelected, onSelected: onSelected,
options: options, options: options,
//Must match RawAutocomplete parent //Must match RawAutocomplete parent
openDirection: OptionsViewOpenDirection.up, openDirection: openDirection,
maxOptionsHeight: 200.0, maxOptionsHeight: _maxOptionsHeight,
); );
}, },
onTextChanged: (textEditingValue) { onTextChanged: (textEditingValue) {