@woocommerce/data
Version:
WooCommerce Admin data store and utilities
97 lines (96 loc) • 3.05 kB
JavaScript
/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
import { apiFetch, select } from '@wordpress/data-controls';
import { controls } from '@wordpress/data';
import { concat } from 'lodash';
/**
* Internal dependencies
*/
import { NAMESPACE } from '../constants';
import { STORE_NAME } from './constants';
import TYPES from './action-types';
// Can be removed in WP 5.9, wp.data is supported in >5.7.
const resolveSelect = controls && controls.resolveSelect ? controls.resolveSelect : select;
export function updateSettingsForGroup(group, data, time = new Date()) {
return {
type: TYPES.UPDATE_SETTINGS_FOR_GROUP,
group,
data,
time,
};
}
export function updateErrorForGroup(group, data, error, time = new Date()) {
return {
type: TYPES.UPDATE_ERROR_FOR_GROUP,
group,
data,
error,
time,
};
}
export function setIsRequesting(group, isRequesting) {
return {
type: TYPES.SET_IS_REQUESTING,
group,
isRequesting,
};
}
export function clearIsDirty(group) {
return {
type: TYPES.CLEAR_IS_DIRTY,
group,
};
}
// this would replace setSettingsForGroup
export function* persistSettingsForGroup(group) {
// first dispatch the is persisting action
yield setIsRequesting(group, true);
// get all dirty keys with select control
const dirtyKeys = yield resolveSelect(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(STORE_NAME, 'getSettingsForGroup', group, dirtyKeys);
const url = `${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 concat(updates, u);
}, []);
try {
const results = yield apiFetch({
path: url,
method: 'POST',
data: { update },
});
yield setIsRequesting(group, false);
if (!results) {
throw new Error(__('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;
}
}
// allows updating and persisting immediately in one action.
export 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);
}
export function clearSettings() {
return {
type: TYPES.CLEAR_SETTINGS,
};
}