From 079db0516fb1a64830ef521ed9cc276e50556463 Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Mon, 22 Dec 2025 05:17:59 +0800 Subject: [PATCH] feat(search): add immediate search option and handle Enter key event --- cardinal/src/App.tsx | 10 ++++++++-- cardinal/src/hooks/useFileSearch.ts | 11 +++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cardinal/src/App.tsx b/cardinal/src/App.tsx index 48b91d7..fd92953 100644 --- a/cardinal/src/App.tsx +++ b/cardinal/src/App.tsx @@ -498,6 +498,13 @@ function App() { if (activeTab !== 'files') { return; } + if (event.key === 'Enter') { + queueSearch(event.currentTarget.value, { + immediate: true, + onSearchCommitted: updateHistoryFromInput, + }); + return; + } if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') { return; } @@ -508,7 +515,7 @@ function App() { event.preventDefault(); handleHistoryNavigation(event.key === 'ArrowUp' ? 'older' : 'newer'); }, - [activeTab, handleHistoryNavigation], + [activeTab, handleHistoryNavigation, queueSearch, updateHistoryFromInput], ); const handleHorizontalSync = useCallback((scrollLeft: number) => { @@ -600,7 +607,6 @@ function App() { // Switch to files: sync with reducer-managed search state and cancel pending timers ensureHistoryBuffer(''); resetSearchQuery(); - cancelPendingSearches(); } }, [ diff --git a/cardinal/src/hooks/useFileSearch.ts b/cardinal/src/hooks/useFileSearch.ts index 73cd4bd..cc8707f 100644 --- a/cardinal/src/hooks/useFileSearch.ts +++ b/cardinal/src/hooks/useFileSearch.ts @@ -29,6 +29,7 @@ type SearchParams = { }; type QueueSearchOptions = { + immediate?: boolean; onSearchCommitted?: (query: string) => void; }; @@ -285,13 +286,19 @@ export function useFileSearch(): UseFileSearchResult { const queueSearch = useCallback( (query: string, options?: QueueSearchOptions) => { updateSearchParams({ query }); - cancelTimer(debounceTimerRef); + cancelPendingSearches(); + if (options?.immediate) { + options.onSearchCommitted?.(query); + void handleSearch({ query }); + return; + } + debounceTimerRef.current = setTimeout(() => { options?.onSearchCommitted?.(query); handleSearch({ query }); }, SEARCH_DEBOUNCE_MS); }, - [handleSearch, updateSearchParams], + [cancelPendingSearches, handleSearch, updateSearchParams], ); const resetSearchQuery = useCallback(() => {