@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
429 lines (409 loc) • 10.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.blockInserterPanel = blockInserterPanel;
exports.default = void 0;
exports.deleting = deleting;
exports.deviceType = deviceType;
exports.editorSettings = editorSettings;
exports.getPostRawValue = getPostRawValue;
exports.hasSameKeys = hasSameKeys;
exports.inserterSidebarToggleRef = inserterSidebarToggleRef;
exports.isUpdatingSamePostProperty = isUpdatingSamePostProperty;
exports.listViewPanel = listViewPanel;
exports.listViewToggleRef = listViewToggleRef;
exports.postAutosavingLock = postAutosavingLock;
exports.postId = postId;
exports.postLock = postLock;
exports.postSavingLock = postSavingLock;
exports.postType = postType;
exports.publishSidebarActive = publishSidebarActive;
exports.removedPanels = removedPanels;
exports.renderingMode = renderingMode;
exports.saving = saving;
exports.shouldOverwriteState = shouldOverwriteState;
exports.template = template;
exports.templateId = templateId;
var _data = require("@wordpress/data");
var _defaults = require("./defaults");
var _reducer = _interopRequireDefault(require("../dataviews/store/reducer"));
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
/**
* Returns a post attribute value, flattening nested rendered content using its
* raw value in place of its original object form.
*
* @param {*} value Original value.
*
* @return {*} Raw value.
*/
function getPostRawValue(value) {
if (value && 'object' === typeof value && 'raw' in value) {
return value.raw;
}
return value;
}
/**
* Returns true if the two object arguments have the same keys, or false
* otherwise.
*
* @param {Object} a First object.
* @param {Object} b Second object.
*
* @return {boolean} Whether the two objects have the same keys.
*/
function hasSameKeys(a, b) {
const keysA = Object.keys(a).sort();
const keysB = Object.keys(b).sort();
return keysA.length === keysB.length && keysA.every((key, index) => keysB[index] === key);
}
/**
* Returns true if, given the currently dispatching action and the previously
* dispatched action, the two actions are editing the same post property, or
* false otherwise.
*
* @param {Object} action Currently dispatching action.
* @param {Object} previousAction Previously dispatched action.
*
* @return {boolean} Whether actions are updating the same post property.
*/
function isUpdatingSamePostProperty(action, previousAction) {
return action.type === 'EDIT_POST' && hasSameKeys(action.edits, previousAction.edits);
}
/**
* Returns true if, given the currently dispatching action and the previously
* dispatched action, the two actions are modifying the same property such that
* undo history should be batched.
*
* @param {Object} action Currently dispatching action.
* @param {Object} previousAction Previously dispatched action.
*
* @return {boolean} Whether to overwrite present state.
*/
function shouldOverwriteState(action, previousAction) {
if (action.type === 'RESET_EDITOR_BLOCKS') {
return !action.shouldCreateUndoLevel;
}
if (!previousAction || action.type !== previousAction.type) {
return false;
}
return isUpdatingSamePostProperty(action, previousAction);
}
function postId(state = null, action) {
switch (action.type) {
case 'SET_EDITED_POST':
return action.postId;
}
return state;
}
function templateId(state = null, action) {
switch (action.type) {
case 'SET_CURRENT_TEMPLATE_ID':
return action.id;
}
return state;
}
function postType(state = null, action) {
switch (action.type) {
case 'SET_EDITED_POST':
return action.postType;
}
return state;
}
/**
* Reducer returning whether the post blocks match the defined template or not.
*
* @param {Object} state Current state.
* @param {Object} action Dispatched action.
*
* @return {boolean} Updated state.
*/
function template(state = {
isValid: true
}, action) {
switch (action.type) {
case 'SET_TEMPLATE_VALIDITY':
return {
...state,
isValid: action.isValid
};
}
return state;
}
/**
* Reducer returning current network request state (whether a request to
* the WP REST API is in progress, successful, or failed).
*
* @param {Object} state Current state.
* @param {Object} action Dispatched action.
*
* @return {Object} Updated state.
*/
function saving(state = {}, action) {
switch (action.type) {
case 'REQUEST_POST_UPDATE_START':
case 'REQUEST_POST_UPDATE_FINISH':
return {
pending: action.type === 'REQUEST_POST_UPDATE_START',
options: action.options || {}
};
}
return state;
}
/**
* Reducer returning deleting post request state.
*
* @param {Object} state Current state.
* @param {Object} action Dispatched action.
*
* @return {Object} Updated state.
*/
function deleting(state = {}, action) {
switch (action.type) {
case 'REQUEST_POST_DELETE_START':
case 'REQUEST_POST_DELETE_FINISH':
return {
pending: action.type === 'REQUEST_POST_DELETE_START'
};
}
return state;
}
/**
* Post Lock State.
*
* @typedef {Object} PostLockState
*
* @property {boolean} isLocked Whether the post is locked.
* @property {?boolean} isTakeover Whether the post editing has been taken over.
* @property {?boolean} activePostLock Active post lock value.
* @property {?Object} user User that took over the post.
*/
/**
* Reducer returning the post lock status.
*
* @param {PostLockState} state Current state.
* @param {Object} action Dispatched action.
*
* @return {PostLockState} Updated state.
*/
function postLock(state = {
isLocked: false
}, action) {
switch (action.type) {
case 'UPDATE_POST_LOCK':
return action.lock;
}
return state;
}
/**
* Post saving lock.
*
* When post saving is locked, the post cannot be published or updated.
*
* @param {PostLockState} state Current state.
* @param {Object} action Dispatched action.
*
* @return {PostLockState} Updated state.
*/
function postSavingLock(state = {}, action) {
switch (action.type) {
case 'LOCK_POST_SAVING':
return {
...state,
[action.lockName]: true
};
case 'UNLOCK_POST_SAVING':
{
const {
[action.lockName]: removedLockName,
...restState
} = state;
return restState;
}
}
return state;
}
/**
* Post autosaving lock.
*
* When post autosaving is locked, the post will not autosave.
*
* @param {PostLockState} state Current state.
* @param {Object} action Dispatched action.
*
* @return {PostLockState} Updated state.
*/
function postAutosavingLock(state = {}, action) {
switch (action.type) {
case 'LOCK_POST_AUTOSAVING':
return {
...state,
[action.lockName]: true
};
case 'UNLOCK_POST_AUTOSAVING':
{
const {
[action.lockName]: removedLockName,
...restState
} = state;
return restState;
}
}
return state;
}
/**
* Reducer returning the post editor setting.
*
* @param {Object} state Current state.
* @param {Object} action Dispatched action.
*
* @return {Object} Updated state.
*/
function editorSettings(state = _defaults.EDITOR_SETTINGS_DEFAULTS, action) {
switch (action.type) {
case 'UPDATE_EDITOR_SETTINGS':
return {
...state,
...action.settings
};
}
return state;
}
function renderingMode(state = 'post-only', action) {
switch (action.type) {
case 'SET_RENDERING_MODE':
return action.mode;
}
return state;
}
/**
* Reducer returning the editing canvas device type.
*
* @param {Object} state Current state.
* @param {Object} action Dispatched action.
*
* @return {Object} Updated state.
*/
function deviceType(state = 'Desktop', action) {
switch (action.type) {
case 'SET_DEVICE_TYPE':
return action.deviceType;
}
return state;
}
/**
* Reducer storing the list of all programmatically removed panels.
*
* @param {Array} state Current state.
* @param {Object} action Action object.
*
* @return {Array} Updated state.
*/
function removedPanels(state = [], action) {
switch (action.type) {
case 'REMOVE_PANEL':
if (!state.includes(action.panelName)) {
return [...state, action.panelName];
}
}
return state;
}
/**
* Reducer to set the block inserter panel open or closed.
*
* Note: this reducer interacts with the list view panel reducer
* to make sure that only one of the two panels is open at the same time.
*
* @param {Object} state Current state.
* @param {Object} action Dispatched action.
*/
function blockInserterPanel(state = false, action) {
switch (action.type) {
case 'SET_IS_LIST_VIEW_OPENED':
return action.isOpen ? false : state;
case 'SET_IS_INSERTER_OPENED':
return action.value;
}
return state;
}
/**
* Reducer to set the list view panel open or closed.
*
* Note: this reducer interacts with the inserter panel reducer
* to make sure that only one of the two panels is open at the same time.
*
* @param {Object} state Current state.
* @param {Object} action Dispatched action.
*/
function listViewPanel(state = false, action) {
switch (action.type) {
case 'SET_IS_INSERTER_OPENED':
return action.value ? false : state;
case 'SET_IS_LIST_VIEW_OPENED':
return action.isOpen;
}
return state;
}
/**
* This reducer does nothing aside initializing a ref to the list view toggle.
* We will have a unique ref per "editor" instance.
*
* @param {Object} state
* @return {Object} Reference to the list view toggle button.
*/
function listViewToggleRef(state = {
current: null
}) {
return state;
}
/**
* This reducer does nothing aside initializing a ref to the inserter sidebar toggle.
* We will have a unique ref per "editor" instance.
*
* @param {Object} state
* @return {Object} Reference to the inserter sidebar toggle button.
*/
function inserterSidebarToggleRef(state = {
current: null
}) {
return state;
}
function publishSidebarActive(state = false, action) {
switch (action.type) {
case 'OPEN_PUBLISH_SIDEBAR':
return true;
case 'CLOSE_PUBLISH_SIDEBAR':
return false;
case 'TOGGLE_PUBLISH_SIDEBAR':
return !state;
}
return state;
}
var _default = exports.default = (0, _data.combineReducers)({
postId,
postType,
templateId,
saving,
deleting,
postLock,
template,
postSavingLock,
editorSettings,
postAutosavingLock,
renderingMode,
deviceType,
removedPanels,
blockInserterPanel,
inserterSidebarToggleRef,
listViewPanel,
listViewToggleRef,
publishSidebarActive,
dataviews: _reducer.default
});
//# sourceMappingURL=reducer.js.map