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 (