import React, { useEffect, useMemo, useState } from 'react' import { NormalSizes, tuple } from '../utils/prop-types' import { getPageSize } from './styles' import useTheme from '../use-theme' import PageHeader from './page-header' import PageContent from './page-content' import { hasChild } from '../utils/collections' import PageFooter from './page-footer' const renderMode = tuple('default', 'effect', 'effect-seo') export type PageSize = NormalSizes | string export type PageRenderMode = (typeof renderMode)[number] interface Props { size?: PageSize render?: PageRenderMode dotBackdrop: boolean } const defaultProps = { size: 'medium' as PageSize, render: 'default' as PageRenderMode, dotBackdrop: false } const DotStyles: React.FC = () => ( ) type NativeAttrs = Omit, keyof Props> export type NoteProps = Props & typeof defaultProps & NativeAttrs const Page: React.FC> = ({ children, size, render, dotBackdrop, className, ...props }) => { const theme = useTheme() const width = useMemo(() => getPageSize(size, theme.layout), [size, theme.layout]) const showDot = useMemo(() => { if (theme.type === 'dark') return false return dotBackdrop }, [dotBackdrop, theme.type]) const [preventRender, setPreventRender] = useState(render !== 'default') useEffect(() => { setPreventRender(false) }, []) if (preventRender) { const renderSEO = render === 'effect-seo' if (!renderSEO) return null return ( ) } const hasContent = hasChild(children, PageContent) return (
{hasContent ? children : {children}} {showDot && }
) } type MemoPageComponent

= React.NamedExoticComponent

& { Header: typeof PageHeader Content: typeof PageContent Body: typeof PageContent Footer: typeof PageFooter } type ComponentProps = Partial & Omit & NativeAttrs Page.defaultProps = defaultProps export default React.memo(Page) as MemoPageComponent