feat: Enhance space hierarchy management by implementing asynchronous room fetching and improving room handling logic
This commit is contained in:
@@ -6,6 +6,7 @@ import {
|
||||
HierarchyItem,
|
||||
HierarchyItemRoom,
|
||||
HierarchyItemSpace,
|
||||
isHierarchySpaceRoom,
|
||||
useFetchSpaceHierarchyLevel,
|
||||
} from '../../hooks/useSpaceHierarchy';
|
||||
import { IPowerLevels } from '../../hooks/usePowerLevels';
|
||||
@@ -14,7 +15,7 @@ import { SpaceItemCard } from './SpaceItem';
|
||||
import { AfterItemDropTarget, CanDropCallback } from './DnD';
|
||||
import { HierarchyItemMenu } from './HierarchyItemMenu';
|
||||
import { RoomItemCard } from './RoomItem';
|
||||
import { RoomType, StateEvent } from '../../../types/matrix/room';
|
||||
import { StateEvent } from '../../../types/matrix/room';
|
||||
import { SequenceCard } from '../../components/sequence-card';
|
||||
import { getRoomCreatorsForRoomId } from '../../hooks/useRoomCreators';
|
||||
import { getRoomPermissionsAPI } from '../../hooks/useRoomPermissions';
|
||||
@@ -22,6 +23,7 @@ import { PaarrotSubRoomsContent } from '../../hooks/useRoomSubRooms';
|
||||
|
||||
type SpaceHierarchyProps = {
|
||||
summary: IHierarchyRoom | undefined;
|
||||
hierarchySummaries: Map<string, IHierarchyRoom>;
|
||||
spaceItem: HierarchyItemSpace;
|
||||
roomItems?: HierarchyItemRoom[];
|
||||
allJoinedRooms: Set<string>;
|
||||
@@ -39,12 +41,13 @@ type SpaceHierarchyProps = {
|
||||
pinned: boolean;
|
||||
togglePinToSidebar: (roomId: string) => void;
|
||||
onSpacesFound: (spaceItems: IHierarchyRoom[]) => void;
|
||||
onOpenRoom: MouseEventHandler<HTMLButtonElement>;
|
||||
onOpenRoom?: MouseEventHandler<HTMLButtonElement>;
|
||||
};
|
||||
export const SpaceHierarchy = forwardRef<HTMLDivElement, SpaceHierarchyProps>(
|
||||
(
|
||||
{
|
||||
summary,
|
||||
hierarchySummaries,
|
||||
spaceItem,
|
||||
roomItems,
|
||||
allJoinedRooms,
|
||||
@@ -73,7 +76,7 @@ export const SpaceHierarchy = forwardRef<HTMLDivElement, SpaceHierarchyProps>(
|
||||
const subspaces = useMemo(() => {
|
||||
const s: Map<string, IHierarchyRoom> = new Map();
|
||||
rooms.forEach((r) => {
|
||||
if (r.room_type === RoomType.Space || r.room_type === RoomType.Forum) {
|
||||
if (isHierarchySpaceRoom(r)) {
|
||||
s.set(r.room_id, r);
|
||||
}
|
||||
});
|
||||
@@ -97,8 +100,8 @@ export const SpaceHierarchy = forwardRef<HTMLDivElement, SpaceHierarchyProps>(
|
||||
getRoomPermissionsAPI(parentCreators, parentPowerLevels);
|
||||
|
||||
useEffect(() => {
|
||||
onSpacesFound(Array.from(subspaces.values()));
|
||||
}, [subspaces, onSpacesFound]);
|
||||
onSpacesFound(Array.from(rooms.values()));
|
||||
}, [rooms, onSpacesFound]);
|
||||
|
||||
// Build a global set of all sub-room IDs by checking ALL joined rooms
|
||||
// This ensures sub-rooms are hidden even if their parent isn't in this space
|
||||
@@ -134,7 +137,11 @@ export const SpaceHierarchy = forwardRef<HTMLDivElement, SpaceHierarchyProps>(
|
||||
// hide unknown rooms for normal user
|
||||
childItems = childItems?.filter((i) => {
|
||||
const forbidden = error instanceof MatrixError ? error.errcode === 'M_FORBIDDEN' : false;
|
||||
const inaccessibleRoom = !rooms.get(i.roomId) && !fetching && (error ? forbidden : true);
|
||||
const inaccessibleRoom =
|
||||
!rooms.get(i.roomId) &&
|
||||
!hierarchySummaries.has(i.roomId) &&
|
||||
!fetching &&
|
||||
(error ? forbidden : true);
|
||||
return !inaccessibleRoom;
|
||||
});
|
||||
}
|
||||
@@ -185,7 +192,7 @@ export const SpaceHierarchy = forwardRef<HTMLDivElement, SpaceHierarchyProps>(
|
||||
{childItems && childItems.length > 0 ? (
|
||||
<Box direction="Column" gap="100">
|
||||
{childItems.map((roomItem, index) => {
|
||||
const roomSummary = rooms.get(roomItem.roomId);
|
||||
const roomSummary = rooms.get(roomItem.roomId) ?? hierarchySummaries.get(roomItem.roomId);
|
||||
|
||||
const roomPowerLevels = roomsPowerLevels.get(roomItem.roomId) ?? {};
|
||||
|
||||
@@ -238,7 +245,7 @@ export const SpaceHierarchy = forwardRef<HTMLDivElement, SpaceHierarchyProps>(
|
||||
<Box direction="Column" gap="100" style={{ marginLeft: config.space.S400 }}>
|
||||
{subRoomIds.map((subRoomId) => {
|
||||
const subRoom = mx.getRoom(subRoomId);
|
||||
const subRoomSummary = rooms.get(subRoomId);
|
||||
const subRoomSummary = rooms.get(subRoomId) ?? hierarchySummaries.get(subRoomId);
|
||||
const subRoomPowerLevels = roomsPowerLevels.get(subRoomId) ?? {};
|
||||
const subRoomItem: HierarchyItemRoom = {
|
||||
roomId: subRoomId,
|
||||
|
||||
Reference in New Issue
Block a user