mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-04 22:40:29 +03:00
when a room has more than one orphan parent, we will select parent which has highest number of special users who have special powers in selected room.
72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
import { useCallback } from 'react';
|
|
import { NavigateOptions, useNavigate } from 'react-router-dom';
|
|
import { useAtomValue } from 'jotai';
|
|
import { getCanonicalAliasOrRoomId } from '../utils/matrix';
|
|
import {
|
|
getDirectRoomPath,
|
|
getHomeRoomPath,
|
|
getSpacePath,
|
|
getSpaceRoomPath,
|
|
} from '../pages/pathUtils';
|
|
import { useMatrixClient } from './useMatrixClient';
|
|
import { getOrphanParents, guessPerfectParent } from '../utils/room';
|
|
import { roomToParentsAtom } from '../state/room/roomToParents';
|
|
import { mDirectAtom } from '../state/mDirectList';
|
|
import { useSelectedSpace } from './router/useSelectedSpace';
|
|
import { settingsAtom } from '../state/settings';
|
|
import { useSetting } from '../state/hooks/settings';
|
|
|
|
export const useRoomNavigate = () => {
|
|
const navigate = useNavigate();
|
|
const mx = useMatrixClient();
|
|
const roomToParents = useAtomValue(roomToParentsAtom);
|
|
const mDirects = useAtomValue(mDirectAtom);
|
|
const spaceSelectedId = useSelectedSpace();
|
|
const [developerTools] = useSetting(settingsAtom, 'developerTools');
|
|
|
|
const navigateSpace = useCallback(
|
|
(roomId: string) => {
|
|
const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId);
|
|
navigate(getSpacePath(roomIdOrAlias));
|
|
},
|
|
[mx, navigate]
|
|
);
|
|
|
|
const navigateRoom = useCallback(
|
|
(roomId: string, eventId?: string, opts?: NavigateOptions) => {
|
|
const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId);
|
|
const openSpaceTimeline = developerTools && spaceSelectedId === roomId;
|
|
|
|
const orphanParents = openSpaceTimeline ? [roomId] : getOrphanParents(roomToParents, roomId);
|
|
if (orphanParents.length > 0) {
|
|
let parentSpace: string;
|
|
if (spaceSelectedId && orphanParents.includes(spaceSelectedId)) {
|
|
parentSpace = spaceSelectedId;
|
|
} else {
|
|
parentSpace = guessPerfectParent(mx, roomId, orphanParents) ?? orphanParents[0];
|
|
}
|
|
|
|
const pSpaceIdOrAlias = getCanonicalAliasOrRoomId(mx, parentSpace);
|
|
|
|
navigate(
|
|
getSpaceRoomPath(pSpaceIdOrAlias, openSpaceTimeline ? roomId : roomIdOrAlias, eventId),
|
|
opts
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (mDirects.has(roomId)) {
|
|
navigate(getDirectRoomPath(roomIdOrAlias, eventId), opts);
|
|
return;
|
|
}
|
|
|
|
navigate(getHomeRoomPath(roomIdOrAlias, eventId), opts);
|
|
},
|
|
[mx, navigate, spaceSelectedId, roomToParents, mDirects, developerTools]
|
|
);
|
|
|
|
return {
|
|
navigateSpace,
|
|
navigateRoom,
|
|
};
|
|
};
|