Skip to content

Commit 63849ba

Browse files
committed
client: dismiss upcoming change event
...rather than tracking value changes, which is finnicky and broke how we detected pressing enter/return to acivate search (on 'change' event)
1 parent 59e987d commit 63849ba

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

src/static/js/client/sidebar-search.js

+25-17
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export const info = {
7777
stoppedTypingTimeout: null,
7878
stoppedScrollingTimeout: null,
7979
focusFirstResultTimeout: null,
80+
dismissChangeEventTimeout: null,
8081

8182
indexDownloadStatuses: Object.create(null),
8283
},
@@ -106,6 +107,7 @@ export const info = {
106107
stoppedScrollingDelay: 200,
107108

108109
pressDownToFocusFirstResultLatency: 200,
110+
dismissChangeEventAfterFocusingFirstResultLatency: 50,
109111

110112
maxActiveResultsStorage: 100000,
111113
},
@@ -305,33 +307,24 @@ export function mutatePageContent() {
305307
info.searchBox.appendChild(info.endSearchLine);
306308
}
307309

308-
function trackSidebarSearchInputChanged() {
309-
const {state} = info;
310-
311-
const newValue = info.searchInput.value;
312-
313-
if (newValue === state.currentValue) {
314-
return false;
315-
} else {
316-
state.currentValue = newValue;
317-
return !!newValue;
318-
}
319-
}
320-
321310
export function addPageListeners() {
322311
if (!info.searchInput) return;
323312

324313
info.searchInput.addEventListener('change', _domEvent => {
325-
if (trackSidebarSearchInputChanged()) {
326-
activateSidebarSearch(info.searchInput.value);
314+
const {state} = info;
315+
316+
if (state.dismissChangeEventTimeout) {
317+
state.dismissChangeEventTimeout = null;
318+
clearTimeout(state.dismissChangeEventTimeout);
319+
return;
327320
}
321+
322+
activateSidebarSearch(info.searchInput.value);
328323
});
329324

330325
info.searchInput.addEventListener('input', _domEvent => {
331326
const {settings, state} = info;
332327

333-
trackSidebarSearchInputChanged();
334-
335328
if (!info.searchInput.value) {
336329
clearSidebarSearch();
337330
return;
@@ -362,6 +355,10 @@ export function addPageListeners() {
362355
clearTimeout(state.stoppedTypingTimeout);
363356
state.stoppedTypingTimeout = null;
364357

358+
if (state.focusFirstResultTimeout) {
359+
clearTimeout(state.focusFirstResultTimeout);
360+
}
361+
365362
state.focusFirstResultTimeout =
366363
setTimeout(() => {
367364
state.focusFirstResultTimeout = null;
@@ -862,11 +859,22 @@ function hideSidebarSearchResults() {
862859
}
863860

864861
function focusFirstSidebarSearchResult() {
862+
const {settings, state} = info;
863+
865864
const elem = info.results.firstChild;
866865
if (!elem?.classList.contains('wiki-search-result')) {
867866
return;
868867
}
869868

869+
if (state.dismissChangeEventTimeout) {
870+
clearTimeout(state.dismissChangeEventTimeout);
871+
}
872+
873+
state.dismissChangeEventTimeout =
874+
setTimeout(() => {
875+
state.dismissChangeEventTimeout = null;
876+
}, settings.dismissChangeEventAfterFocusingFirstResultLatency);
877+
870878
elem.focus({focusVisible: true});
871879
}
872880

0 commit comments

Comments
 (0)