| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- import React, { useMemo } from 'react';
- import { pagePathUtils } from '@growi/core';
- import { useTranslation } from 'react-i18next';
- import { TabContent, TabPane } from 'reactstrap';
- import { smoothScrollIntoView } from '~/client/util/smooth-scroll';
- import {
- useCurrentPagePath, useIsSharedUser, useIsEditable, useCurrentPageId, useIsUserPage, usePageUser,
- } from '~/stores/context';
- import { useDescendantsPageListModal } from '~/stores/modal';
- import { useSWRxPageByPath } from '~/stores/page';
- import { EditorMode, useEditorMode } from '~/stores/ui';
- import CountBadge from '../Common/CountBadge';
- import ContentLinkButtons from '../ContentLinkButtons';
- import HashChanged from '../EventListeneres/HashChanged';
- import PageListIcon from '../Icons/PageListIcon';
- import Page from '../Page';
- import Editor from '../PageEditor';
- import EditorNavbarBottom from '../PageEditor/EditorNavbarBottom';
- import PageEditorByHackmd from '../PageEditorByHackmd';
- import TableOfContents from '../TableOfContents';
- import UserInfo from '../User/UserInfo';
- const WIKI_HEADER_LINK = 120;
- const { isTopPage } = pagePathUtils;
- const DisplaySwitcher = (): JSX.Element => {
- const { t } = useTranslation();
- // get element for smoothScroll
- const getCommentListDom = useMemo(() => { return document.getElementById('page-comments-list') }, []);
- const { data: currentPageId } = useCurrentPageId();
- const { data: currentPath } = useCurrentPagePath();
- const { data: isSharedUser } = useIsSharedUser();
- const { data: isUserPage } = useIsUserPage();
- const { data: isEditable } = useIsEditable();
- const { data: pageUser } = usePageUser();
- const { data: currentPage } = useSWRxPageByPath(currentPath);
- const { data: editorMode } = useEditorMode();
- const { open: openDescendantPageListModal } = useDescendantsPageListModal();
- const isPageExist = currentPageId != null;
- const isViewMode = editorMode === EditorMode.View;
- const isTopPagePath = isTopPage(currentPath ?? '');
- return (
- <>
- <TabContent activeTab={editorMode}>
- <TabPane tabId={EditorMode.View}>
- <div className="d-flex flex-column flex-lg-row-reverse">
- { isPageExist && (
- <div className="grw-side-contents-container">
- <div className="grw-side-contents-sticky-container">
- {/* Page list */}
- <div className="grw-page-accessories-control">
- { currentPath != null && !isSharedUser && (
- <button
- type="button"
- className="btn btn-block btn-outline-secondary grw-btn-page-accessories rounded-pill d-flex justify-content-between align-items-center"
- onClick={() => openDescendantPageListModal(currentPath)}
- >
- <div className="grw-page-accessories-control-icon">
- <PageListIcon />
- </div>
- {t('page_list')}
- {currentPage?.descendantCount != null && <CountBadge count={currentPage.descendantCount + 1} />}
- </button>
- ) }
- </div>
- {/* Comments */}
- { getCommentListDom != null && !isTopPagePath && (
- <div className="grw-page-accessories-control mt-2">
- <button
- type="button"
- className="btn btn-block btn-outline-secondary grw-btn-page-accessories rounded-pill d-flex justify-content-between align-items-center"
- onClick={() => smoothScrollIntoView(getCommentListDom, WIKI_HEADER_LINK)}
- >
- <i className="icon-fw icon-bubbles grw-page-accessories-control-icon"></i>
- <span>Comments</span>
- {currentPage?.commentCount != null && <CountBadge count={currentPage.commentCount} />}
- </button>
- </div>
- ) }
- <div className="d-none d-lg-block">
- <div id="revision-toc" className="revision-toc">
- <TableOfContents />
- </div>
- <ContentLinkButtons />
- </div>
- </div>
- </div>
- ) }
- <div className="flex-grow-1 flex-basis-0 mw-0">
- { isUserPage && <UserInfo pageUser={pageUser} />}
- <Page />
- </div>
- </div>
- </TabPane>
- { isEditable && (
- <TabPane tabId={EditorMode.Editor}>
- <div data-testid="page-editor" id="page-editor">
- <Editor />
- </div>
- </TabPane>
- ) }
- { isEditable && (
- <TabPane tabId={EditorMode.HackMD}>
- <div id="page-editor-with-hackmd">
- <PageEditorByHackmd />
- </div>
- </TabPane>
- ) }
- </TabContent>
- { isEditable && !isViewMode && <EditorNavbarBottom /> }
- { isEditable && <HashChanged></HashChanged> }
- </>
- );
- };
- export default DisplaySwitcher;
|