|
@@ -17,6 +17,7 @@ import { toastSuccess, toastError } from '~/client/util/apiNotification';
|
|
|
import { apiGet, apiPostForm } from '~/client/util/apiv1-client';
|
|
import { apiGet, apiPostForm } from '~/client/util/apiv1-client';
|
|
|
import { IEditorMethods } from '~/interfaces/editor-methods';
|
|
import { IEditorMethods } from '~/interfaces/editor-methods';
|
|
|
import { OptionsToSave } from '~/interfaces/page-operation';
|
|
import { OptionsToSave } from '~/interfaces/page-operation';
|
|
|
|
|
+import { SocketEventName } from '~/interfaces/websocket';
|
|
|
import {
|
|
import {
|
|
|
useCurrentPathname, useCurrentPageId, useIsEnabledAttachTitleHeader, useTemplateBodyData,
|
|
useCurrentPathname, useCurrentPageId, useIsEnabledAttachTitleHeader, useTemplateBodyData,
|
|
|
useIsEditable, useIsUploadableFile, useIsUploadableImage, useIsNotFound, useIsIndentSizeForced,
|
|
useIsEditable, useIsUploadableFile, useIsUploadableImage, useIsNotFound, useIsIndentSizeForced,
|
|
@@ -24,6 +25,7 @@ import {
|
|
|
import {
|
|
import {
|
|
|
useCurrentIndentSize, useSWRxSlackChannels, useIsSlackEnabled, useIsTextlintEnabled, usePageTagsForEditors,
|
|
useCurrentIndentSize, useSWRxSlackChannels, useIsSlackEnabled, useIsTextlintEnabled, usePageTagsForEditors,
|
|
|
useIsEnabledUnsavedWarning,
|
|
useIsEnabledUnsavedWarning,
|
|
|
|
|
+ useIsConflict,
|
|
|
useEditingMarkdown,
|
|
useEditingMarkdown,
|
|
|
} from '~/stores/editor';
|
|
} from '~/stores/editor';
|
|
|
import { useCurrentPagePath, useSWRxCurrentPage } from '~/stores/page';
|
|
import { useCurrentPagePath, useSWRxCurrentPage } from '~/stores/page';
|
|
@@ -32,6 +34,8 @@ import {
|
|
|
EditorMode,
|
|
EditorMode,
|
|
|
useEditorMode, useSelectedGrant,
|
|
useEditorMode, useSelectedGrant,
|
|
|
} from '~/stores/ui';
|
|
} from '~/stores/ui';
|
|
|
|
|
+import { useGlobalSocket } from '~/stores/websocket';
|
|
|
|
|
+import { registerGrowiFacade } from '~/utils/growi-facade';
|
|
|
import loggerFactory from '~/utils/logger';
|
|
import loggerFactory from '~/utils/logger';
|
|
|
|
|
|
|
|
|
|
|
|
@@ -80,7 +84,7 @@ const PageEditor = React.memo((): JSX.Element => {
|
|
|
const { data: isUploadableFile } = useIsUploadableFile();
|
|
const { data: isUploadableFile } = useIsUploadableFile();
|
|
|
const { data: isUploadableImage } = useIsUploadableImage();
|
|
const { data: isUploadableImage } = useIsUploadableImage();
|
|
|
|
|
|
|
|
- const { data: rendererOptions } = usePreviewOptions();
|
|
|
|
|
|
|
+ const { data: rendererOptions, mutate: mutateRendererOptions } = usePreviewOptions();
|
|
|
const { mutate: mutateIsEnabledUnsavedWarning } = useIsEnabledUnsavedWarning();
|
|
const { mutate: mutateIsEnabledUnsavedWarning } = useIsEnabledUnsavedWarning();
|
|
|
const saveOrUpdate = useSaveOrUpdate();
|
|
const saveOrUpdate = useSaveOrUpdate();
|
|
|
|
|
|
|
@@ -107,9 +111,63 @@ const PageEditor = React.memo((): JSX.Element => {
|
|
|
|
|
|
|
|
const slackChannels = useMemo(() => (slackChannelsData ? slackChannelsData.toString() : ''), [slackChannelsData]);
|
|
const slackChannels = useMemo(() => (slackChannelsData ? slackChannelsData.toString() : ''), [slackChannelsData]);
|
|
|
|
|
|
|
|
|
|
+ const { data: socket } = useGlobalSocket();
|
|
|
|
|
+
|
|
|
|
|
+ const { mutate: mutateIsConflict } = useIsConflict();
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
const editorRef = useRef<IEditorMethods>(null);
|
|
const editorRef = useRef<IEditorMethods>(null);
|
|
|
const previewRef = useRef<HTMLDivElement>(null);
|
|
const previewRef = useRef<HTMLDivElement>(null);
|
|
|
|
|
|
|
|
|
|
+ const checkIsConflict = useCallback((data) => {
|
|
|
|
|
+ const { s2cMessagePageUpdated } = data;
|
|
|
|
|
+
|
|
|
|
|
+ const isConflict = markdownToPreview !== s2cMessagePageUpdated.revisionBody;
|
|
|
|
|
+
|
|
|
|
|
+ mutateIsConflict(isConflict);
|
|
|
|
|
+
|
|
|
|
|
+ }, [markdownToPreview, mutateIsConflict]);
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ markdownToSave.current = initialValue;
|
|
|
|
|
+ setMarkdownToPreview(initialValue);
|
|
|
|
|
+ }, [initialValue]);
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ if (socket == null) { return }
|
|
|
|
|
+
|
|
|
|
|
+ socket.on(SocketEventName.PageUpdated, checkIsConflict);
|
|
|
|
|
+
|
|
|
|
|
+ return () => {
|
|
|
|
|
+ socket.off(SocketEventName.PageUpdated, checkIsConflict);
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ }, [socket, checkIsConflict]);
|
|
|
|
|
+
|
|
|
|
|
+ // const optionsToSave = useMemo(() => {
|
|
|
|
|
+ // if (grantData == null) {
|
|
|
|
|
+ // return;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // const slackChannels = slackChannelsData ? slackChannelsData.toString() : '';
|
|
|
|
|
+ // const optionsToSave = getOptionsToSave(
|
|
|
|
|
+ // isSlackEnabled ?? false, slackChannels,
|
|
|
|
|
+ // grantData.grant, grantData.grantedGroup?.id, grantData.grantedGroup?.name,
|
|
|
|
|
+ // pageTags || [],
|
|
|
|
|
+ // );
|
|
|
|
|
+ // return optionsToSave;
|
|
|
|
|
+ // }, [grantData, isSlackEnabled, pageTags, slackChannelsData]);
|
|
|
|
|
+ // register to facade
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ // for markdownRenderer
|
|
|
|
|
+ registerGrowiFacade({
|
|
|
|
|
+ markdownRenderer: {
|
|
|
|
|
+ optionsMutators: {
|
|
|
|
|
+ previewOptionsMutator: mutateRendererOptions,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ }, [mutateRendererOptions]);
|
|
|
|
|
+
|
|
|
const setMarkdownWithDebounce = useMemo(() => debounce(100, throttle(150, (value: string, isClean: boolean) => {
|
|
const setMarkdownWithDebounce = useMemo(() => debounce(100, throttle(150, (value: string, isClean: boolean) => {
|
|
|
markdownToSave.current = value;
|
|
markdownToSave.current = value;
|
|
|
setMarkdownToPreview(value);
|
|
setMarkdownToPreview(value);
|