@@ -60,18 +60,15 @@ import { getDisplayAliasForRoom } from "./RoomDirectory";
6060import MatrixClientContext from "../../contexts/MatrixClientContext" ;
6161import { useEventEmitterState } from "../../hooks/useEventEmitter" ;
6262import { IOOBData } from "../../stores/ThreepidInviteStore" ;
63+ import { awaitRoomDownSync } from "../../utils/RoomUpgrade" ;
64+ import RoomViewStore from "../../stores/RoomViewStore" ;
6365
6466interface IProps {
6567 space : Room ;
6668 initialText ?: string ;
6769 additionalButtons ?: ReactNode ;
68- showRoom (
69- cli : MatrixClient ,
70- hierarchy : RoomHierarchy ,
71- roomId : string ,
72- autoJoin ?: boolean ,
73- roomType ?: RoomType ,
74- ) : void ;
70+ showRoom ( cli : MatrixClient , hierarchy : RoomHierarchy , roomId : string , roomType ?: RoomType ) : void ;
71+ joinRoom ( cli : MatrixClient , hierarchy : RoomHierarchy , roomId : string ) : void ;
7572}
7673
7774interface ITileProps {
@@ -80,7 +77,8 @@ interface ITileProps {
8077 selected ?: boolean ;
8178 numChildRooms ?: number ;
8279 hasPermissions ?: boolean ;
83- onViewRoomClick ( autoJoin : boolean , roomType : RoomType ) : void ;
80+ onViewRoomClick ( ) : void ;
81+ onJoinRoomClick ( ) : void ;
8482 onToggleClick ?( ) : void ;
8583}
8684
@@ -91,31 +89,50 @@ const Tile: React.FC<ITileProps> = ({
9189 hasPermissions,
9290 onToggleClick,
9391 onViewRoomClick,
92+ onJoinRoomClick,
9493 numChildRooms,
9594 children,
9695} ) => {
9796 const cli = useContext ( MatrixClientContext ) ;
98- const joinedRoom = cli . getRoom ( room . room_id ) ?. getMyMembership ( ) === "join" ? cli . getRoom ( room . room_id ) : null ;
97+ const [ joinedRoom , setJoinedRoom ] = useState < Room > ( ( ) => {
98+ const cliRoom = cli . getRoom ( room . room_id ) ;
99+ return cliRoom ?. getMyMembership ( ) === "join" ? cliRoom : null ;
100+ } ) ;
99101 const joinedRoomName = useEventEmitterState ( joinedRoom , "Room.name" , room => room ?. name ) ;
100102 const name = joinedRoomName || room . name || room . canonical_alias || room . aliases ?. [ 0 ]
101103 || ( room . room_type === RoomType . Space ? _t ( "Unnamed Space" ) : _t ( "Unnamed Room" ) ) ;
102104
103105 const [ showChildren , toggleShowChildren ] = useStateToggle ( true ) ;
104106 const [ onFocus , isActive , ref ] = useRovingTabIndex ( ) ;
107+ const [ busy , setBusy ] = useState ( false ) ;
105108
106109 const onPreviewClick = ( ev : ButtonEvent ) => {
107110 ev . preventDefault ( ) ;
108111 ev . stopPropagation ( ) ;
109- onViewRoomClick ( false , room . room_type as RoomType ) ;
112+ onViewRoomClick ( ) ;
110113 } ;
111- const onJoinClick = ( ev : ButtonEvent ) => {
114+ const onJoinClick = async ( ev : ButtonEvent ) => {
115+ setBusy ( true ) ;
112116 ev . preventDefault ( ) ;
113117 ev . stopPropagation ( ) ;
114- onViewRoomClick ( true , room . room_type as RoomType ) ;
118+ onJoinRoomClick ( ) ;
119+ setJoinedRoom ( await awaitRoomDownSync ( cli , room . room_id ) ) ;
120+ setBusy ( false ) ;
115121 } ;
116122
117123 let button ;
118- if ( joinedRoom ) {
124+ if ( busy ) {
125+ button = < AccessibleTooltipButton
126+ disabled = { true }
127+ onClick = { onJoinClick }
128+ kind = "primary_outline"
129+ onFocus = { onFocus }
130+ tabIndex = { isActive ? 0 : - 1 }
131+ title = { _t ( "Joining" ) }
132+ >
133+ < Spinner w = { 24 } h = { 24 } />
134+ </ AccessibleTooltipButton > ;
135+ } else if ( joinedRoom ) {
119136 button = < AccessibleButton
120137 onClick = { onPreviewClick }
121138 kind = "primary_outline"
@@ -282,6 +299,7 @@ const Tile: React.FC<ITileProps> = ({
282299 < AccessibleButton
283300 className = { classNames ( "mx_SpaceHierarchy_roomTile" , {
284301 mx_SpaceHierarchy_subspace : room . room_type === RoomType . Space ,
302+ mx_SpaceHierarchy_joining : busy ,
285303 } ) }
286304 onClick = { ( hasPermissions && onToggleClick ) ? onToggleClick : onPreviewClick }
287305 onKeyDown = { onKeyDown }
@@ -296,13 +314,7 @@ const Tile: React.FC<ITileProps> = ({
296314 </ li > ;
297315} ;
298316
299- export const showRoom = (
300- cli : MatrixClient ,
301- hierarchy : RoomHierarchy ,
302- roomId : string ,
303- autoJoin = false ,
304- roomType ?: RoomType ,
305- ) => {
317+ export const showRoom = ( cli : MatrixClient , hierarchy : RoomHierarchy , roomId : string , roomType ?: RoomType ) : void => {
306318 const room = hierarchy . roomMap . get ( roomId ) ;
307319
308320 // Don't let the user view a room they won't be able to either peek or join:
@@ -317,7 +329,6 @@ export const showRoom = (
317329 const roomAlias = getDisplayAliasForRoom ( room ) || undefined ;
318330 dis . dispatch ( {
319331 action : "view_room" ,
320- auto_join : autoJoin ,
321332 should_peek : true ,
322333 _type : "room_directory" , // instrumentation
323334 room_alias : roomAlias ,
@@ -332,13 +343,29 @@ export const showRoom = (
332343 } ) ;
333344} ;
334345
346+ export const joinRoom = ( cli : MatrixClient , hierarchy : RoomHierarchy , roomId : string ) : void => {
347+ // Don't let the user view a room they won't be able to either peek or join:
348+ // fail earlier so they don't have to click back to the directory.
349+ if ( cli . isGuest ( ) ) {
350+ dis . dispatch ( { action : "require_registration" } ) ;
351+ return ;
352+ }
353+
354+ cli . joinRoom ( roomId , {
355+ viaServers : Array . from ( hierarchy . viaMap . get ( roomId ) || [ ] ) ,
356+ } ) . catch ( err => {
357+ RoomViewStore . showJoinRoomError ( err , roomId ) ;
358+ } ) ;
359+ } ;
360+
335361interface IHierarchyLevelProps {
336362 root : IHierarchyRoom ;
337363 roomSet : Set < IHierarchyRoom > ;
338364 hierarchy : RoomHierarchy ;
339365 parents : Set < string > ;
340366 selectedMap ?: Map < string , Set < string > > ;
341- onViewRoomClick ( roomId : string , autoJoin : boolean , roomType ?: RoomType ) : void ;
367+ onViewRoomClick ( roomId : string , roomType ?: RoomType ) : void ;
368+ onJoinRoomClick ( roomId : string ) : void ;
342369 onToggleClick ?( parentId : string , childId : string ) : void ;
343370}
344371
@@ -373,6 +400,7 @@ export const HierarchyLevel = ({
373400 parents,
374401 selectedMap,
375402 onViewRoomClick,
403+ onJoinRoomClick,
376404 onToggleClick,
377405} : IHierarchyLevelProps ) => {
378406 const cli = useContext ( MatrixClientContext ) ;
@@ -400,9 +428,8 @@ export const HierarchyLevel = ({
400428 room = { room }
401429 suggested = { hierarchy . isSuggested ( root . room_id , room . room_id ) }
402430 selected = { selectedMap ?. get ( root . room_id ) ?. has ( room . room_id ) }
403- onViewRoomClick = { ( autoJoin , roomType ) => {
404- onViewRoomClick ( room . room_id , autoJoin , roomType ) ;
405- } }
431+ onViewRoomClick = { ( ) => onViewRoomClick ( room . room_id , room . room_type as RoomType ) }
432+ onJoinRoomClick = { ( ) => onJoinRoomClick ( room . room_id ) }
406433 hasPermissions = { hasPermissions }
407434 onToggleClick = { onToggleClick ? ( ) => onToggleClick ( root . room_id , room . room_id ) : undefined }
408435 />
@@ -420,9 +447,8 @@ export const HierarchyLevel = ({
420447 } ) . length }
421448 suggested = { hierarchy . isSuggested ( root . room_id , space . room_id ) }
422449 selected = { selectedMap ?. get ( root . room_id ) ?. has ( space . room_id ) }
423- onViewRoomClick = { ( autoJoin , roomType ) => {
424- onViewRoomClick ( space . room_id , autoJoin , roomType ) ;
425- } }
450+ onViewRoomClick = { ( ) => onViewRoomClick ( space . room_id , RoomType . Space ) }
451+ onJoinRoomClick = { ( ) => onJoinRoomClick ( space . room_id ) }
426452 hasPermissions = { hasPermissions }
427453 onToggleClick = { onToggleClick ? ( ) => onToggleClick ( root . room_id , space . room_id ) : undefined }
428454 >
@@ -433,6 +459,7 @@ export const HierarchyLevel = ({
433459 parents = { newParents }
434460 selectedMap = { selectedMap }
435461 onViewRoomClick = { onViewRoomClick }
462+ onJoinRoomClick = { onJoinRoomClick }
436463 onToggleClick = { onToggleClick }
437464 />
438465 </ Tile >
@@ -696,9 +723,8 @@ const SpaceHierarchy = ({
696723 parents = { new Set ( ) }
697724 selectedMap = { selected }
698725 onToggleClick = { hasPermissions ? onToggleClick : undefined }
699- onViewRoomClick = { ( roomId , autoJoin , roomType ) => {
700- showRoom ( cli , hierarchy , roomId , autoJoin , roomType ) ;
701- } }
726+ onViewRoomClick = { ( roomId , roomType ) => showRoom ( cli , hierarchy , roomId , roomType ) }
727+ onJoinRoomClick = { ( roomId ) => joinRoom ( cli , hierarchy , roomId ) }
702728 />
703729 </ > ;
704730 } else if ( ! hierarchy . canLoadMore ) {
0 commit comments