set-state-compare
Version:
setState for React that compares with the current state and only sets the state if changed.
135 lines • 14.5 kB
JavaScript
import { simpleObjectValuesDifferent } from "./diff-utils.js";
import shared from "./shared.js";
/** @type {{mode: string, renderComponents: Shape[], renderLaterTimeout: number}} */
const settings = {
mode: "queuedForceUpdate",
renderComponents: [],
renderLaterTimeout: undefined
};
const validModes = ["queuedForceUpdate", "setState"];
const callRenders = () => {
const renderComponents = settings.renderComponents;
settings.renderComponents = [];
for (const renderComponent of renderComponents) {
renderComponent.__shapeRender();
}
};
export default class Shape {
/**
* @param {string} newMode
*/
static setMode(newMode) {
if (!validModes.includes(newMode)) {
throw new Error(`Invalid mode: ${newMode}`);
}
settings.mode = newMode;
}
/**
* @param {any} component
* @param {Record<string, any>} [data]
*/
constructor(component, data = {}) {
this.__component = component;
this.__stateCallbacks = [];
this.__renderCount = 0;
this.__prevShape = {};
if (settings.mode == "setState" && component.state === undefined) {
component.state = {};
}
if (data) {
this.__setDataOnThis(data, true);
}
}
/**
* @param {Record<string, any>} newData
* @param {function(): void | undefined} callback
* @returns {void}
*/
set(newData, callback) {
if (simpleObjectValuesDifferent(newData, this)) {
if (callback) {
this.__stateCallbacks.push(callback);
}
this.__setDataOnThis(newData);
this.__shapeRenderLater();
}
else if (callback) {
if (this.renderPending) {
// There is nothing to render because of the given new data, but a render is pending, so we need to put this in queue to call callbacks in correct order
this.__stateCallbacks.push(callback);
}
else {
// Nothing to render and not pending a render - so call callback instantly
callback();
}
}
}
/**
* @private
* @param {Record<string, any>} newData
* @param {boolean} [skipDidUpdate]
* @returns {void}
*/
__setDataOnThis(newData, skipDidUpdate) {
let prevShape;
if (this.__component.shapeUpdated && !skipDidUpdate) {
prevShape = Object.assign({}, this);
}
for (const key in newData) {
this[key] = newData[key];
}
if (this.__component.shapeUpdated && !skipDidUpdate) {
this.__component.shapeUpdated(prevShape);
}
}
/**
* @param {Record<string, any>} newData
* @returns {Promise<void>}
*/
setAsync(newData) {
return new Promise((resolve, reject) => {
try {
this.set(newData, resolve);
}
catch (error) {
reject(error);
}
});
}
__shapeRender() {
if (settings.mode == "setState") {
this.__component.setState({ __renderCount: this.__renderCount++ }, this.__shapeAfterRender);
}
else {
this.__component.forceUpdate(this.__shapeAfterRender);
}
}
__shapeAfterRender = () => {
this.renderPending = false;
this.__shapeCallCallbacks();
};
__shapeCallCallbacks() {
for (const stateCallback of this.__stateCallbacks) {
stateCallback();
}
if (this.__component.shapeDidUpdate)
this.__component.shapeDidUpdate(this.__prevShape);
this.__prevShape = Object.assign({}, this);
this.__stateCallbacks = [];
}
__shapeRenderLater() {
const renderPosition = settings.renderComponents.indexOf(this);
if (renderPosition > -1) {
settings.renderComponents.splice(renderPosition, 1);
}
settings.renderComponents.push(this);
if (!settings.renderLaterTimeout) {
settings.renderLaterTimeout = shared.scheduleAfterPaint(() => {
settings.renderLaterTimeout = undefined;
callRenders();
});
}
this.renderPending = true;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2hhcGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDM0QsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBRWhDLG9GQUFvRjtBQUNwRixNQUFNLFFBQVEsR0FBRztJQUNmLElBQUksRUFBRSxtQkFBbUI7SUFDekIsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixrQkFBa0IsRUFBRSxTQUFTO0NBQzlCLENBQUE7QUFDRCxNQUFNLFVBQVUsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxDQUFBO0FBRXBELE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRTtJQUN2QixNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQTtJQUVsRCxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO0lBRTlCLEtBQUssTUFBTSxlQUFlLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDakMsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBSztJQUN4Qjs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUVELFFBQVEsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLFNBQVMsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtRQUM1QixJQUFJLENBQUMsZ0JBQWdCLEdB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c2ltcGxlT2JqZWN0VmFsdWVzRGlmZmVyZW50fSBmcm9tIFwiLi9kaWZmLXV0aWxzLmpzXCJcbmltcG9ydCBzaGFyZWQgZnJvbSBcIi4vc2hhcmVkLmpzXCJcblxuLyoqIEB0eXBlIHt7bW9kZTogc3RyaW5nLCByZW5kZXJDb21wb25lbnRzOiBTaGFwZVtdLCByZW5kZXJMYXRlclRpbWVvdXQ6IG51bWJlcn19ICovXG5jb25zdCBzZXR0aW5ncyA9IHtcbiAgbW9kZTogXCJxdWV1ZWRGb3JjZVVwZGF0ZVwiLFxuICByZW5kZXJDb21wb25lbnRzOiBbXSxcbiAgcmVuZGVyTGF0ZXJUaW1lb3V0OiB1bmRlZmluZWRcbn1cbmNvbnN0IHZhbGlkTW9kZXMgPSBbXCJxdWV1ZWRGb3JjZVVwZGF0ZVwiLCBcInNldFN0YXRlXCJdXG5cbmNvbnN0IGNhbGxSZW5kZXJzID0gKCkgPT4ge1xuICBjb25zdCByZW5kZXJDb21wb25lbnRzID0gc2V0dGluZ3MucmVuZGVyQ29tcG9uZW50c1xuXG4gIHNldHRpbmdzLnJlbmRlckNvbXBvbmVudHMgPSBbXVxuXG4gIGZvciAoY29uc3QgcmVuZGVyQ29tcG9uZW50IG9mIHJlbmRlckNvbXBvbmVudHMpIHtcbiAgICByZW5kZXJDb21wb25lbnQuX19zaGFwZVJlbmRlcigpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hhcGUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5ld01vZGVcbiAgICovXG4gIHN0YXRpYyBzZXRNb2RlKG5ld01vZGUpIHtcbiAgICBpZiAoIXZhbGlkTW9kZXMuaW5jbHVkZXMobmV3TW9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtb2RlOiAke25ld01vZGV9YClcbiAgICB9XG5cbiAgICBzZXR0aW5ncy5tb2RlID0gbmV3TW9kZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbZGF0YV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCwgZGF0YSA9IHt9KSB7XG4gICAgdGhpcy5fX2NvbXBvbmVudCA9IGNvbXBvbmVudFxuICAgIHRoaXMuX19zdGF0ZUNhbGxiYWNrcyA9IFtdXG4gICAgdGhpcy5fX3JlbmRlckNvdW50ID0gMFxuICAgIHRoaXMuX19wcmV2U2hhcGUgPSB7fVxuXG4gICAgaWYgKHNldHRpbmdzLm1vZGUgPT0gXCJzZXRTdGF0ZVwiICYmIGNvbXBvbmVudC5zdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb21wb25lbnQuc3RhdGUgPSB7fVxuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLl9fc2V0RGF0YU9uVGhpcyhkYXRhLCB0cnVlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG5ld0RhdGFcbiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB2b2lkIHwgdW5kZWZpbmVkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldChuZXdEYXRhLCBjYWxsYmFjaykge1xuICAgIGlmIChzaW1wbGVPYmplY3RWYWx1ZXNEaWZmZXJlbnQobmV3RGF0YSwgdGhpcykpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9fc3RhdGVDYWxsYmFja3MucHVzaChjYWxsYmFjaylcbiAgICAgIH1cblxuICAgICAgdGhpcy5fX3NldERhdGFPblRoaXMobmV3RGF0YSlcbiAgICAgIHRoaXMuX19zaGFwZVJlbmRlckxhdGVyKClcbiAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5yZW5kZXJQZW5kaW5nKSB7XG4gICAgICAgIC8vIFRoZXJlIGlzIG5vdGhpbmcgdG8gcmVuZGVyIGJlY2F1c2Ugb2YgdGhlIGdpdmVuIG5ldyBkYXRhLCBidXQgYSByZW5kZXIgaXMgcGVuZGluZywgc28gd2UgbmVlZCB0byBwdXQgdGhpcyBpbiBxdWV1ZSB0byBjYWxsIGNhbGxiYWNrcyBpbiBjb3JyZWN0IG9yZGVyXG4gICAgICAgIHRoaXMuX19zdGF0ZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm90aGluZyB0byByZW5kZXIgYW5kIG5vdCBwZW5kaW5nIGEgcmVuZGVyIC0gc28gY2FsbCBjYWxsYmFjayBpbnN0YW50bHlcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG5ld0RhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcERpZFVwZGF0ZV1cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfX3NldERhdGFPblRoaXMobmV3RGF0YSwgc2tpcERpZFVwZGF0ZSkge1xuICAgIGxldCBwcmV2U2hhcGVcblxuICAgIGlmICh0aGlzLl9fY29tcG9uZW50LnNoYXBlVXBkYXRlZCAmJiAhc2tpcERpZFVwZGF0ZSkge1xuICAgICAgcHJldlNoYXBlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcylcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdEYXRhKSB7XG4gICAgICB0aGlzW2tleV0gPSBuZXdEYXRhW2tleV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fX2NvbXBvbmVudC5zaGFwZVVwZGF0ZWQgJiYgIXNraXBEaWRVcGRhdGUpIHtcbiAgICAgIHRoaXMuX19jb21wb25lbnQuc2hhcGVVcGRhdGVkKHByZXZTaGFwZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBuZXdEYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc2V0QXN5bmMobmV3RGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNldChuZXdEYXRhLCByZXNvbHZlKVxuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIF9fc2hhcGVSZW5kZXIoKSB7XG4gICAgaWYgKHNldHRpbmdzLm1vZGUgPT0gXCJzZXRTdGF0ZVwiKSB7XG4gICAgICB0aGlzLl9fY29tcG9uZW50LnNldFN0YXRlKFxuICAgICAgICB7X19yZW5kZXJDb3VudDogdGhpcy5fX3JlbmRlckNvdW50Kyt9LFxuICAgICAgICB0aGlzLl9fc2hhcGVBZnRlclJlbmRlclxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fY29tcG9uZW50LmZvcmNlVXBkYXRlKHRoaXMuX19zaGFwZUFmdGVyUmVuZGVyKVxuICAgIH1cbiAgfVxuXG4gIF9fc2hhcGVBZnRlclJlbmRlciA9ICgpID0+IHtcbiAgICB0aGlzLnJlbmRlclBlbmRpbmcgPSBmYWxzZVxuICAgIHRoaXMuX19zaGFwZUNhbGxDYWxsYmFja3MoKVxuICB9XG5cbiAgX19zaGFwZUNhbGxDYWxsYmFja3MoKSB7XG4gICAgZm9yIChjb25zdCBzdGF0ZUNhbGxiYWNrIG9mIHRoaXMuX19zdGF0ZUNhbGxiYWNrcykge1xuICAgICAgc3RhdGVDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX19jb21wb25lbnQuc2hhcGVEaWRVcGRhdGUpIHRoaXMuX19jb21wb25lbnQuc2hhcGVEaWRVcGRhdGUodGhpcy5fX3ByZXZTaGFwZSlcblxuICAgIHRoaXMuX19wcmV2U2hhcGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzKVxuICAgIHRoaXMuX19zdGF0ZUNhbGxiYWNrcyA9IFtdXG4gIH1cblxuICBfX3NoYXBlUmVuZGVyTGF0ZXIoKSB7XG4gICAgY29uc3QgcmVuZGVyUG9zaXRpb24gPSBzZXR0aW5ncy5yZW5kZXJDb21wb25lbnRzLmluZGV4T2YodGhpcylcblxuICAgIGlmIChyZW5kZXJQb3NpdGlvbiA+IC0xKSB7XG4gICAgICBzZXR0aW5ncy5yZW5kZXJDb21wb25lbnRzLnNwbGljZShyZW5kZXJQb3NpdGlvbiwgMSlcbiAgICB9XG5cbiAgICBzZXR0aW5ncy5yZW5kZXJDb21wb25lbnRzLnB1c2godGhpcylcblxuICAgIGlmICghc2V0dGluZ3MucmVuZGVyTGF0ZXJUaW1lb3V0KSB7XG4gICAgICBzZXR0aW5ncy5yZW5kZXJMYXRlclRpbWVvdXQgPSBzaGFyZWQuc2NoZWR1bGVBZnRlclBhaW50KCgpID0+IHtcbiAgICAgICAgc2V0dGluZ3MucmVuZGVyTGF0ZXJUaW1lb3V0ID0gdW5kZWZpbmVkXG4gICAgICAgIGNhbGxSZW5kZXJzKClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJQZW5kaW5nID0gdHJ1ZVxuICB9XG59XG4iXX0=