import findRootTag from '../element/findRootTag'; import type { ReactElement } from '../element/types'; import { pageTitleMap } from '../global'; import configGlobal from '../config'; export function markTitle(element: ReactElement) { const node = element._owner; if (!node) { return; } const pageTitleProp = configGlobal.getPageTitleProp(); // console.info(getComponentName(element.type), getComponentName(element._owner?.elementType), element.props.children) const props = node.memoizedProps || {}; if (!pageTitleProp || !props.hasOwnProperty(pageTitleProp)) { return; } // console.info(getComponentName(node.elementType)) const rootTag = findRootTag(node); if (rootTag < 0) { return; } if (pageTitleMap.has(rootTag)) { return; } pageTitleMap.set(rootTag, node); // console.info('set', rootTag, getComponentName(node.elementType)) } export default function getTitle(rootTag: number): string | undefined { const node = pageTitleMap.get(rootTag); if (!node) { return undefined; } // console.info('get', rootTag, getComponentName(node.elementType)) const pageTitleProp = configGlobal.getPageTitleProp(); if (!pageTitleProp) { return undefined; } if (!node.memoizedProps) { return undefined; } const titleProp = node.memoizedProps[pageTitleProp]; if (typeof titleProp === 'string') { return node.memoizedProps[titleProp]; } if (!node.memoizedProps.children) { return undefined; } return node.memoizedProps.children.toString(); }