UNPKG

@furystack/shades-common-components

Version:

Common UI components for FuryStack Shades

57 lines 2.26 kB
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