mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-25 18:26:05 +08:00
fix(editor): keep slash menu alive on text input when no_result (#14141)
**Problem** Slash menu can be prematurely aborted when the query is still in `no_result` due to async query updates after deletion. **Solution** Keep the slash menu alive on text input while in `no_result`, preventing aborts based on a stale query state. **Repro** 1. Type `/eeee` 2. Delete to `/` 3. Type `h` 4. Slash menu should recover and show results <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Enhanced slash-menu keyboard interaction: users can now continue typing to refine queries when no results are displayed, instead of the menu closing unexpectedly. Keyboard navigation and other controls remain responsive. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
This commit is contained in:
@@ -46,6 +46,22 @@ import {
|
|||||||
parseGroup,
|
parseGroup,
|
||||||
slashItemClassName,
|
slashItemClassName,
|
||||||
} from './utils.js';
|
} from './utils.js';
|
||||||
|
const isTextInputKey = (e: KeyboardEvent) => {
|
||||||
|
// Keys combined with modifiers are not considered text input
|
||||||
|
if (e.ctrlKey || e.metaKey || e.altKey) return false;
|
||||||
|
|
||||||
|
// During IME composition, do not treat keydown as text input.
|
||||||
|
// Query updates are handled by input/composition hooks.
|
||||||
|
if (e.isComposing) return false;
|
||||||
|
|
||||||
|
// Only allow single-character keys as text input
|
||||||
|
if (e.key.length !== 1) return false;
|
||||||
|
|
||||||
|
// Keep existing behavior: space closes the slash menu
|
||||||
|
if (e.key === ' ') return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
type InnerSlashMenuContext = SlashMenuContext & {
|
type InnerSlashMenuContext = SlashMenuContext & {
|
||||||
onClickItem: (item: SlashMenuActionItem) => void;
|
onClickItem: (item: SlashMenuActionItem) => void;
|
||||||
searching: boolean;
|
searching: boolean;
|
||||||
@@ -228,10 +244,12 @@ export class SlashMenu extends WithDisposable(LitElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (key !== 'Backspace' && this._queryState === 'no_result') {
|
if (key !== 'Backspace' && this._queryState === 'no_result') {
|
||||||
// if the following key is not the backspace key,
|
if (isTextInputKey(event)) {
|
||||||
// the slash menu will be closed
|
// allow typing to change query; don't abort here
|
||||||
this.abortController.abort();
|
} else {
|
||||||
return;
|
this.abortController.abort();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key === 'Escape') {
|
if (key === 'Escape') {
|
||||||
|
|||||||
Reference in New Issue
Block a user