@@ -18,14 +18,15 @@ import React, {
1818 ComponentProps ,
1919 Dispatch ,
2020 ReactNode ,
21+ RefCallback ,
2122 SetStateAction ,
2223 useCallback ,
2324 useEffect ,
2425 useLayoutEffect ,
2526 useRef ,
2627 useState ,
2728} from "react" ;
28- import { DragDropContext , Draggable , Droppable } from "react-beautiful-dnd" ;
29+ import { DragDropContext , Draggable , Droppable , DroppableProvidedProps } from "react-beautiful-dnd" ;
2930import classNames from "classnames" ;
3031import { Room } from "matrix-js-sdk/src/models/room" ;
3132
@@ -87,12 +88,6 @@ const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => {
8788 return [ invites , metaSpaces , actualSpaces , activeSpace ] ;
8889} ;
8990
90- interface IInnerSpacePanelProps {
91- children ?: ReactNode ;
92- isPanelCollapsed : boolean ;
93- setPanelCollapsed : Dispatch < SetStateAction < boolean > > ;
94- }
95-
9691export const HomeButtonContextMenu = ( {
9792 onFinished,
9893 hideHeader,
@@ -260,8 +255,23 @@ const metaSpaceComponentMap: Record<MetaSpace, typeof HomeButton> = {
260255 [ MetaSpace . Orphans ] : OrphansButton ,
261256} ;
262257
258+ interface IInnerSpacePanelProps extends DroppableProvidedProps {
259+ children ?: ReactNode ;
260+ isPanelCollapsed : boolean ;
261+ setPanelCollapsed : Dispatch < SetStateAction < boolean > > ;
262+ isDraggingOver : boolean ;
263+ innerRef : RefCallback < HTMLElement > ;
264+ }
265+
263266// Optimisation based on https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/droppable.md#recommended-droppable--performance-optimisation
264- const InnerSpacePanel = React . memo < IInnerSpacePanelProps > ( ( { children, isPanelCollapsed, setPanelCollapsed } ) => {
267+ const InnerSpacePanel = React . memo < IInnerSpacePanelProps > ( ( {
268+ children,
269+ isPanelCollapsed,
270+ setPanelCollapsed,
271+ isDraggingOver,
272+ innerRef,
273+ ...props
274+ } ) => {
265275 const [ invites , metaSpaces , actualSpaces , activeSpace ] = useSpaces ( ) ;
266276 const activeSpaces = activeSpace ? [ activeSpace ] : [ ] ;
267277
@@ -270,7 +280,14 @@ const InnerSpacePanel = React.memo<IInnerSpacePanelProps>(({ children, isPanelCo
270280 return < Component key = { key } selected = { activeSpace === key } isPanelCollapsed = { isPanelCollapsed } /> ;
271281 } ) ;
272282
273- return < div className = "mx_SpaceTreeLevel" >
283+ return < IndicatorScrollbar
284+ { ...props }
285+ wrappedRef = { innerRef }
286+ className = "mx_SpaceTreeLevel"
287+ style = { isDraggingOver ? {
288+ pointerEvents : "none" ,
289+ } : undefined }
290+ >
274291 { metaSpacesSection }
275292 { invites . map ( s => (
276293 < SpaceItem
@@ -300,7 +317,7 @@ const InnerSpacePanel = React.memo<IInnerSpacePanelProps>(({ children, isPanelCo
300317 ) ) }
301318 { children }
302319 < CreateSpaceButton isPanelCollapsed = { isPanelCollapsed } setPanelCollapsed = { setPanelCollapsed } />
303- </ div > ;
320+ </ IndicatorScrollbar > ;
304321} ) ;
305322
306323const SpacePanel = ( ) => {
@@ -352,21 +369,15 @@ const SpacePanel = () => {
352369 </ UserMenu >
353370 < Droppable droppableId = "top-level-spaces" >
354371 { ( provided , snapshot ) => (
355- < IndicatorScrollbar
372+ < InnerSpacePanel
356373 { ...provided . droppableProps }
357- wrappedRef = { provided . innerRef }
358- className = "mx_SpacePanel_spaceTreeWrapper"
359- style = { snapshot . isDraggingOver ? {
360- pointerEvents : "none" ,
361- } : undefined }
374+ isPanelCollapsed = { isPanelCollapsed }
375+ setPanelCollapsed = { setPanelCollapsed }
376+ isDraggingOver = { snapshot . isDraggingOver }
377+ innerRef = { provided . innerRef }
362378 >
363- < InnerSpacePanel
364- isPanelCollapsed = { isPanelCollapsed }
365- setPanelCollapsed = { setPanelCollapsed }
366- >
367- { provided . placeholder }
368- </ InnerSpacePanel >
369- </ IndicatorScrollbar >
379+ { provided . placeholder }
380+ </ InnerSpacePanel >
370381 ) }
371382 </ Droppable >
372383
0 commit comments