* Add new custom component api.
* Remove context menu, refactor
* fix types
* Add a test for custom modules.
* tidy
* Rewrite for new API
* Update tests
* lint
* Allow passing in props to original component
* Add hinting
* Update tests to be complete
* lint a bit more
* update docstring
* update @element-hq/element-web-module-api to 1.1.0
* fix types
* updates
* hide jump to bottom button that was causing flakes
* lint
* lint
* Use module matrix event interface instead.
* update to new module sdk
* adapt custom module sample
* Issues caught by Sonar
* lint
* fix issues
* make the comment make sense
* fix import
* Debug flaky jest test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Discard changes to jest.config.ts
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from defer to PromiseWithResolvers
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add modernizr check
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix up type for `finished` result of Modal
The `finished` promise can be called with an empty array, for example if the
dialog is closed by a background click. This was not correctly represented in
the typing. Fix that, and add some documentation while we're at it.
* Type fixes to onFinished callbacks from Modal
These can all be called with zero arguments, despite what the type annotations
may say, so mark them accordingly.
* Remove uses of Modal `onFinished` property
... because it is confusing.
Instead, use the `finished` promise returned by `createDialog`.
* Modal: remove support for now-unused `onFinished` prop
* StopGapWidgetDriver: use `await` instead of promise chaining
* Fix up unit tests
* Update react monorepo to v19
* Import JSX explicitly for React 19 compatibility
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update usages of refs for React 19 compatibility
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update react imports
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Avoid legacy contexts as much as possible
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Avoid deprecated React symbols
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Stash
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update usages of refs for React 19 compatibility
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch pillify to use a html-react-parser approach rather than DOM muddling
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate react html parsing
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate react html parsing
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate html parsing
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Memoize the EventContentBody component
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate html parsing
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Simplify
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Discard changes to src/Linkify.tsx
* Discard changes to src/components/views/messages/TextualBody.tsx
* Discard changes to src/settings/handlers/AbstractLocalStorageSettingsHandler.ts
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Prepare for React 19 upgrade
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove stale comment
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* feat(security tab)!: remove secure backup panel
BREAKING CHANGE: the key storage user interaction are moved into the Encryption tab. The debugging information are moved into the devtools.
* feat(security tab)!: remove cross signing section
BREAKING CHANGE: the cryptographic identity can be reseted in the Encryption tab. The debugging information are moved into the devtools
* feat(security tab)!: remove cryptography section
BREAKING CHANGE: this section can be found in the Advanced section of the encryption tab.
* test(security tab): update snapshot
* chore(security tab): remove unused component and function
* chore(security tab): update i18n
* test(e2e): remove `backups.spec.ts`
* Switch away from nesting React trees and mangling the DOM
By parsing HTML events and manipulating the AST before passing it to React
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use MatrixClientContext in Pill now that we are in the main React tree
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add missing import
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Break import cycles
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Minimise
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Docs
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* SessionLock: reduce the stale time
30 seconds staring at a spinner while we wait for a stale lock to expire is
rather painful. Pretty sure 15 seconds will be fine.
* SessionLock: deal with the clock having been wound back
If a previous session terminated uncleanly, and then the clock is wound back,
we could be waiting a very long time for the previous session's claim to
expire.
We can fix this by simply treating a future claim the same as "now", and
waiting for the normal stale timeout.
* fixup! SessionLock: deal with the clock having been wound back
* start hide
* Move useSettingsValueWithSetter to useSettings
* Add new setting showMediaEventIds
* Add a migration path
* Add an action button to hide settings.
* Tweaks to MImageBody to support new setting.
* Fixup and add tests
* add description for migration
* docs fixes
* add type
* i18n
* appese prettier
* Add tests for HideActionButton
* lint
* lint
* First pass at support for previewing/hiding images.
* Add a test for video files.
* First pass at supporting hiding video files.
* Use a hook for media visibility.
* Drop setting hook usage.
* Fixup MImageBody test
* Fixup tests
* Support functional components for message body rendering.
* Add a comment
* Move props into IProps
* Use new wrapping logic
* lint
* fixup
* allow for a delay for the image to render
* remove .only
* lint
* Fix jest test
* Fixup tests.
* make tests happy
* Improve comments
* review fixes
* unbreak test
* Device dehydrateion: remove .well-known check
Per https://github.com/element-hq/element-web/issues/29387, this is redundant
* Update src/utils/device/dehydration.ts
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* CreateSecretStorageDialog: error handling
I'm fed up with setup operations in EW failing silently. Rather than leaving
the user with a mysteriously broken client, let's at least tell them that
something has gone wrong, so that they can report the issue and we can
investigate.
Obviously, showing an unactionable Error dialog is a last resort: ideally, we
should handle the error ourselves, or give the user actionable steps to resolve
the problem. But that takes significant design and engineering.
Just swallowing errors is the worst of all possible options.
* Fix typo in test name
* Improve test coverage
* dehydration: fix documentation
* initialiseDehydration: improve name
... to make it clearer that it does nothing if dehydration is disabled
* initialiseDehydration: remove dependency on MatrixClientPeg
We're trying to move away from relying on `MatrixClientPeg` everywhere, and
this is a particularly easy win.
* Apply lint rule @typescript-eslint/no-empty-object-type
To avoid the footgun that is https://www.totaltypescript.com/the-empty-object-type-in-typescript
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Schedule dehydration on reload
* fix test and use the right function to check dehydration is enabled
* use dehydration helper function when scheduling dehydration on restart
* fix test by passing in client object
* Switch OIDC primarily to new `/auth_metadata` API
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Simplify the world
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to secure random strings
Because the js-sdk methods are changing and there's no reason for these
not to use the secure versions. The dedicated upper/lower functions were
*only* used in this one case, so this should do the exact same thing with
the one exported function.
Requires https://github.com/matrix-org/matrix-js-sdk/pull/4621 (merge both together)
* Change remaining instances of randomString
which I somehow entirely missed the first time.
* Fix import order
* Refine `SettingsSection` & `SettingsTab`
* Add encryption tab
* Add recovery section
* Add device verification
* Rename `Panel` into `State`
* Update & add tests to user settings common
* Add tests to `RecoveryPanel`
* Add tests to `ChangeRecoveryKey`
* Update CreateSecretStorageDialog-test snapshot
* Add tests to `EncryptionUserSettingsTab`
* Update existing screenshots of e2e tests
* Add new encryption tab ownership to `@element-hq/element-crypto-web-reviewers`
* Add e2e tests
* Fix monospace font and add figma link to hardcoded value
* Add unit to Icon
* Improve e2e doc
* Assert that the crypto module is defined
* Add classname doc
* Fix typo
* Use `good` state instead of default
* Rename `ChangeRecoveryKey.isSetupFlow` into `ChangeRecoveryKey.userHasKeyBackup`
* Move `deleteCachedSecrets` fixture in `recovery.spec.ts`
* Use one callback instead of two in `RecoveryPanel`
* Fix docs and naming of `utils.createBot`
* Fix typo in `RecoveryPanel`
* Add more doc to the state of the `EncryptionUserSettingsTab`
* Rename `verification_required` into `set_up_encryption`
* Update test
* ADd new license
* Very early WIP of rejigged e2e error toast code
* Update comments and doc
* Assert that `recoveryKey.encodedPrivateKey` is always defined
* Add comments to explain how the secrets could be uncached
* Use `matrixClient.secretStorage.getDefaultKeyId` instead of `matrixClient.getCrypto().checkKeyBackupAndEnable` to know if we need to set up a recovery key
* Update existing screenshot to add encryption tab.
* Fix tests
* Remove unused file!
* Remove test for unused file
* Show 'set up encryption' in the 'other' case.
* Test 'key storage out of sync' toast
* Update tests
* Fix test & make toast look correct
* Use new labels when changing the recovery key
* Fix docs
* Don't reset key backup when creating a recovery key
* Add playwright test for toast
* Dismiss the toast as it's now in the way due to being wider
* Doesn't look like this needs to be async
* Typo
Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
* Typo
Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
* Override width for just this toast
---------
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
Co-authored-by: Florian Duros <florianduros@element.io>
Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
* Switch to React18 useId
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Enable react-compiler eslint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix an easy one
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Disable in tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix usage of useRef as memoization
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix mutation of external values in hooks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make React compiler happy about some frankly non-issues
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix MapMock
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert MemberListViewModel.tsx changes and disable linter per line
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make viewmodel compatible with react-compiler linter
- Remove searchQuery ref/state and instead pass this query to the
loadMember function.
- Now we no longer need a separate search function
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: R Midhun Suresh <hi@midhun.dev>
* Clear account idb table on logout
to remove old deactivated refresh token when logging out
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Simplify code
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* React to MatrixEvent sender/target sentinels being updated for rendering state events
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* React to sentinel changes in EventListSummary
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove ts-prune as it has been archived over a year ago
knip replaces it has better configuration
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update knip config
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add commercial licence and update config files
* Update license in headers
* Revert "Update license in headers"
This reverts commit 7ed7949485e88889a9ffc8075a9df1f8e936777e.
* Update only spdx id
* Remove LicenseRef- from package.json
LicenseRef- no longer allowed in npm v3 package.json
This fixes the warning in the logs and failing build check.
* Hide 3pid account settings if account is managed externally
As they would be disabled and just confusing otherwise
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Show manage device button instead of sign out button for other devices in OIDC mode
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tidy up
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Harden Settings using mapped types
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix issues found during hardening
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove oidc native flow stale key
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove abandoned Voice Broadcasts labs flag
Any existing voice broadcasts will be shown as a series of voice messages which will sequence play as normal
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove dead code
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove Twemoji SBIX font in favour of COLRv0
as it is supported everywhere we need it
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused mock
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* PoC implementation for is_animated m.image flag
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update MSC reference
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add `asyncFilter`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `MemberListStore.tsx`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `EventIndex.tsx`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `SendMessageComposer.tsx`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `ScalarMessaging.ts`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `RolesRoomSettingsTab.tsx`
* Add reject doc to `asyncFilter`
* Reverse `MemberListStore.loadMembers` condition
* Remove async for `ScalarMessaging.ts`
* Display permission section only after `isEncrypted` is computed
* Display composer only after `isEncrypted` is computed
* Revert "Display composer only after `isEncrypted` is computed"
This reverts commit 4d4e0373919ad4b0e6fa53de63786c880ed6845a.
* Revert "Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `SendMessageComposer.tsx`"
This reverts commit 6bf06da02ca2c0cf72f0e12a418d07f05a86da3a.
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `DeviceListener.ts`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `Searching.ts`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `SlidingSyncManager.ts`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `EncryptionEvent.tsx`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `ReportEventDialog.tsx`
* Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `RoomNotifications.tsx`
* Fix MessagePanel-test.tsx
* ReplaceReplace `MatrixCient..isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `shouldSkipSetupEncryption.ts`
* Add missing `await`
* Use `Promise.any` instead of `asyncSome`
* Add `asyncSomeParallel`
* Use `asyncSomeParallel` instead of `asyncSome`
* Update type and usage of window.matrixChat to be better React 18 friendly
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Improve coverage
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make modules import async to make the file testable
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>