import React, { Suspense, useCallback, useRef, type JSX, } from 'react'; import type { IPagePopulatedToShowRevision } from '@growi/core'; import { isIPageInfoForOperation } from '@growi/core/dist/interfaces'; import { pagePathUtils } from '@growi/core/dist/utils'; import { useAtomValue } from 'jotai'; import { useTranslation } from 'next-i18next'; import dynamic from 'next/dynamic'; import { scroller } from 'react-scroll'; import { useIsGuestUser, useIsReadOnlyUser } from '~/states/context'; import { showPageSideAuthorsAtom } from '~/states/server-configurations'; import { useDescendantsPageListModalActions } from '~/states/ui/modal/descendants-page-list'; import { useTagEditModalActions } from '~/states/ui/modal/tag-edit'; import { useIsAbleToShowTagLabel } from '~/states/ui/page-abilities'; import { useSWRxPageInfo, useSWRxTagsInfo } from '~/stores/page'; import { ContentLinkButtons } from '../ContentLinkButtons'; import { PageTagsSkeleton } from '../PageTags'; import TableOfContents from '../TableOfContents'; import { PageAccessoriesControl } from './PageAccessoriesControl'; const { isTopPage, isUsersHomepage, isTrashPage } = pagePathUtils; const PageTags = dynamic(() => import('../PageTags').then(mod => mod.PageTags), { ssr: false, loading: PageTagsSkeleton, }); const AuthorInfo = dynamic(() => import('~/client/components/AuthorInfo').then(mod => mod.AuthorInfo), { ssr: false }); type TagsProps = { pageId: string, revisionId: string, } const Tags = (props: TagsProps): JSX.Element => { const { pageId, revisionId } = props; const { data: tagsInfoData } = useSWRxTagsInfo(pageId, { suspense: true }); const showTagLabel = useIsAbleToShowTagLabel(); const isGuestUser = useIsGuestUser(); const isReadOnlyUser = useIsReadOnlyUser(); const { open: openTagEditModal } = useTagEditModalActions(); 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 (