Sfoglia il codice sorgente

show pagePresentationModal with swr

kaori 4 anni fa
parent
commit
4b8aab1cd3

+ 2 - 0
packages/app/src/client/base.jsx

@@ -10,6 +10,7 @@ import PageCreateModal from '../components/PageCreateModal';
 import PageDeleteModal from '../components/PageDeleteModal';
 import PageDeleteModal from '../components/PageDeleteModal';
 import PageDuplicateModal from '../components/PageDuplicateModal';
 import PageDuplicateModal from '../components/PageDuplicateModal';
 import PageRenameModal from '../components/PageRenameModal';
 import PageRenameModal from '../components/PageRenameModal';
+import PagePresentationModal from '../components/PagePresentationModal';
 import PageAccessoriesModal from '../components/PageAccessoriesModal';
 import PageAccessoriesModal from '../components/PageAccessoriesModal';
 
 
 import AppContainer from '~/client/services/AppContainer';
 import AppContainer from '~/client/services/AppContainer';
@@ -48,6 +49,7 @@ const componentMappings = {
   'page-delete-modal': <PageDeleteModal />,
   'page-delete-modal': <PageDeleteModal />,
   'page-duplicate-modal': <PageDuplicateModal />,
   'page-duplicate-modal': <PageDuplicateModal />,
   'page-rename-modal': <PageRenameModal />,
   'page-rename-modal': <PageRenameModal />,
+  'page-presentation-modal': <PagePresentationModal />,
   'page-accessories-modal': <PageAccessoriesModal />,
   'page-accessories-modal': <PageAccessoriesModal />,
   'descendants-page-list-modal': <DescendantsPageListModal />,
   'descendants-page-list-modal': <DescendantsPageListModal />,
 
 

+ 6 - 24
packages/app/src/components/Navbar/GrowiContextualSubNavigation.tsx

@@ -10,7 +10,7 @@ import EditorContainer from '~/client/services/EditorContainer';
 import {
 import {
   EditorMode, useDrawerMode, useEditorMode, useIsDeviceSmallerThanMd, useIsAbleToShowPageManagement, useIsAbleToShowTagLabel,
   EditorMode, useDrawerMode, useEditorMode, useIsDeviceSmallerThanMd, useIsAbleToShowPageManagement, useIsAbleToShowTagLabel,
   useIsAbleToShowPageEditorModeManager, useIsAbleToShowPageAuthors, usePageAccessoriesModal, PageAccessoriesModalContents,
   useIsAbleToShowPageEditorModeManager, useIsAbleToShowPageAuthors, usePageAccessoriesModal, PageAccessoriesModalContents,
-  usePageDuplicateModalStatus, usePageRenameModalStatus, usePageDeleteModal,
+  usePageDuplicateModalStatus, usePageRenameModalStatus, usePageDeleteModal, usePagePresentationModalStatus,
 } from '~/stores/ui';
 } from '~/stores/ui';
 import {
 import {
   useCurrentCreatedAt, useCurrentUpdatedAt, useCurrentPageId, useRevisionId, useCurrentPagePath,
   useCurrentCreatedAt, useCurrentUpdatedAt, useCurrentPageId, useRevisionId, useCurrentPagePath,
@@ -30,7 +30,6 @@ import { AdditionalMenuItemsRendererProps } from '../Common/Dropdown/PageItemCon
 import { SubNavButtons } from './SubNavButtons';
 import { SubNavButtons } from './SubNavButtons';
 import PageEditorModeManager from './PageEditorModeManager';
 import PageEditorModeManager from './PageEditorModeManager';
 import { GrowiSubNavigation } from './GrowiSubNavigation';
 import { GrowiSubNavigation } from './GrowiSubNavigation';
-import PagePresentationModal from '../PagePresentationModal';
 import PresentationIcon from '../Icons/PresentationIcon';
 import PresentationIcon from '../Icons/PresentationIcon';
 import { exportAsMarkdown } from '~/client/services/page-operation';
 import { exportAsMarkdown } from '~/client/services/page-operation';
 
 
@@ -46,22 +45,20 @@ const AdditionalMenuItems = (props: AdditionalMenuItemsProps): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
 
 
   const {
   const {
-    pageId, revisionId, isLinkSharingDisabled, onClickPresentationMenuItem,
+    pageId, revisionId, isLinkSharingDisabled,
   } = props;
   } = props;
 
 
-  const openPagePresentationModalHandler = () => {
-    onClickPresentationMenuItem(true);
-  };
-
   const { data: isGuestUser } = useIsGuestUser();
   const { data: isGuestUser } = useIsGuestUser();
   const { data: isSharedUser } = useIsSharedUser();
   const { data: isSharedUser } = useIsSharedUser();
+  const { open: openPresentationModal } = usePagePresentationModalStatus();
 
 
   const { open } = usePageAccessoriesModal();
   const { open } = usePageAccessoriesModal();
+  const href = '?presentation=1';
 
 
   return (
   return (
     <>
     <>
       {/* Presentation */}
       {/* Presentation */}
-      <DropdownItem onClick={openPagePresentationModalHandler}>
+      <DropdownItem onClick={() => openPresentationModal(href)}>
         <i className="icon-fw"><PresentationIcon /></i>
         <i className="icon-fw"><PresentationIcon /></i>
         { t('Presentation Mode') }
         { t('Presentation Mode') }
       </DropdownItem>
       </DropdownItem>
@@ -185,20 +182,6 @@ const GrowiContextualSubNavigation = (props) => {
     setIsPagePresentationModalShown(true);
     setIsPagePresentationModalShown(true);
   }, []);
   }, []);
 
 
-  const renderAdditionalModals = useCallback(() => {
-    if (currentUser == null) {
-      return <></>;
-    }
-    return (
-      <PagePresentationModal
-        isOpen={isPagePresentationModalShown}
-        onClose={() => setIsPagePresentationModalShown(false)}
-        href="?presentation=1"
-      />
-      // TODO: show template modal by https://redmine.weseek.co.jp/issues/87815
-    );
-  }, [currentUser, isPagePresentationModalShown]);
-
   const ControlComponents = useCallback(() => {
   const ControlComponents = useCallback(() => {
     function onPageEditorModeButtonClicked(viewType) {
     function onPageEditorModeButtonClicked(viewType) {
       mutateEditorMode(viewType);
       mutateEditorMode(viewType);
@@ -241,14 +224,13 @@ const GrowiContextualSubNavigation = (props) => {
             />
             />
           )}
           )}
         </div>
         </div>
-        {renderAdditionalModals()}
       </>
       </>
     );
     );
   }, [
   }, [
     pageId, revisionId, shareLinkId, editorMode, mutateEditorMode, isCompactMode,
     pageId, revisionId, shareLinkId, editorMode, mutateEditorMode, isCompactMode,
     isLinkSharingDisabled, isDeviceSmallerThanMd, isGuestUser, isSharedUser,
     isLinkSharingDisabled, isDeviceSmallerThanMd, isGuestUser, isSharedUser,
     isViewMode, isAbleToShowPageEditorModeManager, isAbleToShowPageManagement,
     isViewMode, isAbleToShowPageEditorModeManager, isAbleToShowPageManagement,
-    duplicateItemClickedHandler, renameItemClickedHandler, deleteItemClickedHandler, path, renderAdditionalModals,
+    duplicateItemClickedHandler, renameItemClickedHandler, deleteItemClickedHandler, path,
     presentationMenuItemClickHandler,
     presentationMenuItemClickHandler,
   ]);
   ]);
 
 

