set-state-compare
Version:
setState for React that compares with the current state and only sets the state if changed.
132 lines • 14.7 kB
JavaScript
import { referenceDifferent } from "./diff-utils.js";
import { useEffect, useMemo, useState } from "react";
import fetchingObject from "fetching-object";
import shared from "./shared.js";
class Shape {
constructor() {
this.__mounting = true;
this.__mounted = false;
this.setStates = {};
this.__setStatesActual = {};
this.__setStatesLater = {};
/** @type {Record<string, any>} */
this.state = {};
/** @type {Record<string, any>} */
this.props = {};
/** @type {Record<string, any>} */
this.meta = {};
this.m = fetchingObject(() => this.meta);
this.p = fetchingObject(() => this.props);
this.s = fetchingObject(this.state);
}
__afterRender() {
for (const stateName in this.__setStatesLater) {
const stateValue = this.__setStatesLater[stateName];
const setState = this.__setStatesActual[stateName];
setState(stateValue);
delete this.__setStatesLater[stateName];
}
}
/**
* @param {Record<string, any>} statesList
* @param {object} [args]
* @param {boolean} [args.silent]
*/
set(statesList, args) {
for (const stateName in statesList) {
const newValue = statesList[stateName];
if (!(stateName in this.setStates)) {
throw new Error(`No such state: ${stateName}`);
}
this.setStates[stateName](newValue, { silent: args?.silent });
}
}
/** @param {Record<string, any>} newMeta */
updateMeta(newMeta) {
Object.assign(this.meta, newMeta);
}
/** @param {Record<string, any>} newProps */
updateProps(newProps) {
this.props = newProps;
}
/**
* @param {string} stateName
* @param {any} defaultValue
* @returns {void}
*/
useState(stateName, defaultValue) {
const [stateValue, setState] = useState(defaultValue);
this.__setStatesActual[stateName] = setState;
if (!(stateName in this.state)) {
this.state[stateName] = stateValue;
this.setStates[stateName] = (newValue, args) => {
if (referenceDifferent(this.state[stateName], newValue)) {
this.state[stateName] = newValue;
if (!args?.silent) {
if (shared.rendering > 0 || !this.__mounted) { // Avoid React error if using set-state while rendering or not mounted (like in a useMemo callback)
this.__setStatesLater[stateName] = newValue;
}
else {
setState(newValue);
}
}
}
};
}
return this.setStates[stateName];
}
/** @param {Record<string, any> | string[]} statesList */
useStates(statesList) {
if (Array.isArray(statesList)) {
for (const stateName of statesList) {
this.useState(stateName);
}
}
else {
for (const stateName in statesList) {
const defaultValue = statesList[stateName];
this.useState(stateName, defaultValue);
}
}
}
}
/**
* @param {typeof Shape} ShapeClass
* @returns {import("react").ReactElement | null}
*/
const shapeComponent = (ShapeClass) => {
return (props) => {
const shape = useMemo(() => new ShapeClass(), []);
shape.updateProps(props);
if (shape.setup) {
shape.setup();
}
return shape.render();
};
};
/**
* @param {Record<string, any>} props
* @param {object} [opts]
* @param {typeof Shape} [opts.shapeClass]
* @returns {Shape}
*/
function useShape(props, opts) {
/** @type {Shape} */
const shape = useMemo(() => {
const ShapeClass = opts?.shapeClass || Shape;
return new ShapeClass();
}, []);
useEffect(() => {
shape.__mounting = false;
shape.__mounted = true;
shape.__afterRender();
return () => {
shape.__mounted = false;
};
}, []);
shape.updateProps(props);
return shape;
}
export { shapeComponent, Shape };
export default useShape;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXNoYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3VzZS1zaGFwZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDbEQsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBRWhDLE1BQU0sS0FBSztJQUNUO1FBQ0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQTtRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO1FBRTFCLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtRQUVmLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtRQUVmLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUVkLElBQUksQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDekMsSUFBSSxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxhQUFhO1FBQ1gsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdC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QUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQ3pCLENBQUMsQ0FBQTtJQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUVOLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFeEIsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsT0FBTyxFQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUMsQ0FBQTtBQUM5QixlQUFlLFFBQVEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmVmZXJlbmNlRGlmZmVyZW50fSBmcm9tIFwiLi9kaWZmLXV0aWxzLmpzXCJcbmltcG9ydCB7dXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZX0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBmZXRjaGluZ09iamVjdCBmcm9tIFwiZmV0Y2hpbmctb2JqZWN0XCJcbmltcG9ydCBzaGFyZWQgZnJvbSBcIi4vc2hhcmVkLmpzXCJcblxuY2xhc3MgU2hhcGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9fbW91bnRpbmcgPSB0cnVlXG4gICAgdGhpcy5fX21vdW50ZWQgPSBmYWxzZVxuICAgIHRoaXMuc2V0U3RhdGVzID0ge31cbiAgICB0aGlzLl9fc2V0U3RhdGVzQWN0dWFsID0ge31cbiAgICB0aGlzLl9fc2V0U3RhdGVzTGF0ZXIgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuc3RhdGUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMucHJvcHMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMubWV0YSA9IHt9XG5cbiAgICB0aGlzLm0gPSBmZXRjaGluZ09iamVjdCgoKSA9PiB0aGlzLm1ldGEpXG4gICAgdGhpcy5wID0gZmV0Y2hpbmdPYmplY3QoKCkgPT4gdGhpcy5wcm9wcylcbiAgICB0aGlzLnMgPSBmZXRjaGluZ09iamVjdCh0aGlzLnN0YXRlKVxuICB9XG5cbiAgX19hZnRlclJlbmRlcigpIHtcbiAgICBmb3IgKGNvbnN0IHN0YXRlTmFtZSBpbiB0aGlzLl9fc2V0U3RhdGVzTGF0ZXIpIHtcbiAgICAgIGNvbnN0IHN0YXRlVmFsdWUgPSB0aGlzLl9fc2V0U3RhdGVzTGF0ZXJbc3RhdGVOYW1lXVxuICAgICAgY29uc3Qgc2V0U3RhdGUgPSB0aGlzLl9fc2V0U3RhdGVzQWN0dWFsW3N0YXRlTmFtZV1cblxuICAgICAgc2V0U3RhdGUoc3RhdGVWYWx1ZSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9fc2V0U3RhdGVzTGF0ZXJbc3RhdGVOYW1lXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHN0YXRlc0xpc3RcbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnNpbGVudF1cbiAgICovXG4gIHNldChzdGF0ZXNMaXN0LCBhcmdzKSB7XG4gICAgZm9yIChjb25zdCBzdGF0ZU5hbWUgaW4gc3RhdGVzTGlzdCkge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBzdGF0ZXNMaXN0W3N0YXRlTmFtZV1cblxuICAgICAgaWYgKCEoc3RhdGVOYW1lIGluIHRoaXMuc2V0U3RhdGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggc3RhdGU6ICR7c3RhdGVOYW1lfWApXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGVzW3N0YXRlTmFtZV0obmV3VmFsdWUsIHtzaWxlbnQ6IGFyZ3M/LnNpbGVudH0pXG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbmV3TWV0YSAqL1xuICB1cGRhdGVNZXRhKG5ld01ldGEpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMubWV0YSwgbmV3TWV0YSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG5ld1Byb3BzICovXG4gIHVwZGF0ZVByb3BzKG5ld1Byb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlTmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGVmYXVsdFZhbHVlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdXNlU3RhdGUoc3RhdGVOYW1lLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBbc3RhdGVWYWx1ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoZGVmYXVsdFZhbHVlKVxuXG4gICAgdGhpcy5fX3NldFN0YXRlc0FjdHVhbFtzdGF0ZU5hbWVdID0gc2V0U3RhdGVcblxuICAgIGlmICghKHN0YXRlTmFtZSBpbiB0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZVtzdGF0ZU5hbWVdID0gc3RhdGVWYWx1ZVxuICAgICAgdGhpcy5zZXRTdGF0ZXNbc3RhdGVOYW1lXSA9IChuZXdWYWx1ZSwgYXJncykgPT4ge1xuICAgICAgICBpZiAocmVmZXJlbmNlRGlmZmVyZW50KHRoaXMuc3RhdGVbc3RhdGVOYW1lXSwgbmV3VmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtzdGF0ZU5hbWVdID0gbmV3VmFsdWVcblxuICAgICAgICAgIGlmICghYXJncz8uc2lsZW50KSB7XG4gICAgICAgICAgICBpZiAoc2hhcmVkLnJlbmRlcmluZyA+IDAgfHwgIXRoaXMuX19tb3VudGVkKSB7IC8vIEF2b2lkIFJlYWN0IGVycm9yIGlmIHVzaW5nIHNldC1zdGF0ZSB3aGlsZSByZW5kZXJpbmcgb3Igbm90IG1vdW50ZWQgKGxpa2UgaW4gYSB1c2VNZW1vIGNhbGxiYWNrKVxuICAgICAgICAgICAgICB0aGlzLl9fc2V0U3RhdGVzTGF0ZXJbc3RhdGVOYW1lXSA9IG5ld1ZhbHVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXRTdGF0ZShuZXdWYWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZXNbc3RhdGVOYW1lXVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZ1tdfSBzdGF0ZXNMaXN0ICovXG4gIHVzZVN0YXRlcyhzdGF0ZXNMaXN0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVzTGlzdCkpIHtcbiAgICAgIGZvcihjb25zdCBzdGF0ZU5hbWUgb2Ygc3RhdGVzTGlzdCkge1xuICAgICAgICB0aGlzLnVzZVN0YXRlKHN0YXRlTmFtZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGNvbnN0IHN0YXRlTmFtZSBpbiBzdGF0ZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHN0YXRlc0xpc3Rbc3RhdGVOYW1lXVxuXG4gICAgICAgIHRoaXMudXNlU3RhdGUoc3RhdGVOYW1lLCBkZWZhdWx0VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt0eXBlb2YgU2hhcGV9IFNoYXBlQ2xhc3NcbiAqIEByZXR1cm5zIHtpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdEVsZW1lbnQgfCBudWxsfVxuICovXG5jb25zdCBzaGFwZUNvbXBvbmVudCA9IChTaGFwZUNsYXNzKSA9PiB7XG4gIHJldHVybiAocHJvcHMpID0+IHtcbiAgICBjb25zdCBzaGFwZSA9IHVzZU1lbW8oKCkgPT4gbmV3IFNoYXBlQ2xhc3MoKSwgW10pXG5cbiAgICBzaGFwZS51cGRhdGVQcm9wcyhwcm9wcylcblxuICAgIGlmIChzaGFwZS5zZXR1cCkge1xuICAgICAgc2hhcGUuc2V0dXAoKVxuICAgIH1cblxuICAgIHJldHVybiBzaGFwZS5yZW5kZXIoKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wc1xuICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHt0eXBlb2YgU2hhcGV9IFtvcHRzLnNoYXBlQ2xhc3NdXG4gKiBAcmV0dXJucyB7U2hhcGV9XG4gKi9cbmZ1bmN0aW9uIHVzZVNoYXBlKHByb3BzLCBvcHRzKSB7XG4gIC8qKiBAdHlwZSB7U2hhcGV9ICovXG4gIGNvbnN0IHNoYXBlID0gdXNlTWVtbyhcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBTaGFwZUNsYXNzID0gb3B0cz8uc2hhcGVDbGFzcyB8fCBTaGFwZVxuXG4gICAgICByZXR1cm4gbmV3IFNoYXBlQ2xhc3MoKVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2hhcGUuX19tb3VudGluZyA9IGZhbHNlXG4gICAgc2hhcGUuX19tb3VudGVkID0gdHJ1ZVxuICAgIHNoYXBlLl9fYWZ0ZXJSZW5kZXIoKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNoYXBlLl9fbW91bnRlZCA9IGZhbHNlXG4gICAgfVxuICB9LCBbXSlcblxuICBzaGFwZS51cGRhdGVQcm9wcyhwcm9wcylcblxuICByZXR1cm4gc2hhcGVcbn1cblxuZXhwb3J0IHtzaGFwZUNvbXBvbmVudCwgU2hhcGV9XG5leHBvcnQgZGVmYXVsdCB1c2VTaGFwZVxuIl19