Merge pull request #6095 from matrix-org/gsouquet/sticky-headers-results
						commit
						7ecd96b320
					
				|  | @ -61,8 +61,7 @@ limitations under the License. | |||
|             &.mx_RoomSublist_headerContainer_sticky { | ||||
|                 position: fixed; | ||||
|                 height: 32px; // to match the header container | ||||
|                 // width set by JS | ||||
|                 width: calc(100% - 22px); | ||||
|                 width: calc(100% - 15px); | ||||
|             } | ||||
| 
 | ||||
|             // We don't have a top style because the top is dependent on the room list header's | ||||
|  |  | |||
|  | @ -110,6 +110,11 @@ export default class LeftPanel extends React.Component<IProps, IState> { | |||
|         dis.fire(Action.ViewRoomDirectory); | ||||
|     }; | ||||
| 
 | ||||
|     private refreshStickyHeaders = () => { | ||||
|         if (!this.listContainerRef.current) return; // ignore: no headers to sticky
 | ||||
|         this.handleStickyHeaders(this.listContainerRef.current); | ||||
|     } | ||||
| 
 | ||||
|     private onBreadcrumbsUpdate = () => { | ||||
|         const newVal = BreadcrumbsStore.instance.visible; | ||||
|         if (newVal !== this.state.showBreadcrumbs) { | ||||
|  | @ -152,9 +157,6 @@ export default class LeftPanel extends React.Component<IProps, IState> { | |||
|         const bottomEdge = list.offsetHeight + list.scrollTop; | ||||
|         const sublists = list.querySelectorAll<HTMLDivElement>(".mx_RoomSublist:not(.mx_RoomSublist_hidden)"); | ||||
| 
 | ||||
|         const headerRightMargin = 15; // calculated from margins and widths to align with non-sticky tiles
 | ||||
|         const headerStickyWidth = list.clientWidth - headerRightMargin; | ||||
| 
 | ||||
|         // We track which styles we want on a target before making the changes to avoid
 | ||||
|         // excessive layout updates.
 | ||||
|         const targetStyles = new Map<HTMLDivElement, { | ||||
|  | @ -243,18 +245,10 @@ export default class LeftPanel extends React.Component<IProps, IState> { | |||
|                 if (!header.classList.contains("mx_RoomSublist_headerContainer_sticky")) { | ||||
|                     header.classList.add("mx_RoomSublist_headerContainer_sticky"); | ||||
|                 } | ||||
| 
 | ||||
|                 const newWidth = `${headerStickyWidth}px`; | ||||
|                 if (header.style.width !== newWidth) { | ||||
|                     header.style.width = newWidth; | ||||
|                 } | ||||
|             } else if (!style.stickyTop && !style.stickyBottom) { | ||||
|                 if (header.classList.contains("mx_RoomSublist_headerContainer_sticky")) { | ||||
|                     header.classList.remove("mx_RoomSublist_headerContainer_sticky"); | ||||
|                 } | ||||
|                 if (header.style.width) { | ||||
|                     header.style.removeProperty('width'); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -432,7 +426,7 @@ export default class LeftPanel extends React.Component<IProps, IState> { | |||
|                     {this.renderHeader()} | ||||
|                     {this.renderSearchExplore()} | ||||
|                     {this.renderBreadcrumbs()} | ||||
|                     <RoomListNumResults /> | ||||
|                     <RoomListNumResults onVisibilityChange={this.refreshStickyHeaders} /> | ||||
|                     <div className="mx_LeftPanel_roomListWrapper"> | ||||
|                         <div | ||||
|                             className={roomListClasses} | ||||
|  |  | |||
|  | @ -14,14 +14,18 @@ See the License for the specific language governing permissions and | |||
| limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| import React, {useState} from "react"; | ||||
| import React, {useEffect, useState} from "react"; | ||||
| 
 | ||||
| import { _t } from "../../../languageHandler"; | ||||
| import RoomListStore, { LISTS_UPDATE_EVENT } from "../../../stores/room-list/RoomListStore"; | ||||
| import {useEventEmitter} from "../../../hooks/useEventEmitter"; | ||||
| import SpaceStore from "../../../stores/SpaceStore"; | ||||
| 
 | ||||
| const RoomListNumResults: React.FC = () => { | ||||
| interface IProps { | ||||
|     onVisibilityChange?: () => void | ||||
| } | ||||
| 
 | ||||
| const RoomListNumResults: React.FC<IProps> = ({ onVisibilityChange }) => { | ||||
|     const [count, setCount] = useState<number>(null); | ||||
|     useEventEmitter(RoomListStore.instance, LISTS_UPDATE_EVENT, () => { | ||||
|         if (RoomListStore.instance.getFirstNameFilterCondition()) { | ||||
|  | @ -32,6 +36,12 @@ const RoomListNumResults: React.FC = () => { | |||
|         } | ||||
|     }); | ||||
| 
 | ||||
|     useEffect(() => { | ||||
|         if (onVisibilityChange) { | ||||
|             onVisibilityChange(); | ||||
|         } | ||||
|     }, [count, onVisibilityChange]); | ||||
| 
 | ||||
|     if (typeof count !== "number") return null; | ||||
| 
 | ||||
|     return <div className="mx_LeftPanel_roomListFilterCount"> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Germain
						Germain