/* eslint-disable no-param-reassign */ import * as React from "react"; import { UseProps, UseProp, UseComponent } from "./types"; import { omit, toArray } from "./utils"; const Use = React.forwardRef((props: UseProps, ref) => render(Object.assign(omit(props, "useNext"), { ref, use: props.useNext })) ); function render(props: UseProps) { // filter Use and string components in the middle const [Component, ...useNext] = toArray(props.use).filter( (x, i, arr) => x !== Use && (typeof x !== "string" || i === arr.length - 1) ); if (!Component) { return null; } const finalProps = omit(props, "use", "useNext"); if (!useNext.length || typeof Component === "string") { return ; } if (useNext.length === 1) { return ; } return ; } function use(...uses: T) { const Component = (React.forwardRef, UseProps>( (props, ref) => render( Object.assign(omit(props, "useNext"), { ref, use: [...uses, ...toArray(props.use), ...toArray(props.useNext)] }) ) ) as unknown) as UseComponent; Component.uses = uses; return Component; } export default use;