"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.configureReactive = exports.Reactive = void 0;
const state_1 = require("@legendapp/state");
const react_1 = require("@legendapp/state/react");
const react_2 = require("react");
const ReactiveFns = new Map();
const ReactiveFnBinders = new Map();
exports.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 = (0, react_2.forwardRef)((props, ref) => {
                const propsOut = { ...props };
                if (ref && ((0, state_1.isFunction)(ref) || !(0, state_1.isEmpty)(ref))) {
                    propsOut.ref = ref;
                }
                return (0, react_2.createElement)(Component, propsOut);
            });
            target[p] = (0, react_1.reactive)(render, ReactiveFnBinders.get(p));
        }
        return target[p];
    },
});
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]);
        }
    }
}
exports.configureReactive = configureReactive;
//# sourceMappingURL=Reactive.jsx.map