+ 7 - 16
packages/app/src/components/PagePresentationModal.jsx

@@ -1,31 +1,22 @@
 import React from 'react';
 import React from 'react';
-import PropTypes from 'prop-types';
 import {
 import {
   Modal, ModalBody,
   Modal, ModalBody,
 } from 'reactstrap';
 } from 'reactstrap';
 
 
-const PagePresentationModal = (props) => {
+import { usePagePresentationModalStatus, usePagePresentationModalOpened } from '~/stores/ui';
 
 
-  function closeModalHandler() {
-    if (props.onClose === null) {
-      return;
-    }
-    props.onClose();
-  }
+const PagePresentationModal = () => {
+
+  const { data: presentationData, close: closePresentationModal } = usePagePresentationModalStatus();
+  const { data: isOpened } = usePagePresentationModalOpened();
 
 
   return (
   return (
-    <Modal isOpen={props.isOpen} toggle={closeModalHandler} className="grw-presentation-modal" unmountOnClose={false}>
+    <Modal isOpen={isOpened} toggle={closePresentationModal} className="grw-presentation-modal" unmountOnClose={false}>
       <ModalBody className="modal-body">
       <ModalBody className="modal-body">
-        <iframe src={props.href} />
+        <iframe src={presentationData.href} />
       </ModalBody>
       </ModalBody>
     </Modal>
     </Modal>
   );
   );
 };
 };
