import { isEmpty, isFunction } from '@legendapp/state';
import { reactive } from '@legendapp/state/react';
import { createElement, forwardRef } from 'react';
const ReactiveFns = new Map();
const ReactiveFnBinders = new Map();
export const Reactive = new Proxy({}, {
    get(target, p) {
        if (!target[p]) {
            const Component = ReactiveFns.get(p) || p;
            // Create a wrapper around createElement with the string so we can proxy it
            // eslint-disable-next-line react/display-name
            const render = forwardRef((props, ref) => {
                const propsOut = { ...props };
                if (ref && (isFunction(ref) || !isEmpty(ref))) {
                    propsOut.ref = ref;
                }
                return createElement(Component, propsOut);
            });
            target[p] = reactive(render, ReactiveFnBinders.get(p));
        }
        return target[p];
    },
});
export function configureReactive({ components, binders, }) {
    if (components) {
        for (const key in components) {
            ReactiveFns.set(key, components[key]);
        }
    }
    if (binders) {
        for (const key in binders) {
            ReactiveFnBinders.set(key, binders[key]);
        }
    }
}
//# sourceMappingURL=Reactive.jsx.map