@furystack/shades-common-components
Version:
Common UI components for FuryStack Shades
57 lines • 2.26 kB
JavaScript
import { debounce, ObservableValue } from '@furystack/utils';
export class CommandPaletteManager {
commandProviders;
isOpened = new ObservableValue(false);
isLoading = new ObservableValue(false);
term = new ObservableValue('');
selectedIndex = new ObservableValue(0);
currentSuggestions = new ObservableValue([]);
keyPressListener = ((ev) => {
if (ev.key && ev.key.toLowerCase() === 'p' && ev.ctrlKey) {
this.isOpened.setValue(true);
this.currentSuggestions.setValue([]);
}
if (ev.key === 'Escape') {
this.isOpened.setValue(false);
}
}).bind(this);
[Symbol.dispose]() {
window.removeEventListener('keyup', this.keyPressListener);
this.isOpened[Symbol.dispose]();
this.isLoading[Symbol.dispose]();
this.term[Symbol.dispose]();
this.selectedIndex[Symbol.dispose]();
this.currentSuggestions[Symbol.dispose]();
}
selectSuggestion(injector, index = this.selectedIndex.getValue()) {
const selectedSuggestion = this.currentSuggestions.getValue()[index];
this.isOpened.setValue(false);
selectedSuggestion.onSelected({ injector });
}
lastGetSuggestionOptions;
getSuggestion = debounce(async (options) => {
try {
if (this.lastGetSuggestionOptions?.term === options.term) {
return;
}
this.isLoading.setValue(true);
this.lastGetSuggestionOptions = options;
this.currentSuggestions.setValue([]);
this.selectedIndex.setValue(0);
await Promise.all(this.commandProviders.map(async (cp) => {
const value = await cp(options);
if (this.lastGetSuggestionOptions === options) {
this.currentSuggestions.setValue([...this.currentSuggestions.getValue(), ...value].sortBy('score'));
}
}));
}
finally {
this.isLoading.setValue(false);
}
}, 250);
constructor(commandProviders) {
this.commandProviders = commandProviders;
window.addEventListener('keyup', this.keyPressListener, true);
}
}
//# sourceMappingURL=command-palette-manager.js.map