|
|
@@ -1,24 +1,56 @@
|
|
|
-import type { Extension } from '@codemirror/state';
|
|
|
-import { scrollPastEnd } from '@codemirror/view';
|
|
|
-import type { SWRResponse } from 'swr';
|
|
|
+import { useMemo } from 'react';
|
|
|
|
|
|
+import { EditorState, type Extension } from '@codemirror/state';
|
|
|
+import { scrollPastEnd } from '@codemirror/view';
|
|
|
+import {
|
|
|
+ type SWRResponseWithUtils, withUtils,
|
|
|
+} from '@growi/core/dist/swr';
|
|
|
|
|
|
-import type { UseCodeMirrorEditorStates } from '../services';
|
|
|
-import { useCodeMirrorEditor } from '../services';
|
|
|
+import type { UseCodeMirrorEditor, UseCodeMirrorEditorStates } from '../services';
|
|
|
+import { defaultExtensionsToInit, useCodeMirrorEditor } from '../services';
|
|
|
|
|
|
import { useStaticSWR } from './use-static-swr';
|
|
|
|
|
|
-export const defaultExtensionsMain: Extension[] = [
|
|
|
+const defaultExtensionsMain: Extension[] = [
|
|
|
scrollPastEnd(),
|
|
|
];
|
|
|
|
|
|
-export const useCodeMirrorEditorMain = (container?: HTMLDivElement | null): SWRResponse<UseCodeMirrorEditorStates> => {
|
|
|
- const states = useCodeMirrorEditor({
|
|
|
- container,
|
|
|
- autoFocus: true,
|
|
|
- extensions: [
|
|
|
- scrollPastEnd(),
|
|
|
- ],
|
|
|
+const defaultExtensionsToInitMain: Extension[] = [
|
|
|
+ ...defaultExtensionsToInit,
|
|
|
+ ...defaultExtensionsMain,
|
|
|
+];
|
|
|
+
|
|
|
+type OperationUtils = {
|
|
|
+ initDoc: (doc?: string) => void,
|
|
|
+}
|
|
|
+
|
|
|
+export const useCodeMirrorEditorMain = (container?: HTMLDivElement | null): SWRResponseWithUtils<OperationUtils, UseCodeMirrorEditorStates> => {
|
|
|
+ const props = useMemo<UseCodeMirrorEditor>(() => {
|
|
|
+ return {
|
|
|
+ container,
|
|
|
+ autoFocus: true,
|
|
|
+ extensions: defaultExtensionsMain,
|
|
|
+ };
|
|
|
+ }, [container]);
|
|
|
+
|
|
|
+ const states = useCodeMirrorEditor(props);
|
|
|
+
|
|
|
+ const swrResponse = useStaticSWR('codeMirrorEditorMain', container != null ? states : undefined);
|
|
|
+
|
|
|
+ return withUtils(swrResponse, {
|
|
|
+ initDoc: (doc) => {
|
|
|
+ const currentView = swrResponse.data?.view;
|
|
|
+ if (currentView == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // create a new state
|
|
|
+ const newState = EditorState.create({
|
|
|
+ doc,
|
|
|
+ extensions: defaultExtensionsToInitMain,
|
|
|
+ });
|
|
|
+
|
|
|
+ currentView.setState(newState);
|
|
|
+ },
|
|
|
});
|
|
|
- return useStaticSWR('codeMirrorEditorMain', container != null ? states : undefined);
|
|
|
};
|