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 ( <>
{ isViewMode && ( ) }
{isAbleToShowPageEditorModeManager && ( )}
); }, [ pageId, editorMode, mutateEditorMode, isCompactMode, isDeviceSmallerThanMd, isGuestUser, isSharedUser, isViewMode, isAbleToShowPageEditorModeManager, isAbleToShowPageManagement, ]); if (path == null) { return <>; } const currentPage: Partial = { _id: pageId ?? undefined, path, revision: revisionId ?? undefined, creator: creator ?? undefined, lastUpdateUser: revisionAuthor, createdAt: createdAt ?? undefined, updatedAt: updatedAt ?? undefined, }; return ( ); }; /** * Wrapper component for using unstated */ const GrowiContextualSubNavigationWrapper = withUnstatedContainers(GrowiContextualSubNavigation, [EditorContainer]); GrowiContextualSubNavigation.propTypes = { editorContainer: PropTypes.instanceOf(EditorContainer).isRequired, isCompactMode: PropTypes.bool, }; export default GrowiContextualSubNavigationWrapper;