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,
|
||||
slashItemClassName,
|
||||
} 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 & {
|
||||
onClickItem: (item: SlashMenuActionItem) => void;
|
||||
searching: boolean;
|
||||
@@ -228,10 +244,12 @@ export class SlashMenu extends WithDisposable(LitElement) {
|
||||
}
|
||||
|
||||
if (key !== 'Backspace' && this._queryState === 'no_result') {
|
||||
// if the following key is not the backspace key,
|
||||
// the slash menu will be closed
|
||||
this.abortController.abort();
|
||||
return;
|
||||
if (isTextInputKey(event)) {
|
||||
// allow typing to change query; don't abort here
|
||||
} else {
|
||||
this.abortController.abort();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (key === 'Escape') {
|
||||
|
||||
Reference in New Issue
Block a user