From 9050ae4bb7a5e537baac2efb24d5c6d941c97180 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 8 Sep 2022 09:17:55 +0100 Subject: [PATCH] Fix possible soft crash from a race condition in space hierarchies (#9254) * Fix possible soft crash from a race condition in space hierarchies * Improve typing --- src/components/structures/SpaceHierarchy.tsx | 28 +++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index c22f1585f2..7336dfeb0c 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -499,12 +499,12 @@ const INITIAL_PAGE_SIZE = 20; export const useRoomHierarchy = (space: Room): { loading: boolean; rooms?: IHierarchyRoom[]; - hierarchy: RoomHierarchy; - error: Error; + hierarchy?: RoomHierarchy; + error?: Error; loadMore(pageSize?: number): Promise; } => { const [rooms, setRooms] = useState([]); - const [roomHierarchy, setHierarchy] = useState(); + const [hierarchy, setHierarchy] = useState(); const [error, setError] = useState(); const resetHierarchy = useCallback(() => { @@ -526,19 +526,21 @@ export const useRoomHierarchy = (space: Room): { })); const loadMore = useCallback(async (pageSize?: number) => { - if (roomHierarchy.loading || !roomHierarchy.canLoadMore || roomHierarchy.noSupport || error) return; - await roomHierarchy.load(pageSize).catch(setError); - setRooms(roomHierarchy.rooms); - }, [error, roomHierarchy]); + if (hierarchy.loading || !hierarchy.canLoadMore || hierarchy.noSupport || error) return; + await hierarchy.load(pageSize).catch(setError); + setRooms(hierarchy.rooms); + }, [error, hierarchy]); // Only return the hierarchy if it is for the space requested - let hierarchy = roomHierarchy; if (hierarchy?.root !== space) { - hierarchy = undefined; + return { + loading: true, + loadMore, + }; } return { - loading: hierarchy?.loading ?? true, + loading: hierarchy.loading, rooms, hierarchy, loadMore, @@ -689,7 +691,7 @@ const SpaceHierarchy = ({ const { loading, rooms, hierarchy, loadMore, error: hierarchyError } = useRoomHierarchy(space); const filteredRoomSet = useMemo>(() => { - if (!rooms?.length) return new Set(); + if (!rooms?.length || !hierarchy) return new Set(); const lcQuery = query.toLowerCase().trim(); if (!lcQuery) return new Set(rooms); @@ -721,7 +723,7 @@ const SpaceHierarchy = ({ const loaderRef = useIntersectionObserver(loadMore); - if (!loading && hierarchy.noSupport) { + if (!loading && hierarchy!.noSupport) { return

{ _t("Your server does not support showing space hierarchies.") }

; } @@ -755,7 +757,7 @@ const SpaceHierarchy = ({ return { ({ onKeyDownHandler }) => { let content: JSX.Element; - if (loading && !rooms?.length) { + if (!hierarchy || (loading && !rooms?.length)) { content = ; } else { const hasPermissions = space?.getMyMembership() === "join" &&