2024-01-21 23:50:56 +11:00
|
|
|
import { useAtomValue } from 'jotai';
|
2023-06-12 21:15:23 +10:00
|
|
|
import { selectAtom } from 'jotai/utils';
|
|
|
|
|
import { MatrixClient } from 'matrix-js-sdk';
|
|
|
|
|
import { useCallback } from 'react';
|
|
|
|
|
import { isRoom, isSpace, isUnsupportedRoom } from '../../utils/room';
|
2024-01-21 23:50:56 +11:00
|
|
|
import { compareRoomsEqual } from '../utils';
|
|
|
|
|
import { mDirectAtom } from '../mDirectList';
|
|
|
|
|
import { allRoomsAtom } from '../roomList';
|
2023-06-12 21:15:23 +10:00
|
|
|
|
2024-01-21 23:50:56 +11:00
|
|
|
export const useSpaces = (mx: MatrixClient, roomsAtom: typeof allRoomsAtom) => {
|
2023-06-12 21:15:23 +10:00
|
|
|
const selector = useCallback(
|
|
|
|
|
(rooms: string[]) => rooms.filter((roomId) => isSpace(mx.getRoom(roomId))),
|
|
|
|
|
[mx]
|
|
|
|
|
);
|
2024-01-21 23:50:56 +11:00
|
|
|
return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual));
|
2023-06-12 21:15:23 +10:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useRooms = (
|
|
|
|
|
mx: MatrixClient,
|
2024-01-21 23:50:56 +11:00
|
|
|
roomsAtom: typeof allRoomsAtom,
|
|
|
|
|
directAtom: typeof mDirectAtom
|
2023-06-12 21:15:23 +10:00
|
|
|
) => {
|
2024-01-21 23:50:56 +11:00
|
|
|
const mDirects = useAtomValue(directAtom);
|
2023-06-12 21:15:23 +10:00
|
|
|
const selector = useCallback(
|
|
|
|
|
(rooms: string[]) =>
|
|
|
|
|
rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && !mDirects.has(roomId)),
|
|
|
|
|
[mx, mDirects]
|
|
|
|
|
);
|
2024-01-21 23:50:56 +11:00
|
|
|
return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual));
|
2023-06-12 21:15:23 +10:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useDirects = (
|
|
|
|
|
mx: MatrixClient,
|
2024-01-21 23:50:56 +11:00
|
|
|
roomsAtom: typeof allRoomsAtom,
|
|
|
|
|
directAtom: typeof mDirectAtom
|
2023-06-12 21:15:23 +10:00
|
|
|
) => {
|
2024-01-21 23:50:56 +11:00
|
|
|
const mDirects = useAtomValue(directAtom);
|
2023-06-12 21:15:23 +10:00
|
|
|
const selector = useCallback(
|
|
|
|
|
(rooms: string[]) =>
|
|
|
|
|
rooms.filter((roomId) => isRoom(mx.getRoom(roomId)) && mDirects.has(roomId)),
|
|
|
|
|
[mx, mDirects]
|
|
|
|
|
);
|
2024-01-21 23:50:56 +11:00
|
|
|
return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual));
|
2023-06-12 21:15:23 +10:00
|
|
|
};
|
|
|
|
|
|
2024-01-21 23:50:56 +11:00
|
|
|
export const useUnsupportedRooms = (mx: MatrixClient, roomsAtom: typeof allRoomsAtom) => {
|
2023-06-12 21:15:23 +10:00
|
|
|
const selector = useCallback(
|
|
|
|
|
(rooms: string[]) => rooms.filter((roomId) => isUnsupportedRoom(mx.getRoom(roomId))),
|
|
|
|
|
[mx]
|
|
|
|
|
);
|
2024-01-21 23:50:56 +11:00
|
|
|
return useAtomValue(selectAtom(roomsAtom, selector, compareRoomsEqual));
|
2023-06-12 21:15:23 +10:00
|
|
|
};
|