import { Children, ReactElement, ReactNode } from 'react';
import { isChildWithProperty } from '../isChildWithProperty';
import { unwrapRootFragment } from '../unwrapRootFragment';
/**
* Find the first child component with a matching static property
*
* **Search Depth:** This function only searches 1 level deep:
* - Direct children of the provided children
* - Direct children inside React.Fragment components (1 level of fragment nesting)
* - Does NOT recursively search nested fragments or deeply nested components
*
* **Styled Component Support:** Checks component.target and component.__emotion_base
* for styled() wrapped components.
*
* @example
* ```ts
* // ✅ Will find: Direct child
* findChild(, 'isFoo') //
*
* // ✅ Will find: Child inside a single fragment
* findChild(<>>, 'isFoo') //
*
* // ❌ Will NOT find: Deeply nested fragments
* findChild(<><>>>, 'isFoo') // undefined
*
* // ❌ Will NOT find: Nested in other elements
* findChild(
, 'isFoo') // undefined
* ```
*
* @param children Any React children
* @param staticProperty The static property name to check for
* @returns The first matching ReactElement or undefined if not found
*/
export const findChild = (
children: ReactNode,
staticProperty: string,
): ReactElement | undefined => {
if (!children || Children.count(children) === 0) {
return undefined;
}
const allChildren = unwrapRootFragment(children);
if (!allChildren) return;
return allChildren
.flat()
.find(child => isChildWithProperty(child, staticProperty)) as ReactElement;
};