2021-02-26 10:23:09 +00:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
Copyright 2021, 2022 The Matrix.org Foundation C.I.C.
2021-02-26 10:23:09 +00:00
2025-01-06 11:18:54 +00:00
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2021-02-26 10:23:09 +00:00
*/
2021-08-17 17:59:26 +02:00
import React , {
2025-02-05 13:25:06 +00:00
type ComponentProps ,
type Dispatch ,
type ReactNode ,
type RefCallback ,
type SetStateAction ,
2021-12-17 11:02:06 +00:00
useCallback ,
2021-08-17 17:59:26 +02:00
useEffect ,
useLayoutEffect ,
useRef ,
useState ,
} from "react" ;
2025-02-05 13:25:06 +00:00
import { DragDropContext , Draggable , Droppable , type DroppableProvidedProps } from "react-beautiful-dnd" ;
2021-02-26 10:23:09 +00:00
import classNames from "classnames" ;
2025-02-05 13:25:06 +00:00
import { type Room } from "matrix-js-sdk/src/matrix" ;
2021-02-26 10:23:09 +00:00
2021-06-16 09:44:37 +01:00
import { _t } from "../../../languageHandler" ;
import { useContextMenu } from "../../structures/ContextMenu" ;
2021-03-01 17:27:09 +00:00
import SpaceCreateMenu from "./SpaceCreateMenu" ;
2021-07-28 17:40:33 +01:00
import { SpaceButton , SpaceItem } from "./SpaceTreeLevel" ;
2021-12-17 11:02:06 +00:00
import { useEventEmitter , useEventEmitterState } from "../../../hooks/useEventEmitter" ;
2021-11-11 13:07:41 +00:00
import SpaceStore from "../../../stores/spaces/SpaceStore" ;
import {
2021-11-30 18:08:46 +00:00
getMetaSpaceName ,
2021-11-11 13:07:41 +00:00
MetaSpace ,
2025-02-05 13:25:06 +00:00
type SpaceKey ,
2021-07-28 17:40:33 +01:00
UPDATE_HOME_BEHAVIOUR ,
2021-04-22 11:01:49 +01:00
UPDATE_INVITED_SPACES ,
UPDATE_SELECTED_SPACE ,
UPDATE_TOP_LEVEL_SPACES ,
2021-11-11 13:07:41 +00:00
} from "../../../stores/spaces" ;
2021-07-28 17:40:33 +01:00
import { RovingTabIndexProvider } from "../../../accessibility/RovingTabIndex" ;
2021-12-17 11:02:06 +00:00
import {
RoomNotificationStateStore ,
UPDATE_STATUS_INDICATOR ,
} from "../../../stores/notifications/RoomNotificationStateStore" ;
2025-02-05 13:25:06 +00:00
import type SpaceContextMenu from "../context_menus/SpaceContextMenu" ;
2021-07-28 17:40:33 +01:00
import IconizedContextMenu , {
IconizedContextMenuCheckbox ,
IconizedContextMenuOptionList ,
} from "../context_menus/IconizedContextMenu" ;
import SettingsStore from "../../../settings/SettingsStore" ;
import { SettingLevel } from "../../../settings/SettingLevel" ;
2021-08-13 18:12:02 +02:00
import UIStore from "../../../stores/UIStore" ;
2021-11-26 15:41:04 +00:00
import QuickSettingsButton from "./QuickSettingsButton" ;
import { useSettingValue } from "../../../hooks/useSettings" ;
2021-11-30 18:08:46 +00:00
import UserMenu from "../../structures/UserMenu" ;
2021-12-01 10:51:54 +00:00
import IndicatorScrollbar from "../../structures/IndicatorScrollbar" ;
2021-12-07 09:32:00 +00:00
import { useDispatcher } from "../../../hooks/useDispatcher" ;
import defaultDispatcher from "../../../dispatcher/dispatcher" ;
2025-02-05 13:25:06 +00:00
import { type ActionPayload } from "../../../dispatcher/payloads" ;
2021-12-07 09:32:00 +00:00
import { Action } from "../../../dispatcher/actions" ;
2025-02-05 13:25:06 +00:00
import { type NotificationState } from "../../../stores/notifications/NotificationState" ;
2024-07-17 15:46:45 +02:00
import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts" ;
import { getKeyBindingsManager } from "../../../KeyBindingsManager" ;
2022-02-09 17:21:40 +01:00
import { shouldShowComponent } from "../../../customisations/helpers/UIComponents" ;
import { UIComponent } from "../../../settings/UIFeature" ;
2024-02-07 14:49:40 +01:00
import { ThreadsActivityCentre } from "./threads-activity-centre/" ;
2024-05-03 16:07:11 +02:00
import AccessibleButton from "../elements/AccessibleButton" ;
2024-07-17 15:46:45 +02:00
import { Landmark , LandmarkNavigation } from "../../../accessibility/LandmarkNavigation" ;
2024-05-15 11:44:17 +02:00
import { KeyboardShortcut } from "../settings/KeyboardShortcut" ;
2021-02-26 10:23:09 +00:00
2021-11-11 13:07:41 +00:00
const useSpaces = () : [ Room [], MetaSpace [], Room [], SpaceKey ] => {
2021-07-28 17:39:56 +01:00
const invites = useEventEmitterState < Room [] >( SpaceStore . instance , UPDATE_INVITED_SPACES , () => {
return SpaceStore . instance . invitedSpaces ;
});
2021-11-11 13:07:41 +00:00
const [ metaSpaces , actualSpaces ] = useEventEmitterState < [ MetaSpace [], Room []] > (
SpaceStore . instance ,
UPDATE_TOP_LEVEL_SPACES ,
() => [ SpaceStore . instance . enabledMetaSpaces , SpaceStore . instance . spacePanelSpaces ],
);
const activeSpace = useEventEmitterState < SpaceKey >( SpaceStore . instance , UPDATE_SELECTED_SPACE , () => {
2021-07-28 17:39:56 +01:00
return SpaceStore . instance . activeSpace ;
});
2021-11-11 13:07:41 +00:00
return [ invites , metaSpaces , actualSpaces , activeSpace ];
2021-02-26 10:23:09 +00:00
};
2023-01-12 13:25:14 +00:00
export const HomeButtonContextMenu : React.FC < ComponentProps < typeof SpaceContextMenu >> = ({
2021-11-30 18:08:46 +00:00
onFinished ,
hideHeader ,
... props
2023-01-12 13:25:14 +00:00
}) => {
2024-12-23 20:25:15 +00:00
const allRoomsInHome = useSettingValue ( "Spaces.allRoomsInHome" );
2021-07-28 17:40:33 +01:00
return (
< IconizedContextMenu { ...props } onFinished = { onFinished } className = "mx_SpacePanel_contextMenu" compact >
2023-08-23 10:25:33 +01:00
{ ! hideHeader && < div className = "mx_SpacePanel_contextMenu_header" >{ _t ( "common|home" )}</ div >}
2021-07-28 17:40:33 +01:00
< IconizedContextMenuOptionList first >
< IconizedContextMenuCheckbox
2021-07-28 19:33:07 +01:00
iconClassName = "mx_SpacePanel_noIcon"
2023-09-26 13:04:17 +01:00
label = { _t ( "settings|sidebar|metaspaces_home_all_rooms" )}
2021-07-28 17:40:33 +01:00
active = { allRoomsInHome }
onClick = {() => {
2023-09-22 03:46:47 +05:30
onFinished ();
2021-07-30 12:20:02 +01:00
SettingsStore . setValue ( "Spaces.allRoomsInHome" , null , SettingLevel . ACCOUNT , ! allRoomsInHome );
2021-07-28 17:40:33 +01:00
}}
/>
</ IconizedContextMenuOptionList >
</ IconizedContextMenu >
);
};
2021-11-11 13:07:41 +00:00
interface IMetaSpaceButtonProps extends ComponentProps < typeof SpaceButton > {
2021-07-28 17:40:33 +01:00
selected : boolean ;
isPanelCollapsed : boolean ;
}
2021-11-11 13:07:41 +00:00
type MetaSpaceButtonProps = Pick < IMetaSpaceButtonProps , "selected" | "isPanelCollapsed" >;
2021-07-28 17:40:33 +01:00
2023-08-24 04:48:35 +01:00
const MetaSpaceButton : React.FC < IMetaSpaceButtonProps > = ({ selected , isPanelCollapsed , size = "32px" , ... props }) => {
2021-08-09 14:01:34 +01:00
return (
< li
className = { classNames ( "mx_SpaceItem" , {
collapsed : isPanelCollapsed ,
})}
role = "treeitem"
2022-08-10 13:14:54 +01:00
aria-selected = { selected }
2021-08-09 14:01:34 +01:00
>
2023-08-24 04:48:35 +01:00
< SpaceButton { ...props } selected = { selected } isNarrow = { isPanelCollapsed } size = { size } />
2021-07-28 17:40:33 +01:00
</ li >
);
};
2021-12-17 11:02:06 +00:00
const getHomeNotificationState = () : NotificationState => {
return SpaceStore . instance . allRoomsInHome
? RoomNotificationStateStore.instance.globalState
: SpaceStore.instance.getNotificationState ( MetaSpace . Home );
};
2023-01-12 13:25:14 +00:00
const HomeButton : React.FC < MetaSpaceButtonProps > = ({ selected , isPanelCollapsed }) => {
2021-11-11 13:07:41 +00:00
const allRoomsInHome = useEventEmitterState ( SpaceStore . instance , UPDATE_HOME_BEHAVIOUR , () => {
return SpaceStore . instance . allRoomsInHome ;
});
2021-12-17 11:02:06 +00:00
const [ notificationState , setNotificationState ] = useState ( getHomeNotificationState ());
const updateNotificationState = useCallback (() => {
setNotificationState ( getHomeNotificationState ());
}, []);
useEffect ( updateNotificationState , [ updateNotificationState , allRoomsInHome ]);
useEventEmitter ( RoomNotificationStateStore . instance , UPDATE_STATUS_INDICATOR , updateNotificationState );
2021-11-11 13:07:41 +00:00
return (
< MetaSpaceButton
spaceKey = { MetaSpace . Home }
className = "mx_SpaceButton_home"
selected = { selected }
isPanelCollapsed = { isPanelCollapsed }
2021-11-30 18:08:46 +00:00
label = { getMetaSpaceName ( MetaSpace . Home , allRoomsInHome )}
2021-12-17 11:02:06 +00:00
notificationState = { notificationState }
2021-11-11 13:07:41 +00:00
ContextMenuComponent = { HomeButtonContextMenu }
2023-08-23 10:25:33 +01:00
contextMenuTooltip = { _t ( "common|options" )}
2023-08-24 04:48:35 +01:00
size = "32px"
2021-11-11 13:07:41 +00:00
/>
);
};
2023-01-12 13:25:14 +00:00
const FavouritesButton : React.FC < MetaSpaceButtonProps > = ({ selected , isPanelCollapsed }) => {
2021-11-11 13:07:41 +00:00
return (
< MetaSpaceButton
spaceKey = { MetaSpace . Favourites }
className = "mx_SpaceButton_favourites"
selected = { selected }
isPanelCollapsed = { isPanelCollapsed }
2021-11-30 18:08:46 +00:00
label = { getMetaSpaceName ( MetaSpace . Favourites )}
2021-11-11 13:07:41 +00:00
notificationState = { SpaceStore . instance . getNotificationState ( MetaSpace . Favourites )}
2023-08-24 04:48:35 +01:00
size = "32px"
2021-11-11 13:07:41 +00:00
/>
);
};
2023-01-12 13:25:14 +00:00
const PeopleButton : React.FC < MetaSpaceButtonProps > = ({ selected , isPanelCollapsed }) => {
2021-11-11 13:07:41 +00:00
return (
< MetaSpaceButton
spaceKey = { MetaSpace . People }
className = "mx_SpaceButton_people"
selected = { selected }
isPanelCollapsed = { isPanelCollapsed }
2021-11-30 18:08:46 +00:00
label = { getMetaSpaceName ( MetaSpace . People )}
2021-11-11 13:07:41 +00:00
notificationState = { SpaceStore . instance . getNotificationState ( MetaSpace . People )}
2023-08-24 04:48:35 +01:00
size = "32px"
2021-11-11 13:07:41 +00:00
/>
);
};
2023-01-12 13:25:14 +00:00
const OrphansButton : React.FC < MetaSpaceButtonProps > = ({ selected , isPanelCollapsed }) => {
2021-11-11 13:07:41 +00:00
return (
< MetaSpaceButton
spaceKey = { MetaSpace . Orphans }
className = "mx_SpaceButton_orphans"
selected = { selected }
isPanelCollapsed = { isPanelCollapsed }
2021-11-30 18:08:46 +00:00
label = { getMetaSpaceName ( MetaSpace . Orphans )}
2021-11-11 13:07:41 +00:00
notificationState = { SpaceStore . instance . getNotificationState ( MetaSpace . Orphans )}
2023-08-24 04:48:35 +01:00
size = "32px"
2021-11-11 13:07:41 +00:00
/>
);
};
2024-03-25 19:35:31 +01:00
const VideoRoomsButton : React.FC < MetaSpaceButtonProps > = ({ selected , isPanelCollapsed }) => {
return (
< MetaSpaceButton
spaceKey = { MetaSpace . VideoRooms }
className = "mx_SpaceButton_videoRooms"
selected = { selected }
isPanelCollapsed = { isPanelCollapsed }
label = { getMetaSpaceName ( MetaSpace . VideoRooms )}
notificationState = { SpaceStore . instance . getNotificationState ( MetaSpace . VideoRooms )}
size = "32px"
/>
);
};
2023-01-12 13:25:14 +00:00
const CreateSpaceButton : React.FC < Pick < IInnerSpacePanelProps , "isPanelCollapsed" | "setPanelCollapsed" >> = ({
2021-07-28 17:40:33 +01:00
isPanelCollapsed ,
setPanelCollapsed ,
2023-01-12 13:25:14 +00:00
}) => {
2024-12-06 17:49:32 +00:00
const [ menuDisplayed , handle , openMenu , closeMenu ] = useContextMenu < HTMLDivElement >();
2021-07-28 17:40:33 +01:00
useEffect (() => {
if ( ! isPanelCollapsed && menuDisplayed ) {
closeMenu ();
}
}, [ isPanelCollapsed ]); // eslint-disable-line react-hooks/exhaustive-deps
2023-02-16 17:21:44 +00:00
let contextMenu : JSX.Element | undefined ;
2021-07-28 17:40:33 +01:00
if ( menuDisplayed ) {
contextMenu = < SpaceCreateMenu onFinished = { closeMenu } />;
}
const onNewClick = menuDisplayed
? closeMenu
: () => {
if ( ! isPanelCollapsed ) setPanelCollapsed ( true );
openMenu ();
};
2021-08-09 14:01:34 +01:00
return (
< li
2021-08-12 12:05:55 +01:00
className = { classNames ( "mx_SpaceItem mx_SpaceItem_new" , {
2021-08-09 14:01:34 +01:00
collapsed : isPanelCollapsed ,
2021-07-28 17:40:33 +01:00
})}
2021-08-09 14:01:34 +01:00
role = "treeitem"
2023-03-01 09:12:14 +00:00
aria-selected = { false }
2022-12-12 12:24:14 +01:00
>
2021-07-28 17:40:33 +01:00
< SpaceButton
2022-10-17 17:42:04 +01:00
data-testid = "create-space-button"
2021-07-28 17:40:33 +01:00
className = { classNames ( "mx_SpaceButton_new" , {
mx_SpaceButton_newCancel : menuDisplayed ,
2022-12-12 12:24:14 +01:00
})}
2023-09-26 13:04:17 +01:00
label = { menuDisplayed ? _t ( "action|cancel" ) : _t ( "create_space|label" )}
2021-07-28 17:40:33 +01:00
onClick = { onNewClick }
isNarrow = { isPanelCollapsed }
2023-07-07 13:37:26 +01:00
innerRef = { handle }
2023-08-24 04:48:35 +01:00
size = "32px"
2021-07-28 17:40:33 +01:00
/>
{ contextMenu }
</ li >
);
};
2021-11-11 13:07:41 +00:00
const metaSpaceComponentMap : Record < MetaSpace , typeof HomeButton > = {
[ MetaSpace . Home ] : HomeButton ,
[ MetaSpace . Favourites ] : FavouritesButton ,
[ MetaSpace . People ] : PeopleButton ,
[ MetaSpace . Orphans ] : OrphansButton ,
2024-03-25 19:35:31 +01:00
[ MetaSpace . VideoRooms ] : VideoRoomsButton ,
2021-11-11 13:07:41 +00:00
};
2022-01-27 09:36:58 +00:00
interface IInnerSpacePanelProps extends DroppableProvidedProps {
children? : ReactNode ;
isPanelCollapsed : boolean ;
setPanelCollapsed : Dispatch < SetStateAction < boolean >>;
isDraggingOver : boolean ;
innerRef : RefCallback < HTMLElement >;
}
2021-06-16 09:44:37 +01:00
// Optimisation based on https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/droppable.md#recommended-droppable--performance-optimisation
2022-01-27 09:36:58 +00:00
const InnerSpacePanel = React . memo < IInnerSpacePanelProps >(
({ children , isPanelCollapsed , setPanelCollapsed , isDraggingOver , innerRef , ... props }) => {
2021-11-11 13:07:41 +00:00
const [ invites , metaSpaces , actualSpaces , activeSpace ] = useSpaces ();
2021-06-16 09:44:37 +01:00
const activeSpaces = activeSpace ? [ activeSpace ] : [];
2024-03-25 19:35:31 +01:00
const metaSpacesSection = metaSpaces
. filter (( key ) => ! ( key === MetaSpace . VideoRooms && ! SettingsStore . getValue ( "feature_video_rooms" )))
. map (( key ) => {
const Component = metaSpaceComponentMap [ key ];
return < Component key = { key } selected = { activeSpace === key } isPanelCollapsed = { isPanelCollapsed } />;
});
2021-11-11 13:07:41 +00:00
2022-01-27 09:36:58 +00:00
return (
< IndicatorScrollbar
{ ...props }
wrappedRef = { innerRef }
className = "mx_SpaceTreeLevel"
style = {
isDraggingOver
? {
pointerEvents : "none" ,
}
: undefined
}
2022-08-10 13:14:54 +01:00
element = "ul"
role = "tree"
2023-09-26 13:04:17 +01:00
aria-label = { _t ( "common|spaces" )}
2022-01-27 09:36:58 +00:00
>
2021-06-16 09:44:37 +01:00
{ metaSpacesSection }
2021-11-11 13:07:41 +00:00
{ invites . map (( s ) => (
2021-06-16 09:44:37 +01:00
< SpaceItem
key = { s . roomId }
space = { s }
activeSpaces = { activeSpaces }
isPanelCollapsed = { isPanelCollapsed }
onExpand = {() => setPanelCollapsed ( false )}
/>
2021-07-19 22:43:11 +01:00
))}
{ actualSpaces . map (( s , i ) => (
2021-06-16 09:44:37 +01:00
< Draggable key = { s . roomId } draggableId = { s . roomId } index = { i }>
2021-07-19 22:43:11 +01:00
{( provided , snapshot ) => (
2021-06-16 09:44:37 +01:00
< SpaceItem
{ ...provided.draggableProps }
2021-09-06 08:54:08 +01:00
dragHandleProps = { provided . dragHandleProps }
2021-06-16 09:44:37 +01:00
key = { s . roomId }
innerRef = { provided . innerRef }
2021-09-06 08:54:08 +01:00
className = { snapshot . isDragging ? "mx_SpaceItem_dragging" : undefined }
2021-06-16 09:44:37 +01:00
space = { s }
activeSpaces = { activeSpaces }
isPanelCollapsed = { isPanelCollapsed }
onExpand = {() => setPanelCollapsed ( false )}
2022-12-12 12:24:14 +01:00
/>
)}
2021-06-16 09:44:37 +01:00
</ Draggable >
))}
{ children }
2022-02-09 17:21:40 +01:00
{ shouldShowComponent ( UIComponent . CreateSpaces ) && (
< CreateSpaceButton isPanelCollapsed = { isPanelCollapsed } setPanelCollapsed = { setPanelCollapsed } />
)}
2022-01-27 09:36:58 +00:00
</ IndicatorScrollbar >
);
2021-06-16 09:44:37 +01:00
},
);
2023-01-12 13:25:14 +00:00
const SpacePanel : React.FC = () => {
2023-05-17 15:18:21 +01:00
const [ dragging , setDragging ] = useState ( false );
2021-02-26 10:23:09 +00:00
const [ isPanelCollapsed , setPanelCollapsed ] = useState ( true );
2023-04-17 09:25:00 +01:00
const ref = useRef < HTMLDivElement >( null );
2021-08-13 18:12:02 +02:00
useLayoutEffect (() => {
2023-04-17 09:25:00 +01:00
if ( ref . current ) UIStore . instance . trackElementDimensions ( "SpacePanel" , ref . current );
2021-08-13 18:12:02 +02:00
return () => UIStore . instance . stopTrackingElementDimensions ( "SpacePanel" );
}, []);
2021-02-26 10:23:09 +00:00
2021-12-07 09:32:00 +00:00
useDispatcher ( defaultDispatcher , ( payload : ActionPayload ) => {
if ( payload . action === Action . ToggleSpacePanel ) {
setPanelCollapsed ( ! isPanelCollapsed );
}
});
2021-06-03 08:32:36 +01:00
return (
2023-05-17 15:18:21 +01:00
< RovingTabIndexProvider handleHomeEnd handleUpDown = { ! dragging }>
{({ onKeyDownHandler , onDragEndHandler }) => (
< DragDropContext
onDragStart = {() => {
setDragging ( true );
}}
onDragEnd = {( result ) => {
setDragging ( false );
if ( ! result . destination ) return ; // dropped outside the list
SpaceStore . instance . moveRootSpace ( result . source . index , result . destination . index );
onDragEndHandler ();
}}
>
2023-12-20 15:32:24 +00:00
< nav
2021-06-03 08:32:36 +01:00
className = { classNames ( "mx_SpacePanel" , { collapsed : isPanelCollapsed })}
2024-07-17 15:46:45 +02:00
onKeyDown = {( ev ) => {
const navAction = getKeyBindingsManager (). getNavigationAction ( ev );
if (
navAction === KeyBindingAction . NextLandmark ||
navAction === KeyBindingAction . PreviousLandmark
) {
LandmarkNavigation . findAndFocusNextLandmark (
Landmark . ACTIVE_SPACE_BUTTON ,
navAction === KeyBindingAction . PreviousLandmark ,
);
ev . stopPropagation ();
ev . preventDefault ();
return ;
}
onKeyDownHandler ( ev );
}}
2021-08-13 18:12:02 +02:00
ref = { ref }
2023-12-20 15:32:24 +00:00
aria-label = { _t ( "common|spaces" )}
2021-06-03 08:32:36 +01:00
>
2021-12-07 09:32:00 +00:00
< UserMenu isPanelCollapsed = { isPanelCollapsed }>
2024-05-03 16:07:11 +02:00
< AccessibleButton
2021-12-07 09:32:00 +00:00
className = { classNames ( "mx_SpacePanel_toggleCollapse" , { expanded : ! isPanelCollapsed })}
onClick = {() => setPanelCollapsed ( ! isPanelCollapsed )}
2023-08-23 11:57:22 +01:00
title = { isPanelCollapsed ? _t ( "action|expand" ) : _t ( "action|collapse" )}
2024-05-03 16:07:11 +02:00
caption = {
2024-05-15 11:44:17 +02:00
< KeyboardShortcut
value = {{ ctrlOrCmdKey : true , shiftKey : true , key : "d" }}
className = "mx_SpacePanel_Tooltip_KeyboardShortcut"
/>
2022-01-26 10:15:06 +00:00
}
2021-12-07 09:32:00 +00:00
/>
</ UserMenu >
2021-06-03 08:32:36 +01:00
< Droppable droppableId = "top-level-spaces" >
2021-07-19 22:43:11 +01:00
{( provided , snapshot ) => (
2022-01-27 09:36:58 +00:00
< InnerSpacePanel
2021-06-03 08:32:36 +01:00
{ ...provided.droppableProps }
2022-01-27 09:36:58 +00:00
isPanelCollapsed = { isPanelCollapsed }
setPanelCollapsed = { setPanelCollapsed }
isDraggingOver = { snapshot . isDraggingOver }
innerRef = { provided . innerRef }
2021-06-03 08:32:36 +01:00
>
2022-01-27 09:36:58 +00:00
{ provided . placeholder }
</ InnerSpacePanel >
2021-07-19 22:43:11 +01:00
)}
2021-06-03 08:32:36 +01:00
</ Droppable >
2021-12-07 09:32:00 +00:00
2024-04-29 16:30:19 +01:00
< ThreadsActivityCentre displayButtonLabel = { ! isPanelCollapsed } />
2022-01-25 12:33:17 +00:00
< QuickSettingsButton isPanelCollapsed = { isPanelCollapsed } />
2023-12-20 15:32:24 +00:00
</ nav >
2023-05-17 15:18:21 +01:00
</ DragDropContext >
)}
</ RovingTabIndexProvider >
2021-06-03 08:32:36 +01:00
);
2021-02-26 10:23:09 +00:00
};
export default SpacePanel ;