-PagePresentationModal.propTypes = {
-  isOpen: PropTypes.bool.isRequired,
-  onClose: PropTypes.func,
-  href: PropTypes.string.isRequired,
-};
-
 
 
 export default PagePresentationModal;
 export default PagePresentationModal;

+ 1 - 0
packages/app/src/server/views/layout/layout.html

@@ -107,6 +107,7 @@
 <div id="page-delete-modal"></div>
 <div id="page-delete-modal"></div>
 <div id="page-duplicate-modal"></div>
 <div id="page-duplicate-modal"></div>
 <div id="page-rename-modal"></div>
 <div id="page-rename-modal"></div>
+<div id="page-presentation-modal"></div>
 <div id="page-accessories-modal"></div>
 <div id="page-accessories-modal"></div>
 <div id="descendants-page-list-modal"></div>
 <div id="descendants-page-list-modal"></div>
 
 

+ 42 - 0
packages/app/src/stores/ui.tsx

@@ -425,6 +425,48 @@ export const usePageRenameModalOpened = (): SWRResponse<boolean, Error> => {
   );
   );
 };
 };
 
 
+// PagePresentationModal
+export type IPageForPagePresentationModal = {
+  // pageId: string,
+  // revisionId: string,
+  // path: string
+}
+
+type PresentationModalStatus = {
+  isOpened: boolean,
+  href?: string
+}
+
+type PresentationModalStatusUtils = {
+  open(href: string): Promise<PresentationModalStatus | undefined>
+  close(): Promise<PresentationModalStatus | undefined>
+}
+
+export const usePagePresentationModalStatus = (
+    status?: PresentationModalStatus,
+): SWRResponse<PresentationModalStatus, Error> & PresentationModalStatusUtils => {
+  const initialData: PresentationModalStatus = {
+    isOpened: false, href: '?presentation=1',
+  };
+  const swrResponse = useStaticSWR<PresentationModalStatus, Error>('presentationModalStatus', status, { fallbackData: initialData });
+
+  return {
+    ...swrResponse,
+    open: (href: string) => swrResponse.mutate({ isOpened: true, href }),
+    close: () => swrResponse.mutate({ isOpened: false }),
+  };
+};
+
+export const usePagePresentationModalOpened = (): SWRResponse<boolean, Error> => {
+  const { data } = usePagePresentationModalStatus();
+  return useSWRImmutable(
+    data != null ? ['isPresentationModalOpened', data] : null,
+    () => {
+      return data != null ? data.isOpened : false;
+    },
+  );
+};
+
 
 
 type DescendantsPageListModalStatus = {
 type DescendantsPageListModalStatus = {
   isOpened: boolean,
   isOpened: boolean,