UNPKG

set-state-compare

Version:

setState for React that compares with the current state and only sets the state if changed.

41 lines 4.4 kB
import { simpleObjectDifferent } from "./diff-utils.js"; /** * @param {any} component * @param {Record<string, any> | function(Record<string, any>): Record<string, any>} state * @param {function(): void} [callback] * @returns {Promise<void>} Resolves when the state is set or skipped. */ export default function setState(component, state, callback) { return new Promise((resolve) => { let finish; // Support being a drop-in replacement by passing an extra callback option but dont spawn an extra function unless given if (callback) { finish = function () { resolve(); callback(); }; } else { finish = resolve; } if (typeof state == "function") { // We can't skip this type of setState component.setState((prevState) => { const newState = state(prevState); if (simpleObjectDifferent(newState, prevState, false)) { return newState; } return null; }, finish); } else { if (simpleObjectDifferent(state, component.state, false)) { component.setState(state, finish); } else { finish(); } } }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NldC1zdGF0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUVyRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUTtJQUN6RCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsSUFBSSxNQUFNLENBQUE7UUFFVix3SEFBd0g7UUFDeEgsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRztnQkFDUCxPQUFPLEVBQUUsQ0FBQTtnQkFDVCxRQUFRLEVBQUUsQ0FBQTtZQUNaLENBQUMsQ0FBQTtRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLE9BQU8sQ0FBQTtRQUNsQixDQUFDO1FBRUQsSUFBSSxPQUFPLEtBQUssSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUMvQixzQ0FBc0M7WUFDdEMsU0FBUyxDQUFDLFFBQVEsQ0FDaEIsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDWixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBRWpDLElBQUkscUJBQXFCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN0RCxPQUFPLFFBQVEsQ0FBQTtnQkFDakIsQ0FBQztnQkFFRCxPQUFPLElBQUksQ0FBQTtZQUNiLENBQUMsRUFDRCxNQUFNLENBQ1AsQ0FBQTtRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6RCxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUNuQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxFQUFFLENBQUE7WUFDVixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2ltcGxlT2JqZWN0RGlmZmVyZW50fSBmcm9tIFwiLi9kaWZmLXV0aWxzLmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gY29tcG9uZW50XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCBmdW5jdGlvbihSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55Pn0gc3RhdGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogdm9pZH0gW2NhbGxiYWNrXVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gdGhlIHN0YXRlIGlzIHNldCBvciBza2lwcGVkLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXRTdGF0ZShjb21wb25lbnQsIHN0YXRlLCBjYWxsYmFjaykge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBsZXQgZmluaXNoXG5cbiAgICAvLyBTdXBwb3J0IGJlaW5nIGEgZHJvcC1pbiByZXBsYWNlbWVudCBieSBwYXNzaW5nIGFuIGV4dHJhIGNhbGxiYWNrIG9wdGlvbiBidXQgZG9udCBzcGF3biBhbiBleHRyYSBmdW5jdGlvbiB1bmxlc3MgZ2l2ZW5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNvbHZlKClcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmaW5pc2ggPSByZXNvbHZlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIFdlIGNhbid0IHNraXAgdGhpcyB0eXBlIG9mIHNldFN0YXRlXG4gICAgICBjb21wb25lbnQuc2V0U3RhdGUoXG4gICAgICAgIChwcmV2U3RhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHN0YXRlKHByZXZTdGF0ZSlcblxuICAgICAgICAgIGlmIChzaW1wbGVPYmplY3REaWZmZXJlbnQobmV3U3RhdGUsIHByZXZTdGF0ZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3U3RhdGVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBmaW5pc2hcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNpbXBsZU9iamVjdERpZmZlcmVudChzdGF0ZSwgY29tcG9uZW50LnN0YXRlLCBmYWxzZSkpIHtcbiAgICAgICAgY29tcG9uZW50LnNldFN0YXRlKHN0YXRlLCBmaW5pc2gpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5pc2goKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cbiJdfQ==