* fix: avoid to render `AudioPlayerViewModel` when `MAudioBody` is inherited
* fix: avoid `Playback.prepare` to fail when called twice
* fix: add `decoding` to playback type
* refactor: fix circular deps
* refactor: extract `MockedPlayback` from `AudioPlayerViewModel`
* test: add `MAudioBody` basic test
* test: add tests for `MVoiceMessageBody`
* fix: lint
* fix: improve aria role and label on pinned message banner
* fix: change pinned message badge background for contrast
* fix: link pinned message button to content
* test: update tests
* fix: add aria-describedby on pinned message badge
* feat: use `aria-describedby` instead of `aria-description`
* test: update room view snapshot
* test: update snapshot
* fix: put id only textual body upper div
* fix: use lodash uniqueId
* test: update snapshots
* Always show media from your own user
* Update usages of useMediaVisible
* lint
* Add a test for HideActionButton
* Improve docs
* Document the event
* fixup test
* Allow users to hide their own media if they wish.
* Update tests
* remove a check\
* tweak
* tweak
* Introduce disposables to track sub vms and event listeners
* Remove old code
* Use disposable in BaseViewModel
* Update vm so that the listener is tracked through disposable
* No-op on dispose call instead of throwing error
* Throw error in trackListener as well
* Fix audio player vm
* Expose isDisposed through base vm
* Dispose AudioPlayerViewModel
* Fix downloading files with authenticated media API
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
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>
* feat: add `PlayPauseButton` to storybook
* feat: add generic media body
* feat: add seekbar component
* chore: add ViewWrapper to help writing stories with vm
* refactor: move `formatBytes` from `formattingUtils` into shared component
* refactor: add `className` props to `Clock`
* feat: add new audio player component
* test(e2e): add screenshots for new shared components
* feat: add AudioPlayerViewModel
* feat: use new audio player in `MAudioBody`
* refactor: remove old audio player
* test(e2e): update existing tests
* refactor: remove unused `DurationClock`
* refactor: rename `SeekBar` into `LegacySeekBar`
* Very first pass at shared component views
Turn the trivial TextualEvent into a shared component with a separate view
model for element web. Args to view model will probably change to be more
specific and VM typer needs abstracting out into an interface, but should
give the general idea.
* Remove old TextualEvent
* Pass showHiddenEvents
Because we used it anyway, we just cheated by getting it from the context
* Factor out common view model stuff
* Move ViewModel interface into the shared components
* Add tiny wrapper hook
* Move showHiddenEvents into props fully
* Fill in stories / test
* chore: setup storybook
cherry pick edc5e8705674b8708d986910b02b5d2545777fb3
from florianduros/storybook
* Add TextualEvent component to storybook
* Add mock view model & snapshot
* Remove old style stories entry
* Change import
* Change import
* Prettier
* Add paxckage patch to @types/mdx
for React 19 compat
* Pass getSnapshot as getServerSnapshot too
* Maybe make sonar regognise tests as tests
* Typo
* Use storybook reacvt-vite
There's no reason to use the react-webpack plugin just because our app
is stuck on webpack, it just means we have vite as a dependency too.
* Change here too
* Workaround for incomatible types in rollup
https://github.com/rollup/rollup/issues/5199
* Remove webpack styling addon
Not necessary now we're using vite
* Hopefully do screenshot testing...
* need newer node
* quote issues
* Make it an npm script
* colons
* use right port
* Install playwright browsers
* Try without the if
* Oh right, we need the headless shell
* Pass flag to store received screenshots
and upload diffs too
* Update snapshot from received
* Include platform in snapshot / received dir
because font rendering differs between platforms
* Suffix snapshots with platform instead
like we do for playwright
* Remove unnecessary env vars
and better name
* Add some comments
* Prettier
* Fix yarn.lock
* Memoise vm creation
Co-authored-by: Florian Duros <florianduros@element.io>
* Add implements
Co-authored-by: Florian Duros <florianduros@element.io>
* Fix listener interface
* Add implements
Co-authored-by: Florian Duros <florianduros@element.io>
* Fix types
* Fix more types
* Revert useMemo
as this isn't a hook
* Unused import
* Add missing playwright step
* Add return type annotation
* Change to add / remove subscription callback
* Change to 'add' rather than 'subs.subscribe'
* Add cache specifier for only shell playwright browsers
* Add copyright headers
---------
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
Co-authored-by: Florian Duros <florianduros@element.io>
* Add support for allowDownloadingMedia
* Add tests.
* Allow downloading when no event is associated.
* fix lint
* Update module API
* Update lock file too
* force CI
* 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
* Modify useMediaVisible to take a room.
* Add initial support for a account data level key.
* Update controls.
* Update settings
* Lint and fixes
* make some tests go happy
* lint
* i18n
* update preferences
* prettier
* Update settings tab.
* update screenshot
* Update docs
* Rewrite controller
* Rewrite tons of tests
* Rewrite RoomAvatar to be a functional component
This is so we can use hooks to determine the setting state.
* lint
* lint
* Tidy up comments
* Apply media visible hook to inline images.
* Move conditionals.
* copyright all the things
* Review changes
* Update html utils to properly discard media.
* Types fix
* Fixing tests that break settings getValue expectations
* Fix logic around media preview calculation
* Fix room header tests
* Fixup tests for timelinePanel
* Clear settings in matrixchat
* Update tests to use SettingsStore where possible.
* fix bug
* revert changes to client.ts
* copyright years
* Add header
* Add a test for MediaPreviewAccountSettingsTab
* Mark initMatrixClient as optional
* Improve on types
* Ensure we do not set the account data twice.
* lint
* Review changes
* Ensure we include the client on rendered messages.
* Fix test
* update labels
* clean designs
* update settings tab
* update snapshot
* copyright
* prevent mutation
* Refactor RoomAvatar into a functional component
* Add useRoomAvatar hook
* Remove useRoomAvatar hook and fix RoomAvatarEvents not using thumbnails.
* lint
* Ensure stable version of roomIdName
* Use new hook
* lint
* remove unused param
* Fixup tests
* remove console
* Update test
* Replace onHeightChanged with ResizeObserver
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 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>
* 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
* 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
* 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
* 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.
* Fix outstanding UX issues with replies/mentions/keyword notifs
* Use createRoot instead of deprecated ReactDOM.render
I foresee this change being made across the codebase shortly
and want to proactively prevent my PR from falling behind
* Clean up react root on unmount
* Remove addition of left-edge highlight on message mentions
It is clear that it would be best for me to address
this piece in a separate PR.
* Update call to ReactRootManager.render
---------
Co-authored-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
* 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>
* Add new e2e icon for the member tile
* Add new presence icon for member tile
* Implement new member tile
* Implement memberlist view model
* Implement new memberlist header view
* Support the new memberlist in Diasambiguated profile
1. Use MemberInfo instead of RoomMember
2. CSS changes to reflect the new design
* Implement new memberlist view
* Add and use a new overflow component
We used the EntityTile component as a pretend overflow tile in some
places. This new lighter component is added so that we can remove the
complex EntityTile component.
* Remove old code
* Add/remove css files from _components.pcss
* Increase minimum width as per design
* Actually use the new memberlist view
* Fix broken jest tests
* Add jest tests
* Playwright: Make it possible to disable presence
* Add playwright tests
* Fix lint error
* Undo translation changes that must be done via localazy
* Update license header
* Use waitFor instead of setTimeout
* Remove comment
* Switch over from template to container hs
* Revert unintended change
* Move config to top level
* 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.
* 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>
* Stash initial work to bring TSC from over 6 mins to under 1 minute
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Stabilise types
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix incorrect props to AccessibleButton
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Swap AccessibleButton element types to match the props they provide
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Changed my mind, remove spurious previously ignored props
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>
* Provide a way to activate GIFs via the keyboard for a11y
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove dead code
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>
* Improve performance of RoomContext in RoomHeader
This allows a component to subscribe to only part of the RoomContext so they do not need to re-render on every single change
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Prettier
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add comment
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>
* 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`
* Remove stale _LegacyRoomHeader.pcss and icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* De-duplicate icons using Compound Design Tokens
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove stale _LegacyRoomHeader.pcss and icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Ensure legacy header styles are not used by HTML export
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots & snapshots
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>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>