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