import type { IPagePopulatedToShowRevision } from '@growi/core'; import { useSlidesByFrontmatter } from '@growi/presentation/dist/services'; import dynamic from 'next/dynamic'; import { type JSX, useMemo } from 'react'; import { PagePathNavTitle } from '~/components/Common/PagePathNavTitle'; import type { RendererConfig } from '~/interfaces/services/renderer'; import type { IShareLinkHasId } from '~/interfaces/share-link'; import { useShouldExpandContent } from '~/services/layout/use-should-expand-content'; import { generateSSRViewOptions } from '~/services/renderer/renderer'; import { useIsNotFound } from '~/stores/page'; import { useViewOptions } from '~/stores/renderer'; import loggerFactory from '~/utils/logger'; import { PageContentFooter } from '../PageView/PageContentFooter'; import { PageViewLayout } from '../PageView/PageViewLayout'; import RevisionRenderer from '../PageView/RevisionRenderer'; import ShareLinkAlert from './ShareLinkAlert'; const logger = loggerFactory('growi:Page'); const PageSideContents = dynamic( () => import('~/client/components/PageSideContents').then( (mod) => mod.PageSideContents, ), { ssr: false }, ); const ForbiddenPage = dynamic( () => import('~/client/components/ForbiddenPage'), { ssr: false }, ); const SlideRenderer = dynamic( () => import('~/client/components/Page/SlideRenderer').then( (mod) => mod.SlideRenderer, ), { ssr: false }, ); type Props = { pagePath: string; rendererConfig: RendererConfig; page?: IPagePopulatedToShowRevision; shareLink?: IShareLinkHasId; isExpired: boolean; disableLinkSharing: boolean; }; export const ShareLinkPageView = (props: Props): JSX.Element => { const { pagePath, rendererConfig, page, shareLink, isExpired, disableLinkSharing, } = props; const { data: isNotFoundMeta } = useIsNotFound(); const { data: viewOptions } = useViewOptions(); const shouldExpandContent = useShouldExpandContent(page); const markdown = page?.revision?.body; const isSlide = useSlidesByFrontmatter( markdown, rendererConfig.isEnabledMarp, ); const isNotFound = isNotFoundMeta || page == null || shareLink == null; const specialContents = useMemo(() => { if (disableLinkSharing) { return ; } }, [disableLinkSharing, props.disableLinkSharing]); const headerContents = ( ); const sideContents = !isNotFound ? : null; const footerContents = !isNotFound ? : null; const Contents = () => { if (isNotFound || page.revision == null) { return <>; } if (isExpired) { return ( <>

Page is expired

); } const rendererOptions = viewOptions ?? generateSSRViewOptions(rendererConfig, pagePath); const markdown = page.revision.body; return isSlide != null ? ( ) : ( ); }; return ( {specialContents} {specialContents == null && ( <> {isNotFound && (

Page is not found

)} {!isNotFound && ( <>
)} )}
); };