codemirror-editor.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { useCallback, useMemo, useState } from 'react';
  2. import { indentUnit } from '@codemirror/language';
  3. import { type Extension } from '@codemirror/state';
  4. import { scrollPastEnd } from '@codemirror/view';
  5. import {
  6. type SWRResponseWithUtils, withUtils, useSWRStatic,
  7. } from '@growi/core/dist/swr';
  8. import type { UseCodeMirrorEditor, UseCodeMirrorEditorResponse } from '../services';
  9. import { useCodeMirrorEditor } from '../services';
  10. const defaultExtensionsMain: Extension[] = [
  11. scrollPastEnd(),
  12. ];
  13. type MainEditorUtils = {
  14. // impl something
  15. setIndentSize: (indentSize?: number) => void,
  16. };
  17. export const useCodeMirrorEditorMain = (container?: HTMLDivElement | null): SWRResponseWithUtils<MainEditorUtils, UseCodeMirrorEditorResponse> => {
  18. const [indentUnitString, setIndentUnitString] = useState<string>(' ');
  19. const extentsionsMain: Extension[] = useMemo(() => [
  20. indentUnit.of(indentUnitString),
  21. ],
  22. [indentUnitString]);
  23. const props = useMemo<UseCodeMirrorEditor>(() => {
  24. return {
  25. container,
  26. autoFocus: true,
  27. extensions: [
  28. ...defaultExtensionsMain,
  29. ...extentsionsMain,
  30. ],
  31. };
  32. }, [container, extentsionsMain]);
  33. const states = useCodeMirrorEditor(props);
  34. const swrResponse = useSWRStatic('codeMirrorEditorMain', container != null ? states : undefined);
  35. // implement setIndentSize method
  36. const setIndentSize = useCallback((indentSize?: number): void => {
  37. if (indentSize != null) {
  38. setIndentUnitString(' '.repeat(indentSize));
  39. }
  40. }, [setIndentUnitString]);
  41. return withUtils(swrResponse, {
  42. // impl something
  43. setIndentSize,
  44. });
  45. };