@atlaskit/editor-plugin-media
Version:
Media plugin for @atlaskit/editor-core
56 lines • 1.58 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 mediaPos = tr.selection.$from.pos + 1;
const node = tr.doc.nodeAt(mediaPos);
if (!node || node.type.name !== 'media') {
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 {
createCommand: createMediaLinkingCommand,
getPluginState: getMediaLinkingState
} = mediaLinkingPluginFactory;
export default (dispatch => new SafePlugin({
key: mediaLinkingPluginKey,
state: mediaLinkingPluginFactory.createPluginState(dispatch, initialState)
}));