UNPKG

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
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=