@woocommerce/data
Version:
WooCommerce Admin data store and utilities
110 lines (109 loc) • 4.05 kB
JavaScript
;
/**
* External dependencies
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.clearSettings = exports.updateAndPersistSettingsForGroup = exports.persistSettingsForGroup = exports.clearIsDirty = exports.setIsRequesting = exports.updateErrorForGroup = exports.updateSettingsForGroup = void 0;
const i18n_1 = require("@wordpress/i18n");
const data_controls_1 = require("@wordpress/data-controls");
const data_1 = require("@wordpress/data");
const lodash_1 = require("lodash");
/**
* Internal dependencies
*/
const constants_1 = require("../constants");
const constants_2 = require("./constants");
const action_types_1 = __importDefault(require("./action-types"));
// Can be removed in WP 5.9, wp.data is supported in >5.7.
const resolveSelect = data_1.controls && data_1.controls.resolveSelect ? data_1.controls.resolveSelect : data_controls_1.select;
function updateSettingsForGroup(group, data, time = new Date()) {
return {
type: action_types_1.default.UPDATE_SETTINGS_FOR_GROUP,
group,
data,
time,
};
}
exports.updateSettingsForGroup = updateSettingsForGroup;
function updateErrorForGroup(group, data, error, time = new Date()) {
return {
type: action_types_1.default.UPDATE_ERROR_FOR_GROUP,
group,
data,
error,
time,
};
}
exports.updateErrorForGroup = updateErrorForGroup;
function setIsRequesting(group, isRequesting) {
return {
type: action_types_1.default.SET_IS_REQUESTING,
group,
isRequesting,
};
}
exports.setIsRequesting = setIsRequesting;
function clearIsDirty(group) {
return {
type: action_types_1.default.CLEAR_IS_DIRTY,
group,
};
}
exports.clearIsDirty = clearIsDirty;
// this would replace setSettingsForGroup
function* persistSettingsForGroup(group) {
// first dispatch the is persisting action
yield setIsRequesting(group, true);
// get all dirty keys with select control
const dirtyKeys = yield resolveSelect(constants_2.STORE_NAME, 'getDirtyKeys', group);
// if there is nothing dirty, bail
if (dirtyKeys.length === 0) {
yield setIsRequesting(group, false);
return;
}
// get data slice for keys
const dirtyData = yield resolveSelect(constants_2.STORE_NAME, 'getSettingsForGroup', group, dirtyKeys);
const url = `${constants_1.NAMESPACE}/settings/${group}/batch`;
const update = dirtyKeys.reduce((updates, key) => {
const u = Object.keys(dirtyData[key]).map((k) => {
return { id: k, value: dirtyData[key][k] };
});
return (0, lodash_1.concat)(updates, u);
}, []);
try {
const results = yield (0, data_controls_1.apiFetch)({
path: url,
method: 'POST',
data: { update },
});
yield setIsRequesting(group, false);
if (!results) {
throw new Error((0, i18n_1.__)('There was a problem updating your settings.', 'woocommerce'));
}
// remove dirtyKeys from map - note we're only doing this if there is no error.
yield clearIsDirty(group);
}
catch (e) {
yield updateErrorForGroup(group, null, e);
yield setIsRequesting(group, false);
throw e;
}
}
exports.persistSettingsForGroup = persistSettingsForGroup;
// allows updating and persisting immediately in one action.
function* updateAndPersistSettingsForGroup(group, data) {
// Preemptively set requesting to allow for loading UI when optimistically updating settings.
yield setIsRequesting(group, true);
yield updateSettingsForGroup(group, data);
yield* persistSettingsForGroup(group);
}
exports.updateAndPersistSettingsForGroup = updateAndPersistSettingsForGroup;
function clearSettings() {
return {
type: action_types_1.default.CLEAR_SETTINGS,
};
}
exports.clearSettings = clearSettings;