* Add `type` property to Sorter
So that we can uniquely identify any given sorting algorithm.
* Add a getter for the active sort algorithm
* Define a setting to store the sorting algorithm
* Add a method to resort the list of rooms
- Just one method where you specify the sorting algorithm by type.
- Persist the new sorting algorithm using SettingsStore.
* On startup, use preferred sorter
* Add tests
* Implement the favourite filter
* Make the room node capable of dealing with filters
- Holds data to indicate which filters apply
- Provides method to check if a given set of filters apply to this node
- Provides a method to recalculate which filters apply
* Wire up the filtering mechanism in skip list
* Use filters in the store
* Remove else
* Use a set instead of map
* Avoid destroying calls until they are hidden from the UI
We often want calls to exist even when no more participants are left in the MatrixRTC session. So, we should avoid destroying calls as long as they're being presented in the UI; this means that the user has an intent to either join the call or continue looking at an error screen, and we shouldn't interrupt that interaction.
The RoomViewStore is now what takes care of creating and destroying calls, rather than the CallView. In general it seems kinda impossible to safely create and destroy model objects from React lifecycle hooks, so moving this responsibility to a store seemed appropriate and resolves existing issues with calls in React strict mode.
* Wait for a close action before closing a call
This creates a distinction between the user hanging up and the widget being ready to close, which is useful for allowing Element Call to show error screens when disconnected from the call, for example.
* Don't expect a 'close' action in video rooms
These use the returnToLobby option and are expected to remain visible when the user leaves the call.
* Add method to await space store setup
Otherwise, the room list store will get incorrect information about
spaces and thus will produce an incorrect roomlist.
* Implement a way to filter by active space
Implement a way to filter by active space
* Fix broken jest tests
* Fix typo
* Rename `isReady` to `storeReadyPromise`
* Fix mock in test
* Update the store on action
* Add more tests
* Add newlines between case blocks
* Make code more readable
- Make if/else more consistent
- Add comment on findAndAddRoom()
* Add more tests
* Remove redundant code
On a timeline action, we return early if payload.room is falsy.
So then why do we need to retry fetching the room?
I think this can be removed but will ask others if there's some
conext I'm missing.
* Fix test
* Remove more redundant code
* Add more tests
* Explain intention in comment
* Emit only once even when adding multiple rooms
* Add missing tsdoc
* Implement enough of the new store to get a list of rooms
* Make it possible to swap sorting algorithm
* Don't attach to window object
We don't want the store to be created if the labs flag is off
* Remove the store class
Probably best to include this PR with the minimal vm implmentation
* Create a new room list store that wraps around the skip list
* Create a minimal view model
* Fix CI
* Add some basic tests for the store
* Write more tests
* Add some jsdoc comments
* Add more documentation
* Add more docs
* Implement a skip list for storing rooms
This data structure stores rooms in a given sorted order and allows for
very fast insertions and deletions.
* Export function to get last timestamp of room
* Write tests for the skip list
* Implement enough of the new store to get a list of rooms
* Make it possible to swap sorting algorithm
* Fix comment
* Don't attach to window object
We don't want the store to be created if the labs flag is off
* Remove the store class
Probably best to include this PR with the minimal vm implmentation
* feat(new room list)!: hide Favourites and People meta spaces when the new room list is enabled
* test(space store): add testcase for new labs flag
* feat(quick settings): hide pin to sidebar and more options and add extra margin
* Construct history on setCard
So that back buttons are always shown in the right panel
* Check card state to ensure operation is atomic
* Fix tests
* Fix lint
* Remove null case
* Fix broken test
* Make themed widgets reflect the effective theme
So that widgets such as Element Call will show up in the right theme even if the app is set to match the system theme.
* Remove debug log line
* 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>
* Add commercial licence and update config files
* Update license in headers
* Revert "Update license in headers"
This reverts commit 7ed7949485.
* 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.
* Factor out crypto setup process into a store
To make components pure and avoid react 18 dev mode problems due
to components making requests when mounted.
* fix test
* test for the store
* Add comment
* 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>
This is no longer needed as the right panel always corresponds to the currently viewed room/space only.
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use `CryptoApi.getKeyBackupInfo` instead of deprecated `MatrixClient.getKeyBackupVersion`
* Review changes
---------
Co-authored-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 4d4e037391.
* Revert "Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `SendMessageComposer.tsx`"
This reverts commit 6bf06da02c.
* Refactor feeding of events to widgets
This is a pure refactor with (hopefully) no behavior changes.
* Feed events to widgets as they are decrypted (even if out of order)
The code that feeds events to widgets tries to enforce that only events from the end of the timeline will be passed through. This is to prevent old, irrelevant events from being passed to widgets as the timeline is back-filled. However, since encrypted events need to be decrypted asynchronously, it's not possible to feed them to a widget in a strictly linear order without introducing some kind of blocking or unreliable delivery. This code has been dropping events when they're decrypted out of order, which we consider to be an undesirable behavior.
The solution provided here is that, to reflect the asynchronous nature of decryption, encrypted events that arrive at the end of the timeline will be fed to a widget whenever they finish decrypting, even if this means feeding them out of order. For now we're not aware of any widgets that care about knowing the exact order of events in the timeline, but if such a need reveals itself later, we can explore adding ordering information to this part of the widget API.
* Add braces to if