UNPKG

@yext/search-ui-react

Version:

A library of React Components for powering Yext Search integrations

25 lines (24 loc) 905 B
import { Children, cloneElement, isValidElement, ReactElement, ReactNode, ReactPortal } from 'react'; /** * Recursively performs React.Children.map on a given ReactNode. */ export function recursivelyMapChildren( children: ReactNode, elementReplacer: (c: ReactElement | ReactPortal, index: number) => ReactNode | null ): ReactNode { return Children.map<ReactNode, ReactNode>(children, (c, index) => { if (!isValidElement(c)) { return c; } const replacedElement = elementReplacer(c, index); if (!replacedElement || !isValidElement(replacedElement)) { return replacedElement; } const grandchildren = replacedElement.props.children; if (!grandchildren) { return replacedElement; } const replacedGrandchildren = recursivelyMapChildren(grandchildren, elementReplacer); return cloneElement(replacedElement, {}, [replacedGrandchildren]); }); }