@atlaskit/editor-plugin-media
Version:
Media plugin for @atlaskit/editor-core
55 lines • 1.71 kB
JavaScript
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
import { pluginFactory } from '@atlaskit/editor-common/utils';
import { NodeSelection, PluginKey } from '@atlaskit/editor-prosemirror/state';
import reducer from './reducer';
export const mediaLinkingPluginKey = new PluginKey('mediaLinking');
const initialState = {
visible: false,
editable: false,
mediaPos: null,
link: ''
};
function mapping(tr, pluginState) {
if (pluginState && pluginState.mediaPos !== null) {
return {
...pluginState,
mediaPos: tr.mapping.map(pluginState.mediaPos)
};
}
return pluginState;
}
function onSelectionChanged(tr) {
const isNodeSelection = tr.selection instanceof NodeSelection;
if (!isNodeSelection) {
return initialState;
}
const pos = tr.selection.$from.pos;
const mediaPos = tr.selection.node.type.name === 'mediaInline' ? pos : pos + 1;
const node = tr.doc.nodeAt(mediaPos);
if (!node || !['media', 'mediaInline'].includes(node.type.name)) {
return initialState;
}
const mark = node.marks.find(mark => mark.type.name === 'link');
if (mark) {
return {
...initialState,
mediaPos,
editable: true,
link: mark.attrs.href
};
}
return {
...initialState,
mediaPos
};
}
const mediaLinkingPluginFactory = pluginFactory(mediaLinkingPluginKey, reducer, {
mapping,
onSelectionChanged
});
export const createMediaLinkingCommand = mediaLinkingPluginFactory.createCommand;
export const getMediaLinkingState = mediaLinkingPluginFactory.getPluginState;
export default (dispatch => new SafePlugin({
key: mediaLinkingPluginKey,
state: mediaLinkingPluginFactory.createPluginState(dispatch, initialState)
}));