From 05859bf89c93294b0bb33aac7340ce8a43d0c330 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 17 Aug 2024 08:56:18 +0530 Subject: [PATCH 1/8] update matrix js sdk --- package-lock.json | 84 ++++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b00ff0781..e47364bf28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "jotai": "2.6.0", "linkify-react": "4.1.3", "linkifyjs": "4.1.3", - "matrix-js-sdk": "29.1.0", + "matrix-js-sdk": "34.2.0", "millify": "6.1.0", "pdfjs-dist": "4.2.67", "prismjs": "1.29.0", @@ -1139,9 +1139,9 @@ } }, "node_modules/@matrix-org/matrix-sdk-crypto-wasm": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-2.2.0.tgz", - "integrity": "sha512-txmvaTiZpVV0/kWCRcE7tZvRESCEc1ynLJDVh9OUsFlaXfl13c7qdD3E6IJEJ8YiPMIn+PHogdfBZsO84reaMg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-6.2.1.tgz", + "integrity": "sha512-5mav0EKog0w9NWRRxFzZ+ZcT5Il/KlLh1bsQXgxfhzfJq1RgWLLu+OsvHSZau5NSbPxfOd4ZTWc2ZLAf+V/8mg==", "engines": { "node": ">= 10" } @@ -4091,9 +4091,9 @@ "devOptional": true }, "node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", + "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -4193,11 +4193,11 @@ } }, "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "dependencies": { - "base-x": "^4.0.0" + "base-x": "^5.0.0" } }, "node_modules/buffer": { @@ -4469,11 +4469,6 @@ "node": ">= 8" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" - }, "node_modules/css-what": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", @@ -6708,9 +6703,12 @@ } }, "node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } }, "node_modules/language-subtag-registry": { "version": "0.3.22", @@ -6885,27 +6883,45 @@ "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==" }, "node_modules/matrix-js-sdk": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-29.1.0.tgz", - "integrity": "sha512-nF+ACFioDltGCf2KFfXK7QoJ70Ytnzm4Jse2UI+BDXeR9WCjtKefXJtboN2rmU4MFmLCTHcnBTmu6yig67YUqw==", + "version": "34.2.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-34.2.0.tgz", + "integrity": "sha512-dygfH/a0C/Q+a5dSfudxxwA0g9peLsBbalC6LaxPa7AEFb4Gg9d8kiGnlqaFb1U9bGUapk8duBsAC526BjXbdA==", "dependencies": { "@babel/runtime": "^7.12.5", - "@matrix-org/matrix-sdk-crypto-wasm": "^2.0.0", + "@matrix-org/matrix-sdk-crypto-wasm": "^6.0.0", + "@matrix-org/olm": "3.2.15", "another-json": "^0.2.0", - "bs58": "^5.0.0", + "bs58": "^6.0.0", "content-type": "^1.0.4", - "jwt-decode": "^3.1.2", + "jwt-decode": "^4.0.0", "loglevel": "^1.7.1", "matrix-events-sdk": "0.0.1", "matrix-widget-api": "^1.6.0", - "oidc-client-ts": "^2.2.4", + "oidc-client-ts": "^3.0.1", "p-retry": "4", "sdp-transform": "^2.14.1", "unhomoglyph": "^1.0.6", - "uuid": "9" + "uuid": "10" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/matrix-js-sdk/node_modules/@matrix-org/olm": { + "version": "3.2.15", + "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.15.tgz", + "integrity": "sha1-d7TfLNPbRwn1Lz1OsJobPWuYm7s=" + }, + "node_modules/matrix-js-sdk/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/matrix-widget-api": { @@ -7258,15 +7274,14 @@ } }, "node_modules/oidc-client-ts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.4.0.tgz", - "integrity": "sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-3.0.1.tgz", + "integrity": "sha512-xX8unZNtmtw3sOz4FPSqDhkLFnxCDsdo2qhFEH2opgWnF/iXMFoYdBQzkwCxAZVgt3FT3DnuBY3k80EZHT0RYg==", "dependencies": { - "crypto-js": "^4.2.0", - "jwt-decode": "^3.1.2" + "jwt-decode": "^4.0.0" }, "engines": { - "node": ">=12.13.0" + "node": ">=18" } }, "node_modules/once": { @@ -8774,6 +8789,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" diff --git a/package.json b/package.json index d06b960195..7bf975ce19 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "jotai": "2.6.0", "linkify-react": "4.1.3", "linkifyjs": "4.1.3", - "matrix-js-sdk": "29.1.0", + "matrix-js-sdk": "34.2.0", "millify": "6.1.0", "pdfjs-dist": "4.2.67", "prismjs": "1.29.0", From 2feb4feee2c42e6386ae02fbf273d948335a4d44 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sat, 17 Aug 2024 08:56:33 +0530 Subject: [PATCH 2/8] remove dead code --- src/app/features/room/RoomTimeline.tsx | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 6e50370381..e882aeff05 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -16,7 +16,6 @@ import { EventTimeline, EventTimelineSet, EventTimelineSetHandlerMap, - IEncryptedFile, MatrixClient, MatrixEvent, Room, @@ -46,12 +45,7 @@ import { } from 'folds'; import { isKeyHotkey } from 'is-hotkey'; import { Opts as LinkifyOpts } from 'linkifyjs'; -import { - decryptFile, - eventWithShortcode, - factoryEventSentBy, - getMxIdLocalPart, -} from '../../utils/matrix'; +import { eventWithShortcode, factoryEventSentBy, getMxIdLocalPart } from '../../utils/matrix'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useVirtualPaginator, ItemRange } from '../../hooks/useVirtualPaginator'; import { useAlive } from '../../hooks/useAlive'; @@ -217,18 +211,6 @@ export const getEventIdAbsoluteIndex = ( return baseIndex + eventIndex; }; -export const factoryGetFileSrcUrl = - (httpUrl: string, mimeType: string, encFile?: IEncryptedFile) => async (): Promise => { - if (encFile) { - if (typeof httpUrl !== 'string') throw new Error('Malformed event'); - const encRes = await fetch(httpUrl, { method: 'GET' }); - const encData = await encRes.arrayBuffer(); - const decryptedBlob = await decryptFile(encData, mimeType, encFile); - return URL.createObjectURL(decryptedBlob); - } - return httpUrl; - }; - type RoomTimelineProps = { room: Room; eventId?: string; From b5dbb018a314774665b5899ad86e2f88d9eef489 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:19:16 +0530 Subject: [PATCH 3/8] use rust crypto --- src/client/initMatrix.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/client/initMatrix.ts b/src/client/initMatrix.ts index 5a156ad887..90d91de344 100644 --- a/src/client/initMatrix.ts +++ b/src/client/initMatrix.ts @@ -1,11 +1,8 @@ import { createClient, MatrixClient, IndexedDBStore, IndexedDBCryptoStore } from 'matrix-js-sdk'; -import Olm from '@matrix-org/olm'; import { logger } from 'matrix-js-sdk/lib/logger'; import { cryptoCallbacks } from './state/secretStorageKeys'; -global.Olm = Olm; - if (import.meta.env.PROD) { logger.disableAll(); } @@ -37,7 +34,7 @@ export const initClient = async (session: Session): Promise => { verificationMethods: ['m.sas.v1'], }); - await mx.initCrypto(); + await mx.initRustCrypto(); mx.setGlobalErrorOnUnknownDevices(false); mx.setMaxListeners(50); From f8053c8eac5d6a847d2a011039420b06679d6efb Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:20:10 +0530 Subject: [PATCH 4/8] update setPowerLevel usage --- src/client/action/room.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/client/action/room.js b/src/client/action/room.js index cd4995b901..48ae7c4764 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -244,11 +244,7 @@ async function unignore(mx, userIds) { } async function setPowerLevel(mx, roomId, userId, powerLevel) { - const room = mx.getRoom(roomId); - - const powerlevelEvent = room.currentState.getStateEvents('m.room.power_levels')[0]; - - const result = await mx.setPowerLevel(roomId, userId, powerLevel, powerlevelEvent); + const result = await mx.setPowerLevel(roomId, userId, powerLevel); return result; } From b36a2a1c43d19da860513605f43c2312229173d4 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:20:32 +0530 Subject: [PATCH 5/8] fix types --- src/app/components/CapabilitiesAndMediaConfigLoader.tsx | 2 +- src/app/components/CapabilitiesLoader.tsx | 2 +- src/app/features/lobby/Lobby.tsx | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/components/CapabilitiesAndMediaConfigLoader.tsx b/src/app/components/CapabilitiesAndMediaConfigLoader.tsx index 338e528050..574d0ca79c 100644 --- a/src/app/components/CapabilitiesAndMediaConfigLoader.tsx +++ b/src/app/components/CapabilitiesAndMediaConfigLoader.tsx @@ -19,7 +19,7 @@ export function CapabilitiesAndMediaConfigLoader({ [] >( useCallback(async () => { - const result = await Promise.allSettled([mx.getCapabilities(true), mx.getMediaConfig()]); + const result = await Promise.allSettled([mx.getCapabilities(), mx.getMediaConfig()]); const capabilities = promiseFulfilledResult(result[0]); const mediaConfig = promiseFulfilledResult(result[1]); return [capabilities, mediaConfig]; diff --git a/src/app/components/CapabilitiesLoader.tsx b/src/app/components/CapabilitiesLoader.tsx index dad59ec84f..667191e905 100644 --- a/src/app/components/CapabilitiesLoader.tsx +++ b/src/app/components/CapabilitiesLoader.tsx @@ -9,7 +9,7 @@ type CapabilitiesLoaderProps = { export function CapabilitiesLoader({ children }: CapabilitiesLoaderProps) { const mx = useMatrixClient(); - const [state, load] = useAsyncCallback(useCallback(() => mx.getCapabilities(true), [mx])); + const [state, load] = useAsyncCallback(useCallback(() => mx.getCapabilities(), [mx])); useEffect(() => { load(); diff --git a/src/app/features/lobby/Lobby.tsx b/src/app/features/lobby/Lobby.tsx index c963723508..1ab669d256 100644 --- a/src/app/features/lobby/Lobby.tsx +++ b/src/app/features/lobby/Lobby.tsx @@ -3,7 +3,8 @@ import { Box, Icon, IconButton, Icons, Line, Scroll, config } from 'folds'; import { useVirtualizer } from '@tanstack/react-virtual'; import { useAtom, useAtomValue } from 'jotai'; import { useNavigate } from 'react-router-dom'; -import { IJoinRuleEventContent, JoinRule, RestrictedAllowType, Room } from 'matrix-js-sdk'; +import { JoinRule, RestrictedAllowType, Room } from 'matrix-js-sdk'; +import { RoomJoinRulesEventContent } from 'matrix-js-sdk/lib/types'; import { useSpace } from '../../hooks/useSpace'; import { Page, PageContent, PageContentCenter, PageHeroSection } from '../../components/page'; import { HierarchyItem, useSpaceHierarchy } from '../../hooks/useSpaceHierarchy'; @@ -258,7 +259,7 @@ export function Lobby() { const joinRuleContent = getStateEvent( itemRoom, StateEvent.RoomJoinRules - )?.getContent(); + )?.getContent(); if (joinRuleContent) { const allow = From b8f02f5729045ff6046cacaa7e4402aacd9ddbaf Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:02:27 +0530 Subject: [PATCH 6/8] fix deprecated isRoomEncrypted method uses --- src/app/features/room/RoomInput.tsx | 4 ++-- src/app/features/room/RoomTimeline.tsx | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/app/features/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx index 3c78ff3e6b..a1e41a9ae6 100644 --- a/src/app/features/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -155,7 +155,7 @@ export const RoomInput = forwardRef( const safeFiles = files.map(safeFile); const fileItems: TUploadItem[] = []; - if (mx.isRoomEncrypted(roomId)) { + if (room.hasEncryptionStateEvent()) { const encryptFiles = fulfilledPromiseSettledResult( await Promise.allSettled(safeFiles.map((f) => encryptFile(f))) ); @@ -170,7 +170,7 @@ export const RoomInput = forwardRef( item: fileItems, }); }, - [setSelectedFiles, roomId, mx] + [setSelectedFiles, room] ); const pickFile = useFilePicker(handleFiles, true); const handlePaste = useFilePasteHandler(handleFiles); diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 745b18ac84..86b0a03132 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -335,7 +335,10 @@ const useTimelinePagination = ( backwards ? Direction.Backward : Direction.Forward ) ?? timelineToPaginate; // Decrypt all event ahead of render cycle - if (mx.isRoomEncrypted(fetchedTimeline.getRoomId() ?? '')) { + const roomId = fetchedTimeline.getRoomId(); + const room = roomId ? mx.getRoom(roomId) : null; + + if (room?.hasEncryptionStateEvent()) { await to(decryptAllTimelineEvent(mx, fetchedTimeline)); } @@ -419,7 +422,6 @@ const getRoomUnreadInfo = (room: Room, scrollTo = false) => { export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimelineProps) { const mx = useMatrixClient(); - const encryptedRoom = mx.isRoomEncrypted(room.roomId); const [messageLayout] = useSetting(settingsAtom, 'messageLayout'); const [messageSpacing] = useSetting(settingsAtom, 'messageSpacing'); const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents'); @@ -427,7 +429,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad'); const [urlPreview] = useSetting(settingsAtom, 'urlPreview'); const [encUrlPreview] = useSetting(settingsAtom, 'encUrlPreview'); - const showUrlPreview = encryptedRoom ? encUrlPreview : urlPreview; + const showUrlPreview = room.hasEncryptionStateEvent() ? encUrlPreview : urlPreview; const [showHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents'); const setReplyDraft = useSetAtom(roomIdToReplyDraftAtomFamily(room.roomId)); const powerLevels = usePowerLevelsContext(); From 56840ad00ab6d41b205c30f4053356fb66f4a1a9 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:15:57 +0530 Subject: [PATCH 7/8] fix deprecated room.currentState uses --- src/app/molecules/image-pack/ImagePack.jsx | 178 +++++++++--------- .../molecules/room-aliases/RoomAliases.jsx | 3 +- src/app/molecules/room-emojis/RoomEmojis.jsx | 8 +- .../room-encryption/RoomEncryption.jsx | 7 +- .../room-permissions/RoomPermissions.jsx | 6 +- .../room-visibility/RoomVisibility.jsx | 4 +- .../profile-viewer/ProfileViewer.jsx | 13 +- src/app/utils/matrix.ts | 7 +- src/app/utils/room.ts | 6 +- src/client/action/room.js | 7 +- 10 files changed, 128 insertions(+), 111 deletions(-) diff --git a/src/app/molecules/image-pack/ImagePack.jsx b/src/app/molecules/image-pack/ImagePack.jsx index 51ffd0d35d..481b5d5589 100644 --- a/src/app/molecules/image-pack/ImagePack.jsx +++ b/src/app/molecules/image-pack/ImagePack.jsx @@ -1,7 +1,6 @@ -import React, { - useState, useMemo, useReducer, useEffect, -} from 'react'; +import React, { useState, useMemo, useReducer, useEffect } from 'react'; import PropTypes from 'prop-types'; +import { EventTimeline } from 'matrix-js-sdk'; import './ImagePack.scss'; import { openReusableDialog } from '../../../client/action/navigation'; @@ -19,41 +18,41 @@ import ImagePackProfile from './ImagePackProfile'; import ImagePackItem from './ImagePackItem'; import ImagePackUpload from './ImagePackUpload'; import { useMatrixClient } from '../../hooks/useMatrixClient'; - -const renameImagePackItem = (shortcode) => new Promise((resolve) => { - let isCompleted = false; - - openReusableDialog( - Rename, - (requestClose) => ( -
-
{ - e.preventDefault(); - const sc = e.target.shortcode.value; - if (sc.trim() === '') return; - isCompleted = true; - resolve(sc.trim()); - requestClose(); - }} - > - -
- - -
- ), - () => { - if (!isCompleted) resolve(null); - }, - ); -}); +import { getStateEvent } from '../../utils/room'; + +const renameImagePackItem = (shortcode) => + new Promise((resolve) => { + let isCompleted = false; + + openReusableDialog( + + Rename + , + (requestClose) => ( +
+
{ + e.preventDefault(); + const sc = e.target.shortcode.value; + if (sc.trim() === '') return; + isCompleted = true; + resolve(sc.trim()); + requestClose(); + }} + > + +
+ + +
+ ), + () => { + if (!isCompleted) resolve(null); + } + ); + }); function getUsage(usage) { if (usage.includes('emoticon') && usage.includes('sticker')) return 'both'; @@ -78,8 +77,8 @@ function useRoomImagePack(roomId, stateKey) { const room = mx.getRoom(roomId); const pack = useMemo(() => { - const packEvent = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); - return ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent()) + const packEvent = getStateEvent(room, 'im.ponies.room_emotes', stateKey); + return ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent()); }, [room, stateKey]); const sendPackContent = (content) => { @@ -96,10 +95,13 @@ function useUserImagePack() { const mx = useMatrixClient(); const pack = useMemo(() => { const packEvent = mx.getAccountData('im.ponies.user_emotes'); - return ImagePackBuilder.parsePack(mx.getUserId(), packEvent?.getContent() ?? { - pack: { display_name: 'Personal' }, - images: {}, - }) + return ImagePackBuilder.parsePack( + mx.getUserId(), + packEvent?.getContent() ?? { + pack: { display_name: 'Personal' }, + images: {}, + } + ); }, [mx]); const sendPackContent = (content) => { @@ -119,10 +121,7 @@ function useImagePackHandles(pack, sendPackContent) { if (typeof key !== 'string') return undefined; let newKey = key?.replace(/\s/g, '_'); if (pack.getImages().get(newKey)) { - newKey = suffixRename( - newKey, - (suffixedKey) => pack.getImages().get(suffixedKey), - ); + newKey = suffixRename(newKey, (suffixedKey) => pack.getImages().get(suffixedKey)); } return newKey; }; @@ -163,7 +162,7 @@ function useImagePackHandles(pack, sendPackContent) { 'Delete', `Are you sure that you want to delete "${key}"?`, 'Delete', - 'danger', + 'danger' ); if (!isConfirmed) return; pack.removeImage(key); @@ -246,14 +245,17 @@ function ImagePack({ roomId, stateKey, handlePackDelete }) { }; const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; - const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel); + const canChange = room + .getLiveTimeline() + .getState(EventTimeline.FORWARDS) + ?.hasSufficientPowerLevelFor('state_default', myPowerlevel); const handleDeletePack = async () => { const isConfirmed = await confirmDialog( 'Delete Pack', `Are you sure that you want to delete "${pack.displayName}"?`, 'Delete', - 'danger', + 'danger' ); if (!isConfirmed) return; handlePackDelete(stateKey); @@ -272,10 +274,8 @@ function ImagePack({ roomId, stateKey, handlePackDelete }) { onAvatarChange={canChange ? handleAvatarChange : null} onEditProfile={canChange ? handleEditProfile : null} /> - { canChange && ( - - )} - { images.length === 0 ? null : ( + {canChange && } + {images.length === 0 ? null : (
Image @@ -299,14 +299,14 @@ function ImagePack({ roomId, stateKey, handlePackDelete }) {
{pack.images.size > 2 && ( + )} + {handlePackDelete && ( + )} - { handlePackDelete && }
)}
@@ -359,7 +359,7 @@ function ImagePackUser() { onEditProfile={handleEditProfile} /> - { images.length === 0 ? null : ( + {images.length === 0 ? null : (
Image @@ -379,14 +379,10 @@ function ImagePackUser() { ))}
)} - {(pack.images.size > 2) && ( + {pack.images.size > 2 && (
)} @@ -435,29 +431,33 @@ function ImagePackGlobal() {
Global packs
- { - roomIdToStateKeys.size > 0 - ? [...roomIdToStateKeys].map(([roomId, stateKeys]) => { - const room = mx.getRoom(roomId); + {roomIdToStateKeys.size > 0 ? ( + [...roomIdToStateKeys].map(([roomId, stateKeys]) => { + const room = mx.getRoom(roomId); + return stateKeys.map((stateKey) => { + const data = getStateEvent(room, 'im.ponies.room_emotes', stateKey); + const pack = ImagePackBuilder.parsePack(data?.getId(), data?.getContent()); + if (!pack) return null; return ( - stateKeys.map((stateKey) => { - const data = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); - const pack = ImagePackBuilder.parsePack(data?.getId(), data?.getContent()); - if (!pack) return null; - return ( -
- handleChange(roomId, stateKey)} isActive /> -
- {pack.displayName ?? 'Unknown'} - {room.name} -
-
- ); - }) +
+ handleChange(roomId, stateKey)} + isActive + /> +
+ {pack.displayName ?? 'Unknown'} + {room.name} +
+
); - }) - :
No global packs
- } + }); + }) + ) : ( +
+ No global packs +
+ )}
); diff --git a/src/app/molecules/room-aliases/RoomAliases.jsx b/src/app/molecules/room-aliases/RoomAliases.jsx index 876d063fab..a96fbb8bc3 100644 --- a/src/app/molecules/room-aliases/RoomAliases.jsx +++ b/src/app/molecules/room-aliases/RoomAliases.jsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomAliases.scss'; +import { EventTimeline } from 'matrix-js-sdk'; import cons from '../../../client/state/cons'; import { Debounce } from '../../../util/common'; @@ -108,7 +109,7 @@ function RoomAliases({ roomId }) { const [deleteAlias, setDeleteAlias] = useState(null); const [validate, setValidateToDefault, handleAliasChange] = useValidate(hsString); - const canPublishAlias = room.currentState.maySendStateEvent('m.room.canonical_alias', userId); + const canPublishAlias = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.maySendStateEvent('m.room.canonical_alias', userId); useEffect(() => { isMountedStore.setItem(true) diff --git a/src/app/molecules/room-emojis/RoomEmojis.jsx b/src/app/molecules/room-emojis/RoomEmojis.jsx index da09ea8646..c45a9afab8 100644 --- a/src/app/molecules/room-emojis/RoomEmojis.jsx +++ b/src/app/molecules/room-emojis/RoomEmojis.jsx @@ -1,6 +1,7 @@ import React, { useReducer, useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomEmojis.scss'; +import { EventTimeline } from 'matrix-js-sdk'; import { suffixRename } from '../../../util/common'; @@ -10,12 +11,13 @@ import Input from '../../atoms/input/Input'; import Button from '../../atoms/button/Button'; import ImagePack from '../image-pack/ImagePack'; import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { getStateEvent, getStateEvents } from '../../utils/room'; function useRoomPacks(room) { const mx = useMatrixClient(); const [, forceUpdate] = useReducer((count) => count + 1, 0); - const packEvents = room.currentState.getStateEvents('im.ponies.room_emotes'); + const packEvents = getStateEvents(room, 'im.ponies.room_emotes'); const unUsablePacks = []; const usablePacks = packEvents.filter((mEvent) => { if (typeof mEvent.getContent()?.images !== 'object') { @@ -40,7 +42,7 @@ function useRoomPacks(room) { }; }, [room, mx]); - const isStateKeyAvailable = (key) => !room.currentState.getStateEvents('im.ponies.room_emotes', key); + const isStateKeyAvailable = (key) => !getStateEvent(room, 'im.ponies.room_emotes', key); const createPack = async (name) => { const packContent = { @@ -80,7 +82,7 @@ function RoomEmojis({ roomId }) { const { usablePacks, createPack, deletePack } = useRoomPacks(room); - const canChange = room.currentState.maySendStateEvent('im.ponies.room_emote', mx.getUserId()); + const canChange = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.maySendStateEvent('im.ponies.room_emote', mx.getUserId()); const handlePackCreate = (e) => { e.preventDefault(); diff --git a/src/app/molecules/room-encryption/RoomEncryption.jsx b/src/app/molecules/room-encryption/RoomEncryption.jsx index 47250f4723..6db87a8e98 100644 --- a/src/app/molecules/room-encryption/RoomEncryption.jsx +++ b/src/app/molecules/room-encryption/RoomEncryption.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; import './RoomEncryption.scss'; - +import { EventTimeline } from 'matrix-js-sdk'; import Text from '../../atoms/text/Text'; import Toggle from '../../atoms/button/Toggle'; @@ -9,13 +9,14 @@ import SettingTile from '../setting-tile/SettingTile'; import { confirmDialog } from '../confirm-dialog/ConfirmDialog'; import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { getStateEvents } from '../../utils/room'; function RoomEncryption({ roomId }) { const mx = useMatrixClient(); const room = mx.getRoom(roomId); - const encryptionEvents = room.currentState.getStateEvents('m.room.encryption'); + const encryptionEvents = getStateEvents(room, 'm.room.encryption'); const [isEncrypted, setIsEncrypted] = useState(encryptionEvents.length > 0); - const canEnableEncryption = room.currentState.maySendStateEvent('m.room.encryption', mx.getUserId()); + const canEnableEncryption = room.getLiveTimeline().getState(EventTimeline.FORWARDS).maySendStateEvent('m.room.encryption', mx.getUserId()); const handleEncryptionEnable = async () => { const joinRule = room.getJoinRule(); diff --git a/src/app/molecules/room-permissions/RoomPermissions.jsx b/src/app/molecules/room-permissions/RoomPermissions.jsx index f8cd048f54..7629558fee 100644 --- a/src/app/molecules/room-permissions/RoomPermissions.jsx +++ b/src/app/molecules/room-permissions/RoomPermissions.jsx @@ -1,6 +1,7 @@ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import './RoomPermissions.scss'; +import { EventTimeline } from 'matrix-js-sdk'; import { getPowerLabel } from '../../../util/matrixUtil'; import { openReusableContextMenu } from '../../../client/action/navigation'; @@ -16,6 +17,7 @@ import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.s import { useForceUpdate } from '../../hooks/useForceUpdate'; import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { getStateEvent } from '../../utils/room'; const permissionsInfo = { users_default: { @@ -176,9 +178,9 @@ function RoomPermissions({ roomId }) { useRoomStateUpdate(roomId); const mx = useMatrixClient(); const room = mx.getRoom(roomId); - const pLEvent = room.currentState.getStateEvents('m.room.power_levels')[0]; + const pLEvent = getStateEvent(room, 'm.room.power_levels'); const permissions = pLEvent.getContent(); - const canChangePermission = room.currentState.maySendStateEvent('m.room.power_levels', mx.getUserId()); + const canChangePermission = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.maySendStateEvent('m.room.power_levels', mx.getUserId()); const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel ?? 100; const handlePowerSelector = (e, permKey, parentKey, powerLevel) => { diff --git a/src/app/molecules/room-visibility/RoomVisibility.jsx b/src/app/molecules/room-visibility/RoomVisibility.jsx index 6579513a86..f9bb815dd5 100644 --- a/src/app/molecules/room-visibility/RoomVisibility.jsx +++ b/src/app/molecules/room-visibility/RoomVisibility.jsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import './RoomVisibility.scss'; - +import { EventTimeline } from 'matrix-js-sdk'; import Text from '../../atoms/text/Text'; import RadioButton from '../../atoms/button/RadioButton'; @@ -74,7 +74,7 @@ function RoomVisibility({ roomId }) { const roomVersion = Number(mCreate?.room_version ?? 0); const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; - const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel); + const canChange = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.hasSufficientPowerLevelFor('state_default', myPowerlevel); const items = [{ iconSrc: isSpace ? SpaceLockIC : HashLockIC, diff --git a/src/app/organisms/profile-viewer/ProfileViewer.jsx b/src/app/organisms/profile-viewer/ProfileViewer.jsx index b4ab747304..aff26fefe8 100644 --- a/src/app/organisms/profile-viewer/ProfileViewer.jsx +++ b/src/app/organisms/profile-viewer/ProfileViewer.jsx @@ -1,6 +1,7 @@ import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import './ProfileViewer.scss'; +import { EventTimeline } from 'matrix-js-sdk'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; @@ -44,13 +45,14 @@ function ModerationTools({ roomId, userId }) { const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel || 0; const powerLevel = roomMember?.powerLevel || 0; + const roomState = room.getLiveTimeline().getState(EventTimeline.FORWARDS); const canIKick = roomMember?.membership === 'join' && - room.currentState.hasSufficientPowerLevelFor('kick', myPowerLevel) && + roomState?.hasSufficientPowerLevelFor('kick', myPowerLevel) && powerLevel < myPowerLevel; const canIBan = ['join', 'leave'].includes(roomMember?.membership) && - room.currentState.hasSufficientPowerLevelFor('ban', myPowerLevel) && + roomState?.hasSufficientPowerLevelFor('ban', myPowerLevel) && powerLevel < myPowerLevel; const handleKick = (e) => { @@ -169,8 +171,10 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; const userPL = room.getMember(userId)?.powerLevel || 0; + const roomState = room.getLiveTimeline().getState(EventTimeline.FORWARDS); + const canIKick = - room.currentState.hasSufficientPowerLevelFor('kick', myPowerlevel) && userPL < myPowerlevel; + roomState?.hasSufficientPowerLevelFor('kick', myPowerlevel) && userPL < myPowerlevel; const isBanned = member?.membership === 'ban'; @@ -343,8 +347,9 @@ function ProfileViewer() { const powerLevel = roomMember?.powerLevel || 0; const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel || 0; + const roomState = room.getLiveTimeline().getState(EventTimeline.FORWARDS); const canChangeRole = - room.currentState.maySendEvent('m.room.power_levels', mx.getUserId()) && + roomState?.maySendEvent('m.room.power_levels', mx.getUserId()) && (powerLevel < myPowerLevel || userId === mx.getUserId()); const handleChangePowerLevel = async (newPowerLevel) => { diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index 8613f36abe..db9794fd0f 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -4,6 +4,7 @@ import { encryptAttachment, } from 'browser-encrypt-attachment'; import { + EventTimeline, MatrixClient, MatrixError, MatrixEvent, @@ -173,7 +174,7 @@ export const eventWithShortcode = (ev: MatrixEvent) => export const getDMRoomFor = (mx: MatrixClient, userId: string): Room | undefined => { const dmLikeRooms = mx .getRooms() - .filter((room) => mx.isRoomEncrypted(room.roomId) && room.getMembers().length <= 2); + .filter((room) => room.hasEncryptionStateEvent() && room.getMembers().length <= 2); return dmLikeRooms.find((room) => room.getMember(userId)); }; @@ -205,7 +206,9 @@ export const guessDmRoomUserId = (room: Room, myUserId: string): string => { if (member) return member.userId; // if there are no joined members other than us, use the oldest member - const member1 = getOldestMember(room.currentState.getMembers()); + const member1 = getOldestMember( + room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.getMembers() ?? [] + ); return member1?.userId ?? myUserId; }; diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index 8cf33a8ffa..8e991fa4fe 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -30,10 +30,12 @@ export const getStateEvent = ( room: Room, eventType: StateEvent, stateKey = '' -): MatrixEvent | undefined => room.currentState.getStateEvents(eventType, stateKey) ?? undefined; +): MatrixEvent | undefined => + room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.getStateEvents(eventType, stateKey) ?? + undefined; export const getStateEvents = (room: Room, eventType: StateEvent): MatrixEvent[] => - room.currentState.getStateEvents(eventType); + room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.getStateEvents(eventType) ?? []; export const getAccountData = ( mx: MatrixClient, diff --git a/src/client/action/room.js b/src/client/action/room.js index 48ae7c4764..90b748104d 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -1,3 +1,4 @@ +import { EventTimeline } from 'matrix-js-sdk'; import { getIdServer } from '../../util/matrixUtil'; /** @@ -63,7 +64,7 @@ function guessDMRoomTargetId(room, myUserId) { if (oldestMember) return oldestMember.userId; // if there are no joined members other than us, use the oldest member - room.currentState.getMembers().forEach((member) => { + room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.getMembers().forEach((member) => { if (member.userId === myUserId) return; if (typeof oldestMemberTs === 'undefined' || (member.events.member && member.events.member.getTs() < oldestMemberTs)) { @@ -250,7 +251,7 @@ async function setPowerLevel(mx, roomId, userId, powerLevel) { async function setMyRoomNick(mx, roomId, nick) { const room = mx.getRoom(roomId); - const mEvent = room.currentState.getStateEvents('m.room.member', mx.getUserId()); + const mEvent = room.getLiveTimeline().getState(EventTimeline.FORWARDS).getStateEvents('m.room.member', mx.getUserId()); const content = mEvent?.getContent(); if (!content) return; await mx.sendStateEvent(roomId, 'm.room.member', { @@ -261,7 +262,7 @@ async function setMyRoomNick(mx, roomId, nick) { async function setMyRoomAvatar(mx, roomId, mxc) { const room = mx.getRoom(roomId); - const mEvent = room.currentState.getStateEvents('m.room.member', mx.getUserId()); + const mEvent = room.getLiveTimeline().getState(EventTimeline.FORWARDS).getStateEvents('m.room.member', mx.getUserId()); const content = mEvent?.getContent(); if (!content) return; await mx.sendStateEvent(roomId, 'm.room.member', { From 6835b12c13841188f3b6b0f64cc9181e799af796 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:20:04 +0530 Subject: [PATCH 8/8] fix deprecated import/export room keys func --- .../molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx | 2 +- .../molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx b/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx index 1ce7e78ad6..46e7602ef0 100644 --- a/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx +++ b/src/app/molecules/import-export-e2e-room-keys/ExportE2ERoomKeys.jsx @@ -41,7 +41,7 @@ function ExportE2ERoomKeys() { type: cons.status.IN_FLIGHT, }); try { - const keys = await mx.exportRoomKeys(); + const keys = await mx.getCrypto()?.exportRoomKeys(); if (isMountStore.getItem()) { setStatus({ isOngoing: true, diff --git a/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx b/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx index 9f0ab793e6..cc03d12876 100644 --- a/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx +++ b/src/app/molecules/import-export-e2e-room-keys/ImportE2ERoomKeys.jsx @@ -46,7 +46,7 @@ function ImportE2ERoomKeys() { type: cons.status.IN_FLIGHT, }); } - await mx.importRoomKeys(JSON.parse(keys)); + await mx.getCrypto()?.importRoomKeys(JSON.parse(keys)); if (isMountStore.getItem()) { setStatus({ isOngoing: false,