@atlaskit/editor-plugin-code-block
Version:
Code block plugin for @atlaskit/editor-core
82 lines • 2.75 kB
JavaScript
import { ACTIONS } from '../../pm-plugins/actions';
export const mapPendingFormats = (pendingFormats, tr, newState) => {
const entries = Object.entries(pendingFormats);
if (entries.length === 0) {
return pendingFormats;
}
let nextPendingFormats = pendingFormats;
entries.forEach(([localId, pendingFormat]) => {
const {
deleted,
pos
} = tr.mapping.mapResult(pendingFormat.pos, 1);
const codeBlockNode = newState.doc.nodeAt(pos);
const shouldRemovePendingFormat = deleted || (codeBlockNode === null || codeBlockNode === void 0 ? void 0 : codeBlockNode.type) !== newState.schema.nodes.codeBlock || (codeBlockNode === null || codeBlockNode === void 0 ? void 0 : codeBlockNode.attrs.localId) !== localId;
const shouldUpdatePendingFormat = pos !== pendingFormat.pos;
if (shouldRemovePendingFormat || shouldUpdatePendingFormat) {
if (nextPendingFormats === pendingFormats) {
nextPendingFormats = {
...pendingFormats
};
}
}
if (shouldRemovePendingFormat) {
delete nextPendingFormats[localId];
return;
}
if (shouldUpdatePendingFormat) {
nextPendingFormats[localId] = {
...pendingFormat,
pos
};
}
});
return nextPendingFormats;
};
function removeRecordEntry(record, key) {
const nextRecord = {
...record
};
delete nextRecord[key];
return nextRecord;
}
export const applyFormatCodeMeta = (pluginState, meta) => {
switch (meta === null || meta === void 0 ? void 0 : meta.type) {
case ACTIONS.START_FORMAT_CODE:
return {
...pluginState,
pendingFormats: {
...pluginState.pendingFormats,
[meta.data.localId]: {
languageSource: meta.data.languageSource,
pos: meta.data.pos,
requestId: meta.data.requestId
}
}
};
case ACTIONS.RESOLVE_FORMAT_CODE:
{
const pendingFormats = removeRecordEntry(pluginState.pendingFormats, meta.data.localId);
const formatCodeErrors = removeRecordEntry(pluginState.formatCodeErrors, meta.data.localId);
return {
...pluginState,
formatCodeErrors: meta.data.outcome === 'failed' ? {
...formatCodeErrors,
[meta.data.localId]: {
errorType: meta.data.errorType,
localId: meta.data.localId,
languageSource: meta.data.languageSource
}
} : formatCodeErrors,
pendingFormats
};
}
case ACTIONS.CLEAR_FORMAT_CODE_ERROR:
return {
...pluginState,
formatCodeErrors: removeRecordEntry(pluginState.formatCodeErrors, meta.data.localId)
};
default:
return pluginState;
}
};