Explorar el Código

Merge pull request #6524 from weseek/imprv/impl-page-list-page-footer

imprv: PageList page footer conditional
Yuki Takei hace 3 años
padre
commit
198e9d9596

+ 1 - 0
packages/app/src/components/Navbar/DrawerToggler.tsx

@@ -1,4 +1,5 @@
 import React, { FC } from 'react';
 import React, { FC } from 'react';
+
 import { useDrawerOpened } from '~/stores/ui';
 import { useDrawerOpened } from '~/stores/ui';
 
 
 type Props = {
 type Props = {

+ 10 - 16
packages/app/src/components/Navbar/GrowiNavbar.tsx

@@ -23,14 +23,15 @@ import PersonalDropdown from './PersonalDropdown';
 
 
 import styles from './GrowiNavbar.module.scss';
 import styles from './GrowiNavbar.module.scss';
 
 
+const InAppNotificationDropdown = dynamic(() => import('../InAppNotification/InAppNotificationDropdown')
+  .then(mod => mod.InAppNotificationDropdown), { ssr: false });
+const AppearanceModeDropdown = dynamic(() => import('./AppearanceModeDropdown').then(mod => mod.AppearanceModeDropdown), { ssr: false });
+const GlobalSearch = dynamic<GlobalSearchProps>(() => import('./GlobalSearch').then(mod => mod.GlobalSearch), { ssr: false });
+
 
 
 const NavbarRight = memo((): JSX.Element => {
 const NavbarRight = memo((): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
 
 
-  const InAppNotificationDropdown = dynamic(() => import('../InAppNotification/InAppNotificationDropdown')
-    .then(mod => mod.InAppNotificationDropdown), { ssr: false });
-  const AppearanceModeDropdown = dynamic(() => import('./AppearanceModeDropdown').then(mod => mod.AppearanceModeDropdown), { ssr: false });
-
   const { data: currentPagePath } = useCurrentPagePath();
   const { data: currentPagePath } = useCurrentPagePath();
   const { data: isGuestUser } = useIsGuestUser();
   const { data: isGuestUser } = useIsGuestUser();
 
 
@@ -71,7 +72,7 @@ const NavbarRight = memo((): JSX.Element => {
         </li>
         </li>
       </>
       </>
     );
     );
-  }, [InAppNotificationDropdown, t, AppearanceModeDropdown, isAuthenticated, openCreateModal, currentPagePath]);
+  }, [isAuthenticated, openCreateModal, currentPagePath]);
 
 
   const notAuthenticatedNavItem = useMemo(() => {
   const notAuthenticatedNavItem = useMemo(() => {
     return (
     return (
@@ -79,11 +80,10 @@ const NavbarRight = memo((): JSX.Element => {
         <li className="grw-apperance-mode-dropdown nav-item dropdown">
         <li className="grw-apperance-mode-dropdown nav-item dropdown">
           <AppearanceModeDropdown isAuthenticated={isAuthenticated} />
           <AppearanceModeDropdown isAuthenticated={isAuthenticated} />
         </li>
         </li>
-
         <li id="login-user" className="nav-item"><a className="nav-link" href="/login">Login</a></li>;
         <li id="login-user" className="nav-item"><a className="nav-link" href="/login">Login</a></li>;
       </>
       </>
     );
     );
-  }, [AppearanceModeDropdown, isAuthenticated]);
+  }, [isAuthenticated]);
 
 
   return (
   return (
     <>
     <>
@@ -123,8 +123,6 @@ Confidential.displayName = 'Confidential';
 
 
 export const GrowiNavbar = (): JSX.Element => {
 export const GrowiNavbar = (): JSX.Element => {
 
 
-  const GlobalSearch = dynamic<GlobalSearchProps>(() => import('./GlobalSearch').then(mod => mod.GlobalSearch), { ssr: false });
-
   const { data: appTitle } = useAppTitle();
   const { data: appTitle } = useAppTitle();
   const { data: confidential } = useConfidential();
   const { data: confidential } = useConfidential();
   const { data: isSearchServiceConfigured } = useIsSearchServiceConfigured();
   const { data: isSearchServiceConfigured } = useIsSearchServiceConfigured();
@@ -146,18 +144,14 @@ export const GrowiNavbar = (): JSX.Element => {
         {appTitle}
         {appTitle}
       </div>
       </div>
 
 
-
       {/* Navbar Right  */}
       {/* Navbar Right  */}
       <ul className="navbar-nav ml-auto">
       <ul className="navbar-nav ml-auto">
         <NavbarRight />
         <NavbarRight />
         <Confidential confidential={confidential} />
         <Confidential confidential={confidential} />
       </ul>
       </ul>
-
-      { isSearchServiceConfigured && !isDeviceSmallerThanMd && !isSearchPage && (
-        <div className="grw-global-search-container position-absolute">
-          <GlobalSearch />
-        </div>
-      ) }
+      <div className="grw-global-search-container position-absolute">
+        { isSearchServiceConfigured && !isDeviceSmallerThanMd && !isSearchPage && (<GlobalSearch />) }
+      </div>
     </nav>
     </nav>
   );
   );
 
 

+ 27 - 32
packages/app/src/components/Navbar/GrowiSubNavigation.tsx

@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useEffect, useState } from 'react';
 
 
 import dynamic from 'next/dynamic';
 import dynamic from 'next/dynamic';
 
 
@@ -8,47 +8,43 @@ import {
   EditorMode, useEditorMode,
   EditorMode, useEditorMode,
 } from '~/stores/ui';
 } from '~/stores/ui';
 
 
+import { TagLabelsSkelton } from '../Page/TagLabels';
 import PagePathNav from '../PagePathNav';
 import PagePathNav from '../PagePathNav';
 import { Skelton } from '../Skelton';
 import { Skelton } from '../Skelton';
 
 
 import DrawerToggler from './DrawerToggler';
 import DrawerToggler from './DrawerToggler';
 
 
-
-import TagLabelsStyles from '../Page/TagLabels.module.scss';
 import AuthorInfoStyles from './AuthorInfo.module.scss';
 import AuthorInfoStyles from './AuthorInfo.module.scss';
 import styles from './GrowiSubNavigation.module.scss';
 import styles from './GrowiSubNavigation.module.scss';
 
 
+const TagLabels = dynamic(() => import('../Page/TagLabels').then(mod => mod.TagLabels), {
+  ssr: false,
+  loading: () => <TagLabelsSkelton />,
+});
+const AuthorInfo = dynamic(() => import('./AuthorInfo'), {
+  ssr: false,
+  loading: () => <Skelton additionalClass={`${AuthorInfoStyles['grw-author-info-skelton']} py-1`} />,
+});
+
 
 
 export type GrowiSubNavigationProps = {
 export type GrowiSubNavigationProps = {
   page: Partial<IPageHasId>,
   page: Partial<IPageHasId>,
-
   showDrawerToggler?: boolean,
   showDrawerToggler?: boolean,
   showTagLabel?: boolean,
   showTagLabel?: boolean,
   showPageAuthors?: boolean,
   showPageAuthors?: boolean,
-
   isGuestUser?: boolean,
   isGuestUser?: boolean,
   isDrawerMode?: boolean,
   isDrawerMode?: boolean,
   isCompactMode?: boolean,
   isCompactMode?: boolean,
-
   tags?: string[],
   tags?: string[],
   tagsUpdatedHandler?: (newTags: string[]) => Promise<void> | void,
   tagsUpdatedHandler?: (newTags: string[]) => Promise<void> | void,
-
-  controls?: React.FunctionComponent,
+  controls: React.FunctionComponent,
   additionalClasses?: string[],
   additionalClasses?: string[],
 }
 }
 
 
 export const GrowiSubNavigation = (props: GrowiSubNavigationProps): JSX.Element => {
 export const GrowiSubNavigation = (props: GrowiSubNavigationProps): JSX.Element => {
 
 
-  const TagLabels = dynamic(() => import('../Page/TagLabels'), {
-    ssr: false,
-    loading: () => <Skelton additionalClass={`${TagLabelsStyles['grw-tag-labels-skelton']} py-1`} />,
-  });
-  const AuthorInfo = dynamic(() => import('./AuthorInfo'), {
-    ssr: false,
-    loading: () => <Skelton additionalClass={`${AuthorInfoStyles['grw-author-info-skelton']} py-1`} />,
-  });
-
   const { data: editorMode } = useEditorMode();
   const { data: editorMode } = useEditorMode();
+  const [isControls, setControls] = useState(false);
 
 
   const {
   const {
     page,
     page,
@@ -59,35 +55,37 @@ export const GrowiSubNavigation = (props: GrowiSubNavigationProps): JSX.Element
     additionalClasses = [],
     additionalClasses = [],
   } = props;
   } = props;
 
 
+  const isViewMode = editorMode === EditorMode.View;
+  const isEditorMode = !isViewMode;
+  const compactModeClasses = isCompactMode ? 'grw-subnav-compact d-print-none' : '';
+
   const {
   const {
     _id: pageId, path, creator, lastUpdateUser,
     _id: pageId, path, creator, lastUpdateUser,
     createdAt, updatedAt,
     createdAt, updatedAt,
   } = page;
   } = page;
 
 
-  const isViewMode = editorMode === EditorMode.View;
-  const isEditorMode = !isViewMode;
+  useEffect(() => {
+    if (Controls != null) {
+      setControls(true);
+    }
+  }, [Controls]);
 
 
   if (path == null) {
   if (path == null) {
     return <></>;
     return <></>;
   }
   }
 
 
   return (
   return (
-    <div className={
-      `grw-subnav ${styles['grw-subnav']} d-flex align-items-center justify-content-between`
-      + ` ${additionalClasses.join(' ')}`
-      + ` ${isCompactMode ? 'grw-subnav-compact d-print-none' : ''}`}
-    >
-
+    <div className={`grw-subnav ${styles['grw-subnav']} d-flex align-items-center justify-content-between ${additionalClasses.join(' ')}
+    ${compactModeClasses}`} >
       {/* Left side */}
       {/* Left side */}
       <div className="d-flex grw-subnav-left-side">
       <div className="d-flex grw-subnav-left-side">
-        { showDrawerToggler && isDrawerMode && (
+        { (showDrawerToggler && isDrawerMode) && (
           <div className={`d-none d-md-flex align-items-center ${isEditorMode ? 'mr-2 pr-2' : 'border-right mr-4 pr-4'}`}>
           <div className={`d-none d-md-flex align-items-center ${isEditorMode ? 'mr-2 pr-2' : 'border-right mr-4 pr-4'}`}>
             <DrawerToggler />
             <DrawerToggler />
           </div>
           </div>
         ) }
         ) }
-
         <div className="grw-path-nav-container">
         <div className="grw-path-nav-container">
-          { showTagLabel && !isCompactMode && (
+          { (showTagLabel && !isCompactMode) && (
             <div className="grw-taglabels-container">
             <div className="grw-taglabels-container">
               <TagLabels tags={tags} isGuestUser={isGuestUser ?? false} tagsUpdateInvoked={tagsUpdatedHandler} />
               <TagLabels tags={tags} isGuestUser={isGuestUser ?? false} tagsUpdateInvoked={tagsUpdatedHandler} />
             </div>
             </div>
@@ -95,12 +93,9 @@ export const GrowiSubNavigation = (props: GrowiSubNavigationProps): JSX.Element
           <PagePathNav pageId={pageId} pagePath={path} isSingleLineMode={isEditorMode} isCompactMode={isCompactMode} />
           <PagePathNav pageId={pageId} pagePath={path} isSingleLineMode={isEditorMode} isCompactMode={isCompactMode} />
         </div>
         </div>
       </div>
       </div>
-
       {/* Right side */}
       {/* Right side */}
       <div className="d-flex">
       <div className="d-flex">
-
-        { Controls && <Controls></Controls> }
-
+        { isControls && <Controls /> }
         {/* Page Authors */}
         {/* Page Authors */}
         { (showPageAuthors && !isCompactMode) && (
         { (showPageAuthors && !isCompactMode) && (
           <ul className={`${AuthorInfoStyles['grw-author-info']} text-nowrap border-left d-none d-lg-block d-edit-none py-2 pl-4 mb-0 ml-3`}>
           <ul className={`${AuthorInfoStyles['grw-author-info']} text-nowrap border-left d-none d-lg-block d-edit-none py-2 pl-4 mb-0 ml-3`}>

+ 1 - 3
packages/app/src/components/NotFoundPage.tsx

@@ -1,13 +1,12 @@
 import React, { useMemo } from 'react';
 import React, { useMemo } from 'react';
 
 
 import { useTranslation } from 'next-i18next';
 import { useTranslation } from 'next-i18next';
-import dynamic from 'next/dynamic';
 
 
+import CustomNavAndContents from './CustomNavigation/CustomNavAndContents';
 import { DescendantsPageListForCurrentPath } from './DescendantsPageList';
 import { DescendantsPageListForCurrentPath } from './DescendantsPageList';
 import PageListIcon from './Icons/PageListIcon';
 import PageListIcon from './Icons/PageListIcon';
 import TimeLineIcon from './Icons/TimeLineIcon';
 import TimeLineIcon from './Icons/TimeLineIcon';
 import { PageTimeline } from './PageTimeline';
 import { PageTimeline } from './PageTimeline';
-import CustomNavAndContents from './CustomNavigation/CustomNavAndContents';
 
 
 const NotFoundPage = (): JSX.Element => {
 const NotFoundPage = (): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
@@ -29,7 +28,6 @@ const NotFoundPage = (): JSX.Element => {
     };
     };
   }, [t]);
   }, [t]);
 
 
-
   return (
   return (
     <div className="d-edit-none">
     <div className="d-edit-none">
       <CustomNavAndContents navTabMapping={navTabMapping} tabContentClasses={['py-4']} />
       <CustomNavAndContents navTabMapping={navTabMapping} tabContentClasses={['py-4']} />

+ 15 - 16
packages/app/src/components/Page/TagLabels.tsx

@@ -1,5 +1,7 @@
 import React, { FC, useState } from 'react';
 import React, { FC, useState } from 'react';
 
 
+import { Skelton } from '../Skelton';
+
 import RenderTagLabels from './RenderTagLabels';
 import RenderTagLabels from './RenderTagLabels';
 import TagEditModal from './TagEditModal';
 import TagEditModal from './TagEditModal';
 
 
@@ -11,8 +13,11 @@ type Props = {
   tagsUpdateInvoked?: (tags: string[]) => Promise<void> | void,
   tagsUpdateInvoked?: (tags: string[]) => Promise<void> | void,
 }
 }
 
 
+export const TagLabelsSkelton = (): JSX.Element => {
+  return <Skelton additionalClass={`${styles['grw-tag-labels-skelton']} py-1`} />;
+};
 
 
-const TagLabels:FC<Props> = (props: Props) => {
+export const TagLabels:FC<Props> = (props: Props) => {
   const { tags, isGuestUser, tagsUpdateInvoked } = props;
   const { tags, isGuestUser, tagsUpdateInvoked } = props;
 
 
   const [isTagEditModalShown, setIsTagEditModalShown] = useState(false);
   const [isTagEditModalShown, setIsTagEditModalShown] = useState(false);
@@ -25,24 +30,20 @@ const TagLabels:FC<Props> = (props: Props) => {
     setIsTagEditModalShown(false);
     setIsTagEditModalShown(false);
   };
   };
 
 
+  if (tags == null) {
+    return <TagLabelsSkelton />;
+  }
+
   return (
   return (
     <>
     <>
       <div className={`${styles['grw-tag-labels']} grw-tag-labels d-flex align-items-center`}>
       <div className={`${styles['grw-tag-labels']} grw-tag-labels d-flex align-items-center`}>
         <i className="tag-icon icon-tag mr-2"></i>
         <i className="tag-icon icon-tag mr-2"></i>
-        { tags == null
-          ? (
-            <span className="grw-tag-label badge badge-secondary">―</span>
-          )
-          : (
-            <RenderTagLabels
-              tags={tags}
-              openEditorModal={openEditorModal}
-              isGuestUser={isGuestUser}
-            />
-          )
-        }
+        <RenderTagLabels
+          tags={tags}
+          openEditorModal={openEditorModal}
+          isGuestUser={isGuestUser}
+        />
       </div>
       </div>
-
       <TagEditModal
       <TagEditModal
         tags={tags}
         tags={tags}
         isOpen={isTagEditModalShown}
         isOpen={isTagEditModalShown}
@@ -52,5 +53,3 @@ const TagLabels:FC<Props> = (props: Props) => {
     </>
     </>
   );
   );
 };
 };
-
-export default TagLabels;

+ 1 - 0
packages/app/src/components/PagePathHierarchicalLink.tsx

@@ -21,6 +21,7 @@ const PagePathHierarchicalLink = memo((props: PagePathHierarchicalLinkProps): JS
   const {
   const {
     linkedPagePath, linkedPagePathByHtml, basePath, isInTrash,
     linkedPagePath, linkedPagePathByHtml, basePath, isInTrash,
   } = props;
   } = props;
+
   // render root element
   // render root element
   if (linkedPagePath.isRoot) {
   if (linkedPagePath.isRoot) {
     if (basePath != null) {
     if (basePath != null) {

+ 4 - 5
packages/app/src/components/PagePathNav.tsx

@@ -7,7 +7,8 @@ import { useIsNotFound } from '~/stores/context';
 
 
 import LinkedPagePath from '../models/linked-page-path';
 import LinkedPagePath from '../models/linked-page-path';
 
 
-import PagePathHierarchicalLink from './PagePathHierarchicalLink';
+const PagePathHierarchicalLink = dynamic(() => import('./PagePathHierarchicalLink'), { ssr: false });
+const CopyDropdown = dynamic(() => import('./Page/CopyDropdown'), { ssr: false });
 
 
 
 
 type Props = {
 type Props = {
@@ -21,15 +22,13 @@ const PagePathNav: FC<Props> = (props: Props) => {
   const {
   const {
     pageId, pagePath, isSingleLineMode, isCompactMode,
     pageId, pagePath, isSingleLineMode, isCompactMode,
   } = props;
   } = props;
-  const dPagePath = new DevidedPagePath(pagePath, false, true);
 
 
   const { data: isNotFound } = useIsNotFound();
   const { data: isNotFound } = useIsNotFound();
 
 
-  const CopyDropdown = dynamic(() => import('./Page/CopyDropdown'), { ssr: false });
+  const dPagePath = new DevidedPagePath(pagePath, false, true);
 
 
   let formerLink;
   let formerLink;
   let latterLink;
   let latterLink;
-
   // one line
   // one line
   if (dPagePath.isRoot || dPagePath.isFormerRoot || isSingleLineMode) {
   if (dPagePath.isRoot || dPagePath.isFormerRoot || isSingleLineMode) {
     const linkedPagePath = new LinkedPagePath(pagePath);
     const linkedPagePath = new LinkedPagePath(pagePath);
@@ -48,7 +47,7 @@ const PagePathNav: FC<Props> = (props: Props) => {
 
 
   return (
   return (
     <div className="grw-page-path-nav">
     <div className="grw-page-path-nav">
-      {formerLink}
+      { formerLink }
       <span className="d-flex align-items-center">
       <span className="d-flex align-items-center">
         <h1 className="m-0">{latterLink}</h1>
         <h1 className="m-0">{latterLink}</h1>
         { pageId != null && !isNotFound && (
         { pageId != null && !isNotFound && (

+ 2 - 3
packages/app/src/components/SearchPage/SearchResultContent.tsx

@@ -9,7 +9,7 @@ import { DropdownItem } from 'reactstrap';
 import { exportAsMarkdown } from '~/client/services/page-operation';
 import { exportAsMarkdown } from '~/client/services/page-operation';
 import { toastSuccess } from '~/client/util/apiNotification';
 import { toastSuccess } from '~/client/util/apiNotification';
 import { smoothScrollIntoView } from '~/client/util/smooth-scroll';
 import { smoothScrollIntoView } from '~/client/util/smooth-scroll';
-import { IPageToDeleteWithMeta, IPageToRenameWithMeta, IPageWithMeta } from '~/interfaces/page';
+import { IPageToDeleteWithMeta, IPageToRenameWithMeta } from '~/interfaces/page';
 import { IPageWithSearchMeta } from '~/interfaces/search';
 import { IPageWithSearchMeta } from '~/interfaces/search';
 import { OnDuplicatedFunction, OnRenamedFunction, OnDeletedFunction } from '~/interfaces/ui';
 import { OnDuplicatedFunction, OnRenamedFunction, OnDeletedFunction } from '~/interfaces/ui';
 import {
 import {
@@ -176,7 +176,6 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
       ? page.revision
       ? page.revision
       : page.revision._id;
       : page.revision._id;
 
 
-
     return (
     return (
       <div className="d-flex flex-column align-items-end justify-content-center py-md-2">
       <div className="d-flex flex-column align-items-end justify-content-center py-md-2">
         <SubNavButtons
         <SubNavButtons
@@ -193,7 +192,7 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
         />
         />
       </div>
       </div>
     );
     );
-  }, [page, showPageControlDropdown, forceHideMenuItems, duplicateItemClickedHandler, renameItemClickedHandler, deleteItemClickedHandler]);
+  }, [page, SubNavButtons, showPageControlDropdown, forceHideMenuItems, duplicateItemClickedHandler, renameItemClickedHandler, deleteItemClickedHandler]);
 
 
   // return if page or growiRenderer is null
   // return if page or growiRenderer is null
   if (page == null || rendererOptions == null) return <></>;
   if (page == null || rendererOptions == null) return <></>;

+ 12 - 10
packages/app/src/pages/[[...path]].page.tsx

@@ -18,7 +18,6 @@ import { useRouter } from 'next/router';
 import superjson from 'superjson';
 import superjson from 'superjson';
 
 
 import { Comments } from '~/components/Comments';
 import { Comments } from '~/components/Comments';
-import { RecentlyCreatedIcon } from '~/components/Icons/RecentlyCreatedIcon';
 import { PageAlerts } from '~/components/PageAlert/PageAlerts';
 import { PageAlerts } from '~/components/PageAlert/PageAlerts';
 // import { useTranslation } from '~/i18n';
 // import { useTranslation } from '~/i18n';
 import { PageContentFooter } from '~/components/PageContentFooter';
 import { PageContentFooter } from '~/components/PageContentFooter';
@@ -82,11 +81,10 @@ const UsersHomePageFooter = dynamic<UsersHomePageFooterProps>(() => import('../c
 const logger = loggerFactory('growi:pages:all');
 const logger = loggerFactory('growi:pages:all');
 
 
 const {
 const {
-  isPermalink: _isPermalink, isUsersHomePage, isTrashPage: _isTrashPage, isUserPage, isCreatablePage,
+  isPermalink: _isPermalink, isUsersHomePage, isTrashPage: _isTrashPage, isUserPage, isCreatablePage, isTopPage,
 } = pagePathUtils;
 } = pagePathUtils;
 const { removeHeadingSlash } = pathUtils;
 const { removeHeadingSlash } = pathUtils;
 
 
-
 type IPageToShowRevisionWithMeta = IDataWithMeta<IPagePopulatedToShowRevision & PageDocument, IPageInfoForEntity>;
 type IPageToShowRevisionWithMeta = IDataWithMeta<IPagePopulatedToShowRevision & PageDocument, IPageInfoForEntity>;
 type IPageToShowRevisionWithMetaSerialized = IDataWithMeta<string, string>;
 type IPageToShowRevisionWithMetaSerialized = IDataWithMeta<string, string>;
 
 
@@ -281,6 +279,8 @@ const GrowiPage: NextPage<Props> = (props: Props) => {
   //   classNames.push('not-found-page');
   //   classNames.push('not-found-page');
   // }
   // }
 
 
+  const isTopPagePath = isTopPage(pageWithMeta?.data.path ?? '');
+
   return (
   return (
     <>
     <>
       <Head>
       <Head>
@@ -328,13 +328,15 @@ const GrowiPage: NextPage<Props> = (props: Props) => {
               </div>
               </div>
             </div>
             </div>
           </div>
           </div>
-          <footer className="footer d-edit-none">
-            { !props.isIdenticalPathPage && (<Comments pageId={pageId} />) }
-            { (pageWithMeta != null && isUsersHomePage(pageWithMeta.data.path)) && (
-              <UsersHomePageFooter creatorId={pageWithMeta.data.creator._id}/>
-            ) }
-            <PageContentFooter />
-          </footer>
+          { !props.isIdenticalPathPage && !props.isNotFound && (
+            <footer className="footer d-edit-none">
+              { !isTopPagePath && (<Comments pageId={pageId} />) }
+              { (pageWithMeta != null && isUsersHomePage(pageWithMeta.data.path)) && (
+                <UsersHomePageFooter creatorId={pageWithMeta.data.creator._id}/>
+              ) }
+              <PageContentFooter />
+            </footer>
+          )}
 
 
           <UnsavedAlertDialog />
           <UnsavedAlertDialog />
           <DescendantsPageListModal />
           <DescendantsPageListModal />