diff --git a/src/app/hooks/useDirectUsers.ts b/src/app/hooks/useDirectUsers.ts new file mode 100644 index 00000000..3aa18928 --- /dev/null +++ b/src/app/hooks/useDirectUsers.ts @@ -0,0 +1,27 @@ +import { useMemo } from 'react'; +import { AccountDataEvent, MDirectContent } from '../../types/matrix/accountData'; +import { useAccountData } from './useAccountData'; +import { useAllJoinedRoomsSet, useGetRoom } from './useGetRoom'; + +export const useDirectUsers = (): string[] => { + const directEvent = useAccountData(AccountDataEvent.Direct); + const content = directEvent?.getContent(); + + const allJoinedRooms = useAllJoinedRoomsSet(); + const getRoom = useGetRoom(allJoinedRooms); + + const users = useMemo(() => { + if (typeof content !== 'object') return []; + + const u = Object.keys(content).filter((userId) => { + const rooms = content[userId]; + if (!Array.isArray(rooms)) return false; + const hasDM = rooms.some((roomId) => typeof roomId === 'string' && !!getRoom(roomId)); + return hasDM; + }); + + return u; + }, [content, getRoom]); + + return users; +}; diff --git a/src/types/matrix/accountData.ts b/src/types/matrix/accountData.ts index 20ce9419..98715996 100644 --- a/src/types/matrix/accountData.ts +++ b/src/types/matrix/accountData.ts @@ -18,6 +18,8 @@ export enum AccountDataEvent { MegolmBackupV1 = 'm.megolm_backup.v1', } +export type MDirectContent = Record; + export type SecretStorageDefaultKeyContent = { key: string; };