solid-native
Version:
Use solid.js to develop native mobile applications
57 lines • 2.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSolidProps = void 0;
const react_1 = require("react");
const solid_js_1 = require("solid-js");
const symbols_1 = require("./symbols");
const util_1 = require("./util");
const propsProto = new Proxy({}, {
get: (_, key, recv) => {
const [accessor, setter] = (0, solid_js_1.runWithOwner)(recv[symbols_1.$owner], () => (0, solid_js_1.createSignal)(undefined));
recv[symbols_1.$setters][key] = setter;
Object.defineProperty(recv, key, {
enumerable: true,
get: accessor,
});
return accessor();
},
});
function createSolidProps(owner) {
const props = Object.create(propsProto);
props[symbols_1.$setters] = {};
props[symbols_1.$owner] = owner;
return props;
}
function updateSolidProps(solidProps, props) {
(0, solid_js_1.batch)(() => {
for (const key in props) {
if (key in solidProps) {
solidProps[symbols_1.$setters][key](() => props[key]);
}
else {
const [accessor, setter] = (0, solid_js_1.runWithOwner)(props[symbols_1.$owner], () => (0, solid_js_1.createSignal)(props[key]));
solidProps[symbols_1.$setters][key] = setter;
Object.defineProperty(solidProps, key, {
enumerable: true,
get: accessor,
});
}
}
});
}
function useSolidProps(props) {
const { dispose, solidProps } = (0, util_1.useOnce)(() => (0, solid_js_1.createRoot)((dispose) => {
const owner = (0, solid_js_1.getOwner)();
const solidProps = createSolidProps(owner);
return { dispose, solidProps };
}));
(0, react_1.useEffect)(() => dispose, []);
const lastProps = (0, react_1.useRef)(null);
if (props !== lastProps.current) {
lastProps.current = props;
updateSolidProps(solidProps, props);
}
return solidProps;
}
exports.useSolidProps = useSolidProps;
//# sourceMappingURL=useSolidProps.js.map