@atlaskit/editor-plugin-media
Version:
Media plugin for @atlaskit/editor-core
87 lines • 3.54 kB
JavaScript
import React from 'react';
import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
import { WithProviders } from '@atlaskit/editor-common/provider-factory';
import ReactNodeView from '@atlaskit/editor-common/react-node-view';
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
import { useMediaProvider } from '../ui/hooks/useMediaProvider';
import { MediaGroupNext } from './mediaGroupNext';
const selector = states => {
var _states$editorDisable, _states$editorViewMod;
return {
editorDisabled: (_states$editorDisable = states.editorDisabledState) === null || _states$editorDisable === void 0 ? void 0 : _states$editorDisable.editorDisabled,
editorViewMode: (_states$editorViewMod = states.editorViewModeState) === null || _states$editorViewMod === void 0 ? void 0 : _states$editorViewMod.mode
};
};
function MediaGroupNodeViewInternal({
renderFn,
pluginInjectionApi
}) {
const {
editorDisabled,
editorViewMode
} = useSharedPluginStateWithSelector(pluginInjectionApi, ['editorDisabled', 'editorViewMode'], selector);
const mediaProvider = useMediaProvider(pluginInjectionApi);
return renderFn({
editorDisabled,
editorViewMode,
mediaProvider
});
}
class MediaGroupNodeView extends ReactNodeView {
render(props, forwardRef) {
const {
providerFactory,
mediaOptions,
pluginInjectionApi
} = props;
const getPos = this.getPos;
return /*#__PURE__*/React.createElement(WithProviders
// eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- Ignored via go/ees017 (to be fixed)
, {
providers: ['contextIdentifierProvider'],
providerFactory: providerFactory
// eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- Ignored via go/ees017 (to be fixed)
,
renderNode: ({
contextIdentifierProvider
}) => {
const renderFn = ({
mediaProvider: mediaProviderFromState,
editorDisabled,
editorViewMode
}) => {
const mediaProvider = mediaProviderFromState ? Promise.resolve(mediaProviderFromState) : undefined;
if (!mediaProvider && !expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true)) {
return null;
}
return /*#__PURE__*/React.createElement(MediaGroupNext, {
node: this.node,
getPos: getPos,
view: this.view,
forwardRef: forwardRef,
disabled: editorDisabled,
allowLazyLoading: mediaOptions.allowLazyLoading,
mediaProvider: mediaProvider,
contextIdentifierProvider: contextIdentifierProvider,
isCopyPasteEnabled: mediaOptions.isCopyPasteEnabled,
anchorPos: this.view.state.selection.$anchor.pos,
headPos: this.view.state.selection.$head.pos,
mediaOptions: mediaOptions,
editorViewMode: editorViewMode === 'view'
});
};
return /*#__PURE__*/React.createElement(MediaGroupNodeViewInternal, {
renderFn: renderFn,
pluginInjectionApi: pluginInjectionApi
});
}
});
}
}
export const ReactMediaGroupNode = (portalProviderAPI, eventDispatcher, providerFactory, mediaOptions = {}, pluginInjectionApi) => (node, view, getPos) => {
return new MediaGroupNodeView(node, view, getPos, portalProviderAPI, eventDispatcher, {
providerFactory,
mediaOptions,
pluginInjectionApi
}).init();
};