فهرست منبع

Fixed frontend

Shun Miyazawa 3 سال پیش
والد
کامیت
ff51da1011

+ 8 - 3
packages/app/src/client/services/page-operation.ts

@@ -98,7 +98,7 @@ const createPage = async(pagePath: string, markdown: string, tmpParams: OptionsT
 };
 
 // TODO: define return type
-const updatePage = async(pageId: string, revisionId: string, markdown: string, tmpParams: OptionsToSave) => {
+const updatePage = async(pageId: string, revisionId: Nullable<string>, markdown: string, tmpParams: OptionsToSave) => {
   // clone
   const params = Object.assign(tmpParams, {
     page_id: pageId,
@@ -115,13 +115,16 @@ const updatePage = async(pageId: string, revisionId: string, markdown: string, t
 
 type PageInfo= {
   path: string,
+  isNotFound?: boolean,
   pageId: Nullable<string>,
   revisionId: Nullable<string>,
 }
 
 // TODO: define return type
 export const saveOrUpdate = async(optionsToSave: OptionsToSave, pageInfo: PageInfo, markdown: string) => {
-  const { path, pageId, revisionId } = pageInfo;
+  const {
+    path, isNotFound, pageId, revisionId,
+  } = pageInfo;
 
   const options = Object.assign({}, optionsToSave);
 
@@ -143,12 +146,14 @@ export const saveOrUpdate = async(optionsToSave: OptionsToSave, pageInfo: PageIn
   // markdown = pageEditor.getMarkdown();
   // }
 
+  const isEmpty = pageId != null && isNotFound;
+
   let res;
   if (pageId == null) {
     res = await createPage(path, markdown, options);
   }
   else {
-    if (revisionId == null) {
+    if (!isEmpty && revisionId == null) {
       const msg = '\'revisionId\' is required to update page';
       throw new Error(msg);
     }

+ 10 - 3
packages/app/src/components/PageEditor.tsx

@@ -16,7 +16,7 @@ import { getOptionsToSave } from '~/client/util/editor';
 import { IEditorMethods } from '~/interfaces/editor-methods';
 import {
   useCurrentPagePath, useCurrentPathname, useCurrentPageId, useEditingMarkdown,
-  useIsEditable, useIsIndentSizeForced, useIsUploadableFile, useIsUploadableImage,
+  useIsEditable, useIsIndentSizeForced, useIsUploadableFile, useIsUploadableImage, useIsNotFound,
 } from '~/stores/context';
 import {
   useCurrentIndentSize, useSWRxSlackChannels, useIsSlackEnabled, useIsTextlintEnabled, usePageTagsForEditors,
@@ -58,6 +58,7 @@ const PageEditor = React.memo((): JSX.Element => {
   const { data: editingMarkdown } = useEditingMarkdown();
   const { data: grantData, mutate: mutateGrant } = useSelectedGrant();
   const { data: pageTags } = usePageTagsForEditors(pageId);
+  const { data: isNotFound } = useIsNotFound();
 
   const { data: isEditable } = useIsEditable();
   const { data: editorMode, mutate: mutateEditorMode } = useEditorMode();
@@ -114,7 +115,13 @@ const PageEditor = React.memo((): JSX.Element => {
     );
 
     try {
-      await saveOrUpdate(optionsToSave, { pageId, path: currentPagePath || currentPathname, revisionId: currentRevisionId }, markdownToSave.current);
+      const pageInfo = {
+        pageId,
+        isNotFound,
+        path: currentPagePath || currentPathname,
+        revisionId: currentRevisionId,
+      };
+      await saveOrUpdate(optionsToSave, pageInfo, markdownToSave.current);
       await mutateCurrentPage();
       mutateIsEnabledUnsavedWarning(false);
       return true;
@@ -134,7 +141,7 @@ const PageEditor = React.memo((): JSX.Element => {
     }
 
   // eslint-disable-next-line max-len
-  }, [grantData, isSlackEnabled, currentPathname, slackChannels, pageTags, pageId, currentPagePath, currentRevisionId, mutateCurrentPage, mutateIsEnabledUnsavedWarning]);
+  }, [grantData, isSlackEnabled, currentPathname, slackChannels, pageTags, pageId, currentPagePath, currentRevisionId, isNotFound, mutateCurrentPage, mutateIsEnabledUnsavedWarning]);
 
   const saveAndReturnToViewHandler = useCallback(async(opts?: {overwriteScopesOfDescendants: boolean}) => {
     if (editorMode !== EditorMode.Editor) {

+ 20 - 3
packages/app/src/components/PageEditorByHackmd.tsx

@@ -13,7 +13,7 @@ import { apiPost } from '~/client/util/apiv1-client';
 import { getOptionsToSave } from '~/client/util/editor';
 import { IResHackmdIntegrated, IResHackmdDiscard } from '~/interfaces/hackmd';
 import {
-  useCurrentPagePath, useCurrentPageId, useHackmdUri, usePageIdOnHackmd, useHasDraftOnHackmd, useRevisionIdHackmdSynced,
+  useCurrentPagePath, useCurrentPageId, useHackmdUri, usePageIdOnHackmd, useHasDraftOnHackmd, useRevisionIdHackmdSynced, useIsNotFound,
 } from '~/stores/context';
 import {
   useSWRxSlackChannels, useIsSlackEnabled, usePageTagsForEditors, useIsEnabledUnsavedWarning,
@@ -48,6 +48,7 @@ export const PageEditorByHackmd = (): JSX.Element => {
   const { mutate: mutateTagsInfo } = useSWRxTagsInfo(pageId);
   const { data: grant } = useSelectedGrant();
   const { data: hackmdUri } = useHackmdUri();
+  const { data: isNotFound } = useIsNotFound();
 
   // pageData
   const { data: pageData, mutate: mutatePageData } = useSWRxCurrentPage();
@@ -97,7 +98,14 @@ export const PageEditorByHackmd = (): JSX.Element => {
 
       const markdown = await hackmdEditorRef.current.getValue();
 
-      await saveOrUpdate(optionsToSave, { pageId, path: currentPagePath || currentPathname, revisionId: revision?._id }, markdown);
+      const pageInfo = {
+        pageId,
+        isNotFound,
+        path: currentPagePath || currentPathname,
+        revisionId: revision?._id,
+      };
+
+      await saveOrUpdate(optionsToSave, pageInfo, markdown);
       await mutatePageData();
       await mutateTagsInfo();
       mutateEditorMode(EditorMode.View);
@@ -116,6 +124,7 @@ export const PageEditorByHackmd = (): JSX.Element => {
       pageTags,
       pageId,
       currentPagePath,
+      isNotFound,
       mutatePageData,
       mutateEditorMode,
       mutateTagsInfo,
@@ -229,7 +238,14 @@ export const PageEditorByHackmd = (): JSX.Element => {
       const optionsToSave = getOptionsToSave(
         isSlackEnabled, slackChannels, grant.grant, grant.grantedGroup?.id, grant.grantedGroup?.name, pageTags ?? [], true,
       );
-      const res = await saveOrUpdate(optionsToSave, { pageId, path: currentPagePathOrPathname, revisionId: revisionIdHackmdSynced }, markdown);
+
+      const pageInfo = {
+        pageId,
+        isNotFound,
+        path: currentPagePathOrPathname,
+        revisionId: revisionIdHackmdSynced,
+      };
+      const res = await saveOrUpdate(optionsToSave, pageInfo, markdown);
 
       // update pageData
       mutatePageData(res);
@@ -257,6 +273,7 @@ export const PageEditorByHackmd = (): JSX.Element => {
       currentPathname,
       pageTags,
       currentPagePath,
+      isNotFound,
       mutatePageData,
       mutateRevisionIdHackmdSynced,
       mutateHasDraftOnHackmd,