@furystack/shades-common-components
Version:
72 lines • 3.27 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { Injectable } from '@furystack/inject';
import { debounce, ObservableValue } from '@furystack/utils';
let CommandPaletteManager = 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);
}
};
CommandPaletteManager = __decorate([
Injectable({ lifetime: 'singleton' }),
__metadata("design:paramtypes", [Array])
], CommandPaletteManager);
export { CommandPaletteManager };
//# sourceMappingURL=command-palette-manager.js.map