const components = {};
export let React = undefined;
export function useReact(value) {
if (React == null) {
React = value;
}
}
export function createElement(name, props, children) {
if (!Array.isArray(children)) children = [children];
return React.createElement(name, props, ...children);
}
let currentTmpRefs = null;
function renderRustComponent(props) {
let component = props.component;
React.useEffect(
function freeProps() {
return () => component.free();
},
[component]
);
useRustTmpRefs();
return component.render();
}
function getRustComponent(name) {
if (components[name] == null) {
Object.assign(components, {
[name]: (props = {}) => renderRustComponent(props),
});
components[name].displayName = name;
}
return components[name];
}
export function createRustComponent(name, key, component) {
return React.createElement(getRustComponent(name), {
key,
component,
});
}
function getRustMemoComponent(name) {
const key = `wasm_react::Memoized<${name}>`;
if (components[key] == null) {
Object.assign(components, {
[key]: React.memo(getRustComponent(name), (prevProps, nextProps) => {
const equal = prevProps.component.eq(nextProps.component);
if (equal) {
nextProps.component.free();
}
return equal;
}),
});
components[key].displayName = key;
}
return components[key];
}
export function createRustMemoComponent(name, key, component) {
return React.createElement(getRustMemoComponent(name), {
key,
component,
});
}
export function useRustRef(create, callback) {
let ref = React.useRef(null);
if (ref.current == null) {
ref.current = create();
}
React.useEffect(function freeRef() {
return () => ref.current.free();
}, []);
callback(ref.current);
}
export function useRustTmpRefs() {
currentTmpRefs = React.useRef([]);
let tmpRefs = currentTmpRefs;
const tmpRefsToBeFreed = tmpRefs.current;
tmpRefs.current = [];
React.useEffect(function freeTmpRefs() {
return () => {
setTimeout(() => {
for (const value of tmpRefsToBeFreed) {
value.free();
}
});
};
});
}
export function useRustTmpRef(value, callback) {
if (currentTmpRefs != null) {
currentTmpRefs.current.push(value);
callback(value);
} else {
value.free();
}
}
export function useRustState() {
let [, setState] = React.useState(() => []);
return () => setState([]);
}
export function useRustEffect(effect, dep) {
React.useEffect(effect, [dep]);
}
export function useRustLayoutEffect(effect, dep) {
React.useLayoutEffect(effect, [dep]);
}
export function useRustContext(context, callback) {
callback(React.useContext(context));
}