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
pull/28217/head
Michael Telatynski 2022-09-08 09:17:55 +01:00 committed by GitHub
parent 851606c7ed
commit 9050ae4bb7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 13 deletions

View File

@ -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<void>;
} => {
const [rooms, setRooms] = useState<IHierarchyRoom[]>([]);
const [roomHierarchy, setHierarchy] = useState<RoomHierarchy>();
const [hierarchy, setHierarchy] = useState<RoomHierarchy>();
const [error, setError] = useState<Error | undefined>();
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<Set<IHierarchyRoom>>(() => {
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 <p>{ _t("Your server does not support showing space hierarchies.") }</p>;
}
@ -755,7 +757,7 @@ const SpaceHierarchy = ({
return <RovingTabIndexProvider onKeyDown={onKeyDown} handleHomeEnd handleUpDown>
{ ({ onKeyDownHandler }) => {
let content: JSX.Element;
if (loading && !rooms?.length) {
if (!hierarchy || (loading && !rooms?.length)) {
content = <Spinner />;
} else {
const hasPermissions = space?.getMyMembership() === "join" &&