Skip to content

Commit d70644a

Browse files
authored
fix: get actual range when selecting item in suggests (command menu, emoji suggest) (#673)
1 parent 5da9f23 commit d70644a

File tree

6 files changed

+28
-15
lines changed

6 files changed

+28
-15
lines changed

src/extensions/behavior/Autocomplete/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import autocomplete from 'prosemirror-autocomplete';
1+
import {autocomplete} from 'prosemirror-autocomplete';
22
import {Plugin} from 'prosemirror-state';
33

44
import type {ExtensionAuto, ExtensionDeps} from '../../../core';
@@ -8,6 +8,7 @@ import {MainHandler} from './handler';
88
import type {AutocompleteItem, AutocompleteTrigger} from './types';
99

1010
export {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';
11+
export {getAutocompleteState} from './utils';
1112
export const AutocompleteDecoClassName = 'autocomplete';
1213

1314
export type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;

src/extensions/behavior/Autocomplete/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {Options, Trigger} from 'prosemirror-autocomplete';
33
export type {
44
FromTo,
55
AutocompleteAction,
6+
AutocompleteState,
67
Trigger as AutocompleteTrigger,
78
} from 'prosemirror-autocomplete';
89

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {pluginKey} from 'prosemirror-autocomplete';
2+
3+
import type {EditorState} from '#pm/state';
4+
5+
import type {AutocompleteState} from './types';
6+
7+
export function getAutocompleteState(state: EditorState): AutocompleteState | null {
8+
return pluginKey.getState(state) || null;
9+
}

src/extensions/behavior/CommandMenu/handler.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import {
99
type AutocompleteAction,
1010
AutocompleteActionKind,
1111
type AutocompleteHandler,
12-
type FromTo,
1312
closeAutocomplete,
13+
getAutocompleteState,
1414
} from '../Autocomplete';
1515
import {type RendererItem, getReactRendererFromState} from '../ReactRenderer';
1616

@@ -40,7 +40,6 @@ export class CommandHandler implements AutocompleteHandler {
4040

4141
#view?: EditorView;
4242
#anchor: Element | null = null;
43-
#range?: FromTo;
4443
#filterText?: string;
4544
#popupCloser?: AutocompletePopupCloser;
4645

@@ -155,13 +154,16 @@ export class CommandHandler implements AutocompleteHandler {
155154
}
156155

157156
private select() {
158-
if (!this.#view || !this.#range) return;
157+
if (!this.#view) return;
159158

160159
const action = this.#filteredActionsCarousel?.currentItem;
161160
if (!action) return;
162161

162+
const autocompleteState = getAutocompleteState(this.#view.state);
163+
if (!autocompleteState || !autocompleteState.active) return;
164+
163165
const view = this.#view;
164-
const range = this.#range;
166+
const {range} = autocompleteState;
165167

166168
view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());
167169
action.exec(this.#actionStorage);
@@ -223,14 +225,12 @@ export class CommandHandler implements AutocompleteHandler {
223225
this.#view?.focus();
224226
};
225227

226-
private updateState({view, range}: AutocompleteAction) {
228+
private updateState({view}: AutocompleteAction) {
227229
this.#view = view;
228-
this.#range = range;
229230
}
230231

231232
private clear() {
232233
this.#view = undefined;
233-
this.#range = undefined;
234234
this.#anchor = null;
235235
this.#filterText = undefined;
236236
this.#filteredActionsCarousel = undefined;

src/extensions/behavior/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {Selection} from './Selection';
1313
import {SelectionContext, type SelectionContextOptions} from './SelectionContext';
1414
import {WidgetDecoration} from './WidgetDecoration';
1515

16+
export * from './Autocomplete';
1617
export * from './ClicksOnEdges';
1718
export * from './Clipboard';
1819
export * from './CommandMenu';

src/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import {
88
type AutocompleteAction,
99
AutocompleteActionKind,
1010
type AutocompleteHandler,
11-
type FromTo,
1211
closeAutocomplete,
12+
getAutocompleteState,
1313
} from '../../../behavior/Autocomplete';
1414
import {EmojiConsts} from '../EmojiSpecs';
1515

@@ -30,7 +30,6 @@ export class EmojiHandler implements AutocompleteHandler {
3030

3131
private _view?: EditorView;
3232
private _anchor: Element | null = null;
33-
private _range?: FromTo;
3433
private _popupCloser?: AutocompletePopupCloser;
3534

3635
private _suggestProps?: EmojiSuggestComponentProps;
@@ -133,12 +132,16 @@ export class EmojiHandler implements AutocompleteHandler {
133132
}
134133

135134
private select() {
136-
const {_view: view, _range: range} = this;
137-
if (!view || !range) return;
135+
const {_view: view} = this;
136+
if (!view) return;
138137

139138
const emojiDef = this._emojiCarousel?.currentItem;
140139
if (!emojiDef) return;
141140

141+
const autocompleteState = getAutocompleteState(view.state);
142+
if (!autocompleteState || !autocompleteState.active) return;
143+
144+
const {range} = autocompleteState;
142145
const {tr, schema} = view.state;
143146
view.dispatch(
144147
tr.replaceWith(range.from, range.to, createEmoji(schema, emojiDef)).scrollIntoView(),
@@ -191,14 +194,12 @@ export class EmojiHandler implements AutocompleteHandler {
191194
this._view?.focus();
192195
};
193196

194-
private updateState({view, range}: AutocompleteAction) {
197+
private updateState({view}: AutocompleteAction) {
195198
this._view = view;
196-
this._range = range;
197199
}
198200

199201
private clear() {
200202
this._view = undefined;
201-
this._range = undefined;
202203
this._anchor = null;
203204
this._emojiCarousel = undefined;
204205
this._popupCloser?.cancelTimer();

0 commit comments

Comments
 (0)