@atlaskit/editor-plugin-media
Version:
Media plugin for @atlaskit/editor-core
114 lines (113 loc) • 4.91 kB
JavaScript
import React, { useCallback, useEffect } from 'react';
import { findOverflowScrollParent } from '@atlaskit/editor-common/Popup/utils';
import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/useSharedPluginStateWithSelector';
import { DropzoneLoader as Dropzone } from '@atlaskit/media-picker/dropzone';
import { exposeMediaDropPosition, isMediaDropPositionEnabled } from '../../pm-plugins/media-drop-position-experiment';
import PickerFacadeProvider from './PickerFacadeProvider';
const selector = states => {
var _states$mediaState, _states$mediaState2, _states$mediaState3, _states$mediaState4, _states$mediaState5;
return {
options: (_states$mediaState = states.mediaState) === null || _states$mediaState === void 0 ? void 0 : _states$mediaState.options,
handleDrag: (_states$mediaState2 = states.mediaState) === null || _states$mediaState2 === void 0 ? void 0 : _states$mediaState2.handleDrag,
handleDragOver: (_states$mediaState3 = states.mediaState) === null || _states$mediaState3 === void 0 ? void 0 : _states$mediaState3.handleDragOver,
handleDrop: (_states$mediaState4 = states.mediaState) === null || _states$mediaState4 === void 0 ? void 0 : _states$mediaState4.handleDrop,
dropTargets: (_states$mediaState5 = states.mediaState) === null || _states$mediaState5 === void 0 ? void 0 : _states$mediaState5.dropTargets
};
};
const DropzoneWrapperInternal = ({
api,
isActive,
featureFlags,
editorDomElement,
appearance,
mediaClientConfig,
config,
pickerFacadeInstance
}) => {
const {
options,
handleDrag,
handleDragOver,
handleDrop,
dropTargets
} = useSharedPluginStateWithSelector(api, ['media'], selector);
const usePointerPosition = isMediaDropPositionEnabled();
/** The mounted dropzone invokes this only for accepted external file drags and drops. */
const enrolInMediaDropExperiment = useCallback(() => {
exposeMediaDropPosition();
}, []);
const handleDragEnter = useCallback(() => {
enrolInMediaDropExperiment();
handleDrag === null || handleDrag === void 0 ? void 0 : handleDrag('enter');
}, [enrolInMediaDropExperiment, handleDrag]);
const handleError = useCallback(payload => {
dropTargets === null || dropTargets === void 0 ? void 0 : dropTargets.inserted(payload.fileId);
pickerFacadeInstance.handleUploadError(payload);
}, [dropTargets, pickerFacadeInstance]);
const handleUploadsStart = useCallback(({
files,
traceContext
}) => {
if (traceContext) {
dropTargets === null || dropTargets === void 0 ? void 0 : dropTargets.register(traceContext.traceId, files.map(file => file.id));
}
}, [dropTargets]);
const {
customDropzoneContainer
} = options || {};
// Ignored via go/ees005
// eslint-disable-next-line @atlaskit/editor/no-as-casting
const editorHtmlElement = editorDomElement;
const scrollParent = appearance === 'full-page' && findOverflowScrollParent(editorHtmlElement);
const container = customDropzoneContainer || (scrollParent ? scrollParent : editorHtmlElement);
/** Clears a stale hover indicator when the dropzone is removed or replaced mid-drag. */
useEffect(() => {
if (!usePointerPosition || !isActive) {
return;
}
return () => handleDrag === null || handleDrag === void 0 ? void 0 : handleDrag('leave');
}, [container, handleDrag, isActive, usePointerPosition]);
const dropzoneConfig = {
...config,
container
};
return isActive ? /*#__PURE__*/React.createElement(Dropzone, {
mediaClientConfig: mediaClientConfig,
config: dropzoneConfig,
onDragOver: usePointerPosition ? handleDragOver : undefined,
onDrop: enrolInMediaDropExperiment,
onDropWithContext: usePointerPosition ? handleDrop : undefined,
onUploadsStart: usePointerPosition ? handleUploadsStart : undefined,
onError: usePointerPosition ? handleError : pickerFacadeInstance.handleUploadError,
onPreviewUpdate: pickerFacadeInstance.handleUploadPreviewUpdate,
onEnd: pickerFacadeInstance.handleReady,
onDragEnter: handleDragEnter
// eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- Ignored via go/ees017 (to be fixed)
,
onDragLeave: () => handleDrag === null || handleDrag === void 0 ? void 0 : handleDrag('leave'),
featureFlags: featureFlags
}) : null;
};
export const DropzoneWrapper = ({
api,
isActive,
featureFlags,
editorDomElement,
appearance
}) => /*#__PURE__*/React.createElement(PickerFacadeProvider, {
api: api,
analyticsName: "dropzone"
}, ({
mediaClientConfig,
config,
pickerFacadeInstance
}) => /*#__PURE__*/React.createElement(DropzoneWrapperInternal, {
api: api,
isActive: isActive,
featureFlags: featureFlags,
editorDomElement: editorDomElement,
appearance: appearance,
mediaClientConfig: mediaClientConfig,
config: config,
pickerFacadeInstance: pickerFacadeInstance
}));