import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; import { withUnstatedContainers } from '../UnstatedUtils'; import AppContainer from '~/client/services/AppContainer'; import PageContainer from '~/client/services/PageContainer'; import EditorContainer from '~/client/services/EditorContainer'; import { EditorMode, useDrawerMode, useEditorMode, useIsDeviceSmallerThanMd, } from '~/stores/ui'; import { useCurrentCreatedAt, useCurrentUpdatedAt } from '~/stores/context'; import TagLabels from '../Page/TagLabels'; import SubNavButtons from './SubNavButtons'; import PageEditorModeManager from './PageEditorModeManager'; import AuthorInfo from './AuthorInfo'; import DrawerToggler from './DrawerToggler'; import PagePathNav from '../PagePathNav'; import { toastSuccess, toastError } from '~/client/util/apiNotification'; import { apiPost } from '~/client/util/apiv1-client'; const GrowiSubNavigation = (props) => { const { data: isDeviceSmallerThanMd } = useIsDeviceSmallerThanMd(); const { data: isDrawerMode } = useDrawerMode(); const { data: editorMode, mutate: mutateEditorMode } = useEditorMode(); const { data: createdAt } = useCurrentCreatedAt(); const { data: updatedAt } = useCurrentUpdatedAt(); const { appContainer, pageContainer, editorContainer, isCompactMode, } = props; const { pageId, revisionId, path, isDeletable, isAbleToDeleteCompletely, creator, revisionAuthor, isPageExist, isTrashPage, tags, } = pageContainer.state; const { isGuestUser, isSharedUser } = appContainer; const isEditorMode = editorMode !== EditorMode.View; // Tags cannot be edited while the new page and editorMode is view const isTagLabelHidden = (editorMode !== EditorMode.Editor && !isPageExist); const isAbleToShowPageManagement = isPageExist && !isTrashPage && !isSharedUser && !isEditorMode; function onPageEditorModeButtonClicked(viewType) { mutateEditorMode(viewType); } const tagsUpdatedHandler = useCallback(async(newTags) => { // It will not be reflected in the DB until the page is refreshed if (editorMode === 'edit') { return editorContainer.setState({ tags: newTags }); } try { const { tags } = await apiPost('/tags.update', { pageId, tags: newTags }); // update pageContainer.state pageContainer.setState({ tags }); // 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]); return (