UNPKG

@atlaskit/editor-plugin-media

Version:

Media plugin for @atlaskit/editor-core

114 lines (113 loc) • 4.91 kB
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 }));