| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- import React, { useCallback } from 'react';
- import PropTypes from 'prop-types';
- import { withUnstatedContainers } from '../UnstatedUtils';
- import EditorContainer from '~/client/services/EditorContainer';
- import {
- EditorMode, useDrawerMode, useEditorMode, useIsDeviceSmallerThanMd, useIsAbleToShowPageManagement, useIsAbleToShowTagLabel,
- useIsAbleToShowPageEditorModeManager, useIsAbleToShowPageAuthors,
- } from '~/stores/ui';
- import {
- useCurrentCreatedAt, useCurrentUpdatedAt, useCurrentPageId, useRevisionId, useCurrentPagePath,
- useCreator, useRevisionAuthor, useIsGuestUser, useIsSharedUser,
- } from '~/stores/context';
- import { useSWRTagsInfo } from '~/stores/page';
- import { SubNavButtons } from './SubNavButtons';
- import PageEditorModeManager from './PageEditorModeManager';
- import { toastSuccess, toastError } from '~/client/util/apiNotification';
- import { apiPost } from '~/client/util/apiv1-client';
- import { IPageHasId } from '~/interfaces/page';
- import { GrowiSubNavigation } from './GrowiSubNavigation';
- const GrowiContextualSubNavigation = (props) => {
- const { data: isDeviceSmallerThanMd } = useIsDeviceSmallerThanMd();
- const { data: isDrawerMode } = useDrawerMode();
- const { data: editorMode, mutate: mutateEditorMode } = useEditorMode();
- const { data: createdAt } = useCurrentCreatedAt();
- const { data: updatedAt } = useCurrentUpdatedAt();
- const { data: pageId } = useCurrentPageId();
- const { data: revisionId } = useRevisionId();
- const { data: path } = useCurrentPagePath();
- const { data: creator } = useCreator();
- const { data: revisionAuthor } = useRevisionAuthor();
- const { data: isGuestUser } = useIsGuestUser();
- const { data: isSharedUser } = useIsSharedUser();
- const { data: isAbleToShowPageManagement } = useIsAbleToShowPageManagement();
- const { data: isAbleToShowTagLabel } = useIsAbleToShowTagLabel();
- const { data: isAbleToShowPageEditorModeManager } = useIsAbleToShowPageEditorModeManager();
- const { data: isAbleToShowPageAuthors } = useIsAbleToShowPageAuthors();
- const { mutate: mutateSWRTagsInfo, data: tagsInfoData } = useSWRTagsInfo(pageId);
- const {
- editorContainer, isCompactMode,
- } = props;
- const isViewMode = editorMode === EditorMode.View;
- const tagsUpdatedHandler = useCallback(async(newTags: string[]) => {
- // It will not be reflected in the DB until the page is refreshed
- if (editorMode === EditorMode.Editor) {
- return editorContainer.setState({ tags: newTags });
- }
- try {
- const { tags } = await apiPost('/tags.update', { pageId, revisionId, tags: newTags }) as { tags };
- // revalidate SWRTagsInfo
- mutateSWRTagsInfo();
- // update editorContainer.state
- editorContainer.setState({ tags });
- toastSuccess('updated tags successfully');
- }
- catch (err) {
- toastError(err, 'fail to update tags');
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [pageId]);
- const ControlComponents = useCallback(() => {
- function onPageEditorModeButtonClicked(viewType) {
- mutateEditorMode(viewType);
- }
- return (
- <>
- <div className="h-50 d-flex flex-column align-items-end justify-content-center">
- { isViewMode && (
- <SubNavButtons
- isCompactMode={isCompactMode}
- pageId={pageId}
- disableSeenUserInfoPopover={isSharedUser}
- showPageControlDropdown={isAbleToShowPageManagement}
- />
- ) }
- </div>
- <div className="h-50 d-flex flex-column align-items-end justify-content-center">
- {isAbleToShowPageEditorModeManager && (
- <PageEditorModeManager
- onPageEditorModeButtonClicked={onPageEditorModeButtonClicked}
- isBtnDisabled={isGuestUser}
- editorMode={editorMode}
- isDeviceSmallerThanMd={isDeviceSmallerThanMd}
- />
- )}
- </div>
- </>
- );
- }, [
- pageId,
- editorMode, mutateEditorMode,
- isCompactMode, isDeviceSmallerThanMd, isGuestUser, isSharedUser,
- isViewMode, isAbleToShowPageEditorModeManager, isAbleToShowPageManagement,
- ]);
- if (path == null) {
- return <></>;
- }
- const currentPage: Partial<IPageHasId> = {
- _id: pageId ?? undefined,
- path,
- revision: revisionId ?? undefined,
- creator: creator ?? undefined,
- lastUpdateUser: revisionAuthor,
- createdAt: createdAt ?? undefined,
- updatedAt: updatedAt ?? undefined,
- };
- return (
- <GrowiSubNavigation
- page={currentPage}
- showDrawerToggler={isDrawerMode}
- showTagLabel={isAbleToShowTagLabel}
- showPageAuthors={isAbleToShowPageAuthors}
- tags={tagsInfoData?.tags || []}
- tagsUpdatedHandler={tagsUpdatedHandler}
- controls={ControlComponents}
- />
- );
- };
- /**
- * Wrapper component for using unstated
- */
- const GrowiContextualSubNavigationWrapper = withUnstatedContainers(GrowiContextualSubNavigation, [EditorContainer]);
- GrowiContextualSubNavigation.propTypes = {
- editorContainer: PropTypes.instanceOf(EditorContainer).isRequired,
- isCompactMode: PropTypes.bool,
- };
- export default GrowiContextualSubNavigationWrapper;
|