Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Drop zone: fix media lib duplicate issue #29567

Merged
merged 2 commits into from
Mar 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 12 additions & 14 deletions packages/components/src/drop-zone/provider.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -6,14 +6,10 @@ import { find, some, filter, includes, throttle } from 'lodash';
/** /**
* WordPress dependencies * WordPress dependencies
*/ */
import { import { createContext, useRef, useContext } from '@wordpress/element';
createContext,
useEffect,
useRef,
useContext,
} from '@wordpress/element';
import { getFilesFromDataTransfer } from '@wordpress/dom'; import { getFilesFromDataTransfer } from '@wordpress/dom';
import isShallowEqual from '@wordpress/is-shallow-equal'; import isShallowEqual from '@wordpress/is-shallow-equal';
import { useRefEffect } from '@wordpress/compose';


export const Context = createContext(); export const Context = createContext();


Expand Down Expand Up @@ -109,11 +105,12 @@ export const INITIAL_DROP_ZONE_STATE = {
type: null, type: null,
}; };


export function useDrop( ref ) { export function useDrop() {
const dropZones = useContext( Context ); const dropZones = useContext( Context );


useEffect( () => { return useRefEffect(
const { ownerDocument } = ref.current; ( node ) => {
const { ownerDocument } = node;
const { defaultView } = ownerDocument; const { defaultView } = ownerDocument;


let lastRelative; let lastRelative;
Expand Down Expand Up @@ -223,7 +220,7 @@ export function useDrop( ref ) {
event.preventDefault(); event.preventDefault();
} }


defaultView.addEventListener( 'drop', onDrop ); node.addEventListener( 'drop', onDrop );
defaultView.addEventListener( 'dragover', onDragOver ); defaultView.addEventListener( 'dragover', onDragOver );
defaultView.addEventListener( 'mouseup', resetDragState ); defaultView.addEventListener( 'mouseup', resetDragState );
// Note that `dragend` doesn't fire consistently for file and HTML drag // Note that `dragend` doesn't fire consistently for file and HTML drag
Expand All @@ -232,12 +229,14 @@ export function useDrop( ref ) {
defaultView.addEventListener( 'dragend', resetDragState ); defaultView.addEventListener( 'dragend', resetDragState );


return () => { return () => {
defaultView.removeEventListener( 'drop', onDrop ); node.removeEventListener( 'drop', onDrop );
defaultView.removeEventListener( 'dragover', onDragOver ); defaultView.removeEventListener( 'dragover', onDragOver );
defaultView.removeEventListener( 'mouseup', resetDragState ); defaultView.removeEventListener( 'mouseup', resetDragState );
defaultView.removeEventListener( 'dragend', resetDragState ); defaultView.removeEventListener( 'dragend', resetDragState );
}; };
}, [ ref, dropZones ] ); },
[ dropZones ]
);
} }


export function DropZoneContextProvider( props ) { export function DropZoneContextProvider( props ) {
Expand All @@ -246,8 +245,7 @@ export function DropZoneContextProvider( props ) {
} }


function DropContainer( { children } ) { function DropContainer( { children } ) {
const ref = useRef(); const ref = useDrop();
useDrop( ref );
return ( return (
<div ref={ ref } className="components-drop-zone__provider"> <div ref={ ref } className="components-drop-zone__provider">
{ children } { children }
Expand Down
6 changes: 2 additions & 4 deletions packages/edit-post/src/components/layout/index.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {
InterfaceSkeleton, InterfaceSkeleton,
store as interfaceStore, store as interfaceStore,
} from '@wordpress/interface'; } from '@wordpress/interface';
import { useState, useEffect, useCallback, useRef } from '@wordpress/element'; import { useState, useEffect, useCallback } from '@wordpress/element';
import { close } from '@wordpress/icons'; import { close } from '@wordpress/icons';
import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts'; import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';


Expand Down Expand Up @@ -172,9 +172,7 @@ function Layout( { styles } ) {
}, },
[ entitiesSavedStatesCallback ] [ entitiesSavedStatesCallback ]
); );
const ref = useRef(); const ref = useDrop( ref );

useDrop( ref );
const [ inserterDialogRef, inserterDialogProps ] = useDialog( { const [ inserterDialogRef, inserterDialogProps ] = useDialog( {
onClose: () => setIsInserterOpened( false ), onClose: () => setIsInserterOpened( false ),
} ); } );
Expand Down