import React, { Suspense, useCallback, useRef } from 'react'; import type { IPagePopulatedToShowRevision } from '@growi/core'; import { getIdForRef, type IPageInfoForOperation } from '@growi/core'; import { pagePathUtils } from '@growi/core/dist/utils'; import { useTranslation } from 'next-i18next'; import dynamic from 'next/dynamic'; import { scroller } from 'react-scroll'; import { useIsGuestUser, useIsReadOnlyUser } from '~/stores/context'; import { useDescendantsPageListModal, useTagEditModal } from '~/stores/modal'; import { useSWRxPageInfo, useSWRxTagsInfo } from '~/stores/page'; import { useIsAbleToShowTagLabel } from '~/stores/ui'; import { ContentLinkButtons } from '../ContentLinkButtons'; import { PageTagsSkeleton } from '../PageTags'; import TableOfContents from '../TableOfContents'; import { PageAccessoriesControl } from './PageAccessoriesControl'; import styles from './PageSideContents.module.scss'; const { isTopPage, isUsersHomepage, isTrashPage } = pagePathUtils; const PageTags = dynamic(() => import('../PageTags').then(mod => mod.PageTags), { ssr: false, loading: PageTagsSkeleton, }); type TagsProps = { pageId: string, revisionId: string, } const Tags = (props: TagsProps): JSX.Element => { const { pageId, revisionId } = props; const { data: tagsInfoData } = useSWRxTagsInfo(pageId, { suspense: true }); const { data: showTagLabel } = useIsAbleToShowTagLabel(); const { data: isGuestUser } = useIsGuestUser(); const { data: isReadOnlyUser } = useIsReadOnlyUser(); const { open: openTagEditModal } = useTagEditModal(); const onClickEditTagsButton = useCallback(() => { if (tagsInfoData == null) { return; } openTagEditModal(tagsInfoData.tags, pageId, revisionId); }, [pageId, revisionId, tagsInfoData, openTagEditModal]); if (!showTagLabel || tagsInfoData == null) { return <>; } const isTagLabelsDisabled = !!isGuestUser || !!isReadOnlyUser; return (
); }; export type PageSideContentsProps = { page: IPagePopulatedToShowRevision, isSharedUser?: boolean, } export const PageSideContents = (props: PageSideContentsProps): JSX.Element => { const { t } = useTranslation(); const { open: openDescendantPageListModal } = useDescendantsPageListModal(); const { page, isSharedUser } = props; const tagsRef = useRef(null); const { data: pageInfo } = useSWRxPageInfo(page._id); const pagePath = page.path; const isTopPagePath = isTopPage(pagePath); const isUsersHomepagePath = isUsersHomepage(pagePath); const isTrash = isTrashPage(pagePath); return ( <> {/* Tags */} { page.revision != null && (
}>
) }
{/* Page list */} {!isSharedUser && (
subject} label={t('page_list')} // Do not display CountBadge if '/trash/*': https://github.com/weseek/growi/pull/7600 count={!isTrash && pageInfo != null ? (pageInfo as IPageInfoForOperation).descendantCount : undefined} offset={1} onClick={() => openDescendantPageListModal(pagePath)} />
)} {/* Comments */} {!isTopPagePath && (
chat} label={t('comments')} count={pageInfo != null ? (pageInfo as IPageInfoForOperation).commentCount : undefined} onClick={() => scroller.scrollTo('comments-container', { smooth: false, offset: -120 })} />
)}
{isUsersHomepagePath && }
); };