@@ -65,6 +65,8 @@ interface IProps {
6565 appsShown : boolean ;
6666 searchInfo : ISearchInfo ;
6767 excludedRightPanelPhaseButtons ?: Array < RightPanelPhases > ;
68+ showButtons ?: boolean ;
69+ enableRoomOptionsMenu ?: boolean ;
6870}
6971
7072interface IState {
@@ -76,6 +78,8 @@ export default class RoomHeader extends React.Component<IProps, IState> {
7678 editing : false ,
7779 inRoom : false ,
7880 excludedRightPanelPhaseButtons : [ ] ,
81+ showButtons : true ,
82+ enableRoomOptionsMenu : true ,
7983 } ;
8084
8185 static contextType = RoomContext ;
@@ -130,81 +134,7 @@ export default class RoomHeader extends React.Component<IProps, IState> {
130134 this . setState ( { contextMenuPosition : null } ) ;
131135 } ;
132136
133- public render ( ) {
134- let searchStatus = null ;
135-
136- // don't display the search count until the search completes and
137- // gives us a valid (possibly zero) searchCount.
138- if ( this . props . searchInfo &&
139- this . props . searchInfo . searchCount !== undefined &&
140- this . props . searchInfo . searchCount !== null ) {
141- searchStatus = < div className = "mx_RoomHeader_searchStatus" >
142- { _t ( "(~%(count)s results)" , { count : this . props . searchInfo . searchCount } ) }
143- </ div > ;
144- }
145-
146- // XXX: this is a bit inefficient - we could just compare room.name for 'Empty room'...
147- let settingsHint = false ;
148- const members = this . props . room ? this . props . room . getJoinedMembers ( ) : undefined ;
149- if ( members ) {
150- if ( members . length === 1 && members [ 0 ] . userId === MatrixClientPeg . get ( ) . credentials . userId ) {
151- const nameEvent = this . props . room . currentState . getStateEvents ( 'm.room.name' , '' ) ;
152- if ( ! nameEvent || ! nameEvent . getContent ( ) . name ) {
153- settingsHint = true ;
154- }
155- }
156- }
157-
158- let oobName = _t ( "Join Room" ) ;
159- if ( this . props . oobData && this . props . oobData . name ) {
160- oobName = this . props . oobData . name ;
161- }
162-
163- let contextMenu : JSX . Element ;
164- if ( this . state . contextMenuPosition && this . props . room ) {
165- contextMenu = (
166- < RoomContextMenu
167- { ...contextMenuBelow ( this . state . contextMenuPosition ) }
168- room = { this . props . room }
169- onFinished = { this . onContextMenuCloseClick }
170- />
171- ) ;
172- }
173-
174- const textClasses = classNames ( 'mx_RoomHeader_nametext' , { mx_RoomHeader_settingsHint : settingsHint } ) ;
175- const name = (
176- < ContextMenuTooltipButton
177- className = "mx_RoomHeader_name"
178- onClick = { this . onContextMenuOpenClick }
179- isExpanded = { ! ! this . state . contextMenuPosition }
180- title = { _t ( "Room options" ) }
181- >
182- < RoomName room = { this . props . room } >
183- { ( name ) => {
184- const roomName = name || oobName ;
185- return < div dir = "auto" className = { textClasses } title = { roomName } > { roomName } </ div > ;
186- } }
187- </ RoomName >
188- { this . props . room && < div className = "mx_RoomHeader_chevron" /> }
189- { contextMenu }
190- </ ContextMenuTooltipButton >
191- ) ;
192-
193- const topicElement = < RoomTopic
194- room = { this . props . room }
195- className = "mx_RoomHeader_topic"
196- /> ;
197-
198- let roomAvatar ;
199- if ( this . props . room ) {
200- roomAvatar = < DecoratedRoomAvatar
201- room = { this . props . room }
202- avatarSize = { 24 }
203- oobData = { this . props . oobData }
204- viewAvatarOnClick = { true }
205- /> ;
206- }
207-
137+ private renderButtons ( ) : JSX . Element [ ] {
208138 const buttons : JSX . Element [ ] = [ ] ;
209139
210140 if ( this . props . inRoom &&
@@ -269,10 +199,105 @@ export default class RoomHeader extends React.Component<IProps, IState> {
269199 buttons . push ( inviteButton ) ;
270200 }
271201
272- const rightRow =
273- < div className = "mx_RoomHeader_buttons" >
274- { buttons }
202+ return buttons ;
203+ }
204+
205+ private renderName ( oobName ) {
206+ let contextMenu : JSX . Element ;
207+ if ( this . state . contextMenuPosition && this . props . room ) {
208+ contextMenu = (
209+ < RoomContextMenu
210+ { ...contextMenuBelow ( this . state . contextMenuPosition ) }
211+ room = { this . props . room }
212+ onFinished = { this . onContextMenuCloseClick }
213+ />
214+ ) ;
215+ }
216+
217+ // XXX: this is a bit inefficient - we could just compare room.name for 'Empty room'...
218+ let settingsHint = false ;
219+ const members = this . props . room ? this . props . room . getJoinedMembers ( ) : undefined ;
220+ if ( members ) {
221+ if ( members . length === 1 && members [ 0 ] . userId === MatrixClientPeg . get ( ) . credentials . userId ) {
222+ const nameEvent = this . props . room . currentState . getStateEvents ( 'm.room.name' , '' ) ;
223+ if ( ! nameEvent || ! nameEvent . getContent ( ) . name ) {
224+ settingsHint = true ;
225+ }
226+ }
227+ }
228+
229+ const textClasses = classNames ( 'mx_RoomHeader_nametext' , { mx_RoomHeader_settingsHint : settingsHint } ) ;
230+ const roomName = < RoomName room = { this . props . room } >
231+ { ( name ) => {
232+ const roomName = name || oobName ;
233+ return < div dir = "auto" className = { textClasses } title = { roomName } > { roomName } </ div > ;
234+ } }
235+ </ RoomName > ;
236+
237+ if ( this . props . enableRoomOptionsMenu ) {
238+ return (
239+ < ContextMenuTooltipButton
240+ className = "mx_RoomHeader_name"
241+ onClick = { this . onContextMenuOpenClick }
242+ isExpanded = { ! ! this . state . contextMenuPosition }
243+ title = { _t ( "Room options" ) }
244+ >
245+ { roomName }
246+ { this . props . room && < div className = "mx_RoomHeader_chevron" /> }
247+ { contextMenu }
248+ </ ContextMenuTooltipButton >
249+ ) ;
250+ }
251+
252+ return < div className = "mx_RoomHeader_name mx_RoomHeader_name--textonly" >
253+ { roomName }
254+ </ div > ;
255+ }
256+
257+ public render ( ) {
258+ let searchStatus = null ;
259+
260+ // don't display the search count until the search completes and
261+ // gives us a valid (possibly zero) searchCount.
262+ if ( this . props . searchInfo &&
263+ this . props . searchInfo . searchCount !== undefined &&
264+ this . props . searchInfo . searchCount !== null ) {
265+ searchStatus = < div className = "mx_RoomHeader_searchStatus" >
266+ { _t ( "(~%(count)s results)" , { count : this . props . searchInfo . searchCount } ) }
275267 </ div > ;
268+ }
269+
270+ let oobName = _t ( "Join Room" ) ;
271+ if ( this . props . oobData && this . props . oobData . name ) {
272+ oobName = this . props . oobData . name ;
273+ }
274+
275+ const name = this . renderName ( oobName ) ;
276+
277+ const topicElement = < RoomTopic
278+ room = { this . props . room }
279+ className = "mx_RoomHeader_topic"
280+ /> ;
281+
282+ let roomAvatar ;
283+ if ( this . props . room ) {
284+ roomAvatar = < DecoratedRoomAvatar
285+ room = { this . props . room }
286+ avatarSize = { 24 }
287+ oobData = { this . props . oobData }
288+ viewAvatarOnClick = { true }
289+ /> ;
290+ }
291+
292+ let buttons ;
293+ if ( this . props . showButtons ) {
294+ buttons = < React . Fragment >
295+ < div className = "mx_RoomHeader_buttons" >
296+ { this . renderButtons ( ) }
297+ </ div >
298+ < RoomHeaderButtons room = { this . props . room } excludedRightPanelPhaseButtons = { this . props . excludedRightPanelPhaseButtons } />
299+ </ React . Fragment > ;
300+ }
276301
277302 const e2eIcon = this . props . e2eStatus ? < E2EIcon status = { this . props . e2eStatus } /> : undefined ;
278303
@@ -294,8 +319,7 @@ export default class RoomHeader extends React.Component<IProps, IState> {
294319 { searchStatus }
295320 { topicElement }
296321 { betaPill }
297- { rightRow }
298- < RoomHeaderButtons room = { this . props . room } excludedRightPanelPhaseButtons = { this . props . excludedRightPanelPhaseButtons } />
322+ { buttons }
299323 </ div >
300324 < RoomLiveShareWarning roomId = { this . props . room . roomId } />
301325 </ div >
0 commit comments