fix: support for stable mutual rooms endpoint (#2939)
* add support for stable mutual rooms endpoint * add stable mutual room feature check
This commit is contained in:
parent
909aa430b8
commit
bef267257a
2 changed files with 58 additions and 8 deletions
|
|
@ -28,7 +28,11 @@ import { copyToClipboard } from '../../utils/dom';
|
||||||
import { getExploreServerPath } from '../../pages/pathUtils';
|
import { getExploreServerPath } from '../../pages/pathUtils';
|
||||||
import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback';
|
import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback';
|
||||||
import { factoryRoomIdByAtoZ } from '../../utils/sort';
|
import { factoryRoomIdByAtoZ } from '../../utils/sort';
|
||||||
import { useMutualRooms, useMutualRoomsSupport } from '../../hooks/useMutualRooms';
|
import {
|
||||||
|
useMutualRooms,
|
||||||
|
useMutualRoomsSupport,
|
||||||
|
useUnstableMutualRoomsSupport,
|
||||||
|
} from '../../hooks/useMutualRooms';
|
||||||
import { useRoomNavigate } from '../../hooks/useRoomNavigate';
|
import { useRoomNavigate } from '../../hooks/useRoomNavigate';
|
||||||
import { useDirectRooms } from '../../pages/client/direct/useDirectRooms';
|
import { useDirectRooms } from '../../pages/client/direct/useDirectRooms';
|
||||||
import { useMediaAuthentication } from '../../hooks/useMediaAuthentication';
|
import { useMediaAuthentication } from '../../hooks/useMediaAuthentication';
|
||||||
|
|
@ -233,7 +237,9 @@ type MutualRoomsData = {
|
||||||
export function MutualRoomsChip({ userId }: { userId: string }) {
|
export function MutualRoomsChip({ userId }: { userId: string }) {
|
||||||
const mx = useMatrixClient();
|
const mx = useMatrixClient();
|
||||||
const mutualRoomSupported = useMutualRoomsSupport();
|
const mutualRoomSupported = useMutualRoomsSupport();
|
||||||
|
const mutualRoomUnstable = useUnstableMutualRoomsSupport();
|
||||||
const mutualRoomsState = useMutualRooms(userId);
|
const mutualRoomsState = useMutualRooms(userId);
|
||||||
|
console.log(mutualRoomSupported, mutualRoomsState);
|
||||||
const { navigateRoom, navigateSpace } = useRoomNavigate();
|
const { navigateRoom, navigateSpace } = useRoomNavigate();
|
||||||
const closeUserRoomProfile = useCloseUserRoomProfile();
|
const closeUserRoomProfile = useCloseUserRoomProfile();
|
||||||
const directs = useDirectRooms();
|
const directs = useDirectRooms();
|
||||||
|
|
@ -279,7 +285,7 @@ export function MutualRoomsChip({ userId }: { userId: string }) {
|
||||||
|
|
||||||
if (
|
if (
|
||||||
userId === mx.getSafeUserId() ||
|
userId === mx.getSafeUserId() ||
|
||||||
!mutualRoomSupported ||
|
(!mutualRoomSupported && !mutualRoomUnstable) ||
|
||||||
mutualRoomsState.status === AsyncStatus.Error
|
mutualRoomsState.status === AsyncStatus.Error
|
||||||
) {
|
) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
import { MatrixClient, Method } from 'matrix-js-sdk';
|
||||||
import { useMatrixClient } from './useMatrixClient';
|
import { useMatrixClient } from './useMatrixClient';
|
||||||
import { AsyncState, useAsyncCallbackValue } from './useAsyncCallback';
|
import { AsyncState, useAsyncCallbackValue } from './useAsyncCallback';
|
||||||
import { useSpecVersions } from './useSpecVersions';
|
import { useSpecVersions } from './useSpecVersions';
|
||||||
|
|
||||||
export const useMutualRoomsSupport = (): boolean => {
|
export const useUnstableMutualRoomsSupport = (): boolean => {
|
||||||
const { unstable_features: unstableFeatures } = useSpecVersions();
|
const { unstable_features: unstableFeatures } = useSpecVersions();
|
||||||
|
|
||||||
const supported =
|
const supported =
|
||||||
|
|
@ -14,16 +15,59 @@ export const useMutualRoomsSupport = (): boolean => {
|
||||||
return !!supported;
|
return !!supported;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const useMutualRoomsSupport = (): boolean => {
|
||||||
|
const { unstable_features: unstableFeatures, versions } = useSpecVersions();
|
||||||
|
|
||||||
|
const supported =
|
||||||
|
versions.includes('v1.19') ||
|
||||||
|
unstableFeatures?.['uk.half-shot.msc2666.query_mutual_rooms.stable'];
|
||||||
|
|
||||||
|
return !!supported;
|
||||||
|
};
|
||||||
|
|
||||||
|
type MutualRoomsOK = {
|
||||||
|
joined: string[];
|
||||||
|
next_batch?: string;
|
||||||
|
count: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
const fetchAllMutualRooms = async (mx: MatrixClient, userId: string): Promise<string[]> => {
|
||||||
|
const mutualRooms: Set<string> = new Set();
|
||||||
|
|
||||||
|
let nextBatch: string | undefined;
|
||||||
|
do {
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const result = await mx.http.authedRequest<MutualRoomsOK>(
|
||||||
|
Method.Get,
|
||||||
|
'/mutual_rooms',
|
||||||
|
{
|
||||||
|
user_id: userId,
|
||||||
|
from: nextBatch,
|
||||||
|
},
|
||||||
|
undefined,
|
||||||
|
{
|
||||||
|
prefix: '/_matrix/client/v1',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
result.joined.forEach((r) => mutualRooms.add(r));
|
||||||
|
nextBatch = result.next_batch;
|
||||||
|
} while (typeof nextBatch === 'string');
|
||||||
|
|
||||||
|
return Array.from(mutualRooms);
|
||||||
|
};
|
||||||
|
|
||||||
export const useMutualRooms = (userId: string): AsyncState<string[], unknown> => {
|
export const useMutualRooms = (userId: string): AsyncState<string[], unknown> => {
|
||||||
const mx = useMatrixClient();
|
const mx = useMatrixClient();
|
||||||
|
|
||||||
const supported = useMutualRoomsSupport();
|
const unstableSupport = useUnstableMutualRoomsSupport();
|
||||||
|
const support = useMutualRoomsSupport();
|
||||||
|
|
||||||
const [mutualRoomsState] = useAsyncCallbackValue(
|
const [mutualRoomsState] = useAsyncCallbackValue(
|
||||||
useCallback(
|
useCallback(() => {
|
||||||
() => (supported ? mx._unstable_getSharedRooms(userId) : Promise.resolve([])),
|
if (support) return fetchAllMutualRooms(mx, userId);
|
||||||
[mx, userId, supported]
|
if (unstableSupport) return mx._unstable_getSharedRooms(userId);
|
||||||
)
|
return Promise.resolve([]);
|
||||||
|
}, [mx, userId, unstableSupport, support])
|
||||||
);
|
);
|
||||||
|
|
||||||
return mutualRoomsState;
|
return mutualRoomsState;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue