val 0.7.0

An arbitrary precision calculator language
Documentation
import { useEditorSettings } from '@/contexts/editor-settings-context';
import { createEditorTheme } from '@/lib/editor-theme';
import { createDiagnosticsExtension } from '@/lib/extensions/diagnostics';
import { highlightExtension } from '@/lib/extensions/highlight';
import { syntaxHighlightExtension } from '@/lib/extensions/syntax-highlight';
import { bracketMatching, indentOnInput } from '@codemirror/language';
import { EditorState, type Extension } from '@codemirror/state';
import { EditorView, keymap } from '@codemirror/view';
import { vim } from '@replit/codemirror-vim';
import { useMemo } from 'react';
import type { ValError } from 'val-wasm';

const baseExtensions: Extension[] = [
  bracketMatching(),
  highlightExtension,
  indentOnInput(),
  syntaxHighlightExtension,
];

interface UseEditorExtensionsOptions {
  darkMode: boolean;
  errors: ValError[];
  onRun: () => void;
}

export function useEditorExtensions({
  darkMode,
  errors,
  onRun,
}: UseEditorExtensionsOptions): Extension[] {
  const { settings } = useEditorSettings();

  const diagnostics = useMemo(
    () => createDiagnosticsExtension(errors),
    [errors]
  );

  const theme = useMemo(
    () => createEditorTheme(settings.fontSize, darkMode),
    [settings.fontSize, darkMode]
  );

  const keybindings = useMemo(
    () => (settings.keybindings === 'vim' ? vim() : []),
    [settings.keybindings]
  );

  return useMemo(
    () => [
      baseExtensions,
      keymap.of([
        {
          key: 'Mod-Enter',
          run: () => {
            onRun();
            return true;
          },
        },
      ]),
      EditorState.tabSize.of(settings.tabSize),
      diagnostics,
      theme,
      keybindings,
      settings.lineWrapping ? EditorView.lineWrapping : [],
    ],
    [
      diagnostics,
      theme,
      keybindings,
      onRun,
      settings.lineWrapping,
      settings.tabSize,
    ]
  );
}