improve search ui

This commit is contained in:
Fabian Freund
2026-03-09 17:13:41 +01:00
parent 6cb7ec8302
commit a815a3529a
@@ -150,12 +150,32 @@ class SearchScreen extends HookConsumerWidget {
initialSearchText?.isNotEmpty == true, initialSearchText?.isNotEmpty == true,
); );
useOnListenableChange(searchTextController, () { // Track if we started with a URL (edit mode) to show empty state initially
hasUserProvidedInput.value = searchTextController.text.isNotEmpty; final startedWithUrl = useMemoized(() {
if (initialSearchText == null || initialSearchText!.isEmpty) return false;
return classifyAddressBarInput(initialSearchText!)
is NavigateInputClassification;
}); });
final hasUserModifiedInput = useState(false);
final isUrlInput = useState(false);
useOnListenableChangeSelector(
searchTextController,
() => searchTextController.text,
() {
final text = searchTextController.text;
hasUserProvidedInput.value = text.isNotEmpty;
if (startedWithUrl) {
hasUserModifiedInput.value = text != initialSearchText;
}
isUrlInput.value = text.isNotEmpty &&
classifyAddressBarInput(text) is NavigateInputClassification;
},
);
final showNoInputSections = final showNoInputSections =
!hasUserProvidedInput.value && searchTextController.text.isEmpty; (startedWithUrl && !hasUserModifiedInput.value) ||
(!hasUserProvidedInput.value && searchTextController.text.isEmpty);
final searchFocusNode = useFocusNode(); final searchFocusNode = useFocusNode();
final textFieldKey = useMemoized(() => GlobalKey()); final textFieldKey = useMemoized(() => GlobalKey());
@@ -225,9 +245,13 @@ class SearchScreen extends HookConsumerWidget {
return null; return null;
}, [textFieldKey, isEditMode]); }, [textFieldKey, isEditMode]);
useOnListenableChange(isEditMode ? searchTextController : null, () { useOnListenableChangeSelector(
measureHeightWithRetry(); // ignore: discarded_futures isEditMode ? searchTextController : null,
}); () => searchTextController.text,
() {
measureHeightWithRetry(); // ignore: discarded_futures
},
);
useOnAppLifecycleStateChange((previous, current) { useOnAppLifecycleStateChange((previous, current) {
switch (current) { switch (current) {
@@ -635,14 +659,17 @@ class SearchScreen extends HookConsumerWidget {
group: SearchModuleGroup.emptyState, group: SearchModuleGroup.emptyState,
), ),
] else ...[ ] else ...[
FullSearchTermSuggestions( if (!isUrlInput.value)
searchTextController: searchTextController, FullSearchTermSuggestions(
activeBang: activeBang, searchTextController: searchTextController,
submitSearch: submitSearch, activeBang: activeBang,
domain: isEditMode ? existingTabState.url.host : null, submitSearch: submitSearch,
), domain: isEditMode ? existingTabState.url.host : null,
),
for (final entry in searchOrder) for (final entry in searchOrder)
if (searchWidgets.containsKey(entry.type)) if (searchWidgets.containsKey(entry.type) &&
(!isUrlInput.value ||
entry.type != SearchModuleType.articles))
searchWidgets[entry.type]!, searchWidgets[entry.type]!,
const _CustomizeSectionsButton( const _CustomizeSectionsButton(
group: SearchModuleGroup.search, group: SearchModuleGroup.search,