| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import { useCallback, useMemo } from 'react'
- import MiniSearch from 'minisearch'
- import { CommandPaletteSearchResult, CommandPaletteSource } from '../types'
- import {
- Command,
- useCommandRegistry,
- } from '@/features/ide-react/context/command-registry-context'
- const ENABLED_COMMANDS: string[] = [
- 'new_file',
- 'new_folder',
- 'upload_file',
- 'open-settings',
- 'show_version_history',
- 'word_count',
- 'view-pdf-presentation-mode',
- 'comment',
- 'compile',
- 'stop-compile',
- 'recompile-from-scratch',
- 'synctex-sync-to-pdf',
- 'synctex-sync-to-code',
- 'insert-inline-math',
- 'insert-display-math',
- 'insert-figure-from-computer',
- 'insert-figure-from-project-files',
- 'insert-figure-from-another-project',
- 'insert-figure-from-url',
- 'insert-table',
- 'insert-citation',
- 'insert-link',
- 'insert-cross-reference',
- ]
- const useCommandRegistrySource = (): CommandPaletteSource => {
- const { registry } = useCommandRegistry()
- const commands = useMemo(() => {
- const enabled = new Set(ENABLED_COMMANDS)
- return [...registry.values()].filter(
- c => enabled.has(c.id) && !c.disabled && c.handler
- )
- }, [registry])
- const defaults = useCallback((): CommandPaletteSearchResult[] => {
- return commands.map(command => ({
- title: command.label,
- onSelect: () => command.handler!({ location: 'command-palette' }),
- score: 1,
- }))
- }, [commands])
- const index = useMemo(() => {
- const miniSearch = new MiniSearch<Command>({
- fields: ['label'],
- storeFields: ['id'],
- idField: 'id',
- })
- miniSearch.addAll(commands)
- return miniSearch
- }, [commands])
- return useMemo<CommandPaletteSource>(
- () => ({
- id: 'command-registry',
- search(query) {
- const results = index.search(query, {
- prefix: true,
- fuzzy: term => (term.length > 3 ? 0.2 : false),
- })
- return results.flatMap(({ id, score }) => {
- const command = registry.get(id)
- if (!command?.handler) return []
- return [
- {
- title: command.label,
- onSelect: () => command.handler!({ location: 'command-palette' }),
- score,
- },
- ]
- })
- },
- defaults,
- }),
- [index, registry, defaults]
- )
- }
- export default useCommandRegistrySource
|