- ||text|| in outgoing messages/edits becomes <span data-mx-spoiler> (MSC2010),
matching what Blap Android sends; code/pre spans are left alone
- spoiler media uploads get the Discord SPOILER_ filename prefix (the only
marker the Rust SDK on Android can produce) and isSpoilerMedia honors it
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Thread focus mode: threads open centered in the main pane (expand
button, room-list thread rows, and any ShowThread while focus mode is
active); back bar / Escape / channel click return to the timeline.
Centering strips the sidebar's thread cards so no duplicate remains.
- Room list: active-thread rows under channels (unread threads plus the
one currently open), collapsible section headers with per-space
persistence, live space-membership DM filtering (fixes the DM section
capping at ~6 rooms after a space switch).
- CSS: Compound token overrides now also target the body theme class so
remapped tokens stop shadowing back to green; reply-quote restyle;
min-width on the room body so the message action bar can't render
off-pane with a thread panel open in narrow windows (edit "did
nothing").
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ship our own Element Call fork build instead of the stock embedded package
(webpack copy repointed to ../element-call/dist, with npm-package fallback), and
rework the in-call room layout to match the Blap design:
- Chat stays in the main pane with the call as a compact right-hand column;
when someone shares a screen the call takes prominence in the main pane and
chat moves to the side column (never hidden). Driven by a same-origin
screenshare signal from the EC fork.
- Camera-off: pass the `blapVideoMuted` flag to EC and drop the old (unreliable)
widget-action mute code.
- Room list already lists in-call members under voice channels; add an
"IN THE CALL" header to the call column.
- Hide redundant RTC call-notification ("Video call") pings from the timeline.
- Room header: remove the now-redundant chat, threads and member-facepile
buttons; keep info working over the call (call stays mounted).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* Add user status on user profile icon
Currently unstyled & no tests
* Style the user status icon
* Update snapshot
for avatar wrapper
* More snapshot updates
* add if braces
* Split out user status functions
to avoid circular dep which has the weird effect of just breaking
jest's mocking.
* type imports
* Update imports
* Update snapshot
* Tests
* baseline image
* Just snapshot the component itself
* User status in user menu
first pass, unstyled
* fix export
* superstylin'
* snapshots
* Add story & test
* Snapshots
and re-use the repeated rules
* Tests
* Fix jest lcov projectRoot config
* Change tooltip text to just 'clear'
* Add comment & fix console warn
* Remove all options screenshot
as it's not really particularly useful as a preset story
* remove stale screenshot
* fix imports
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Use vitest for some EW unit tests
* Ensure library builds are done before unit tests
* Stabilise jest tests
* Move more tests over
* Make sonar happier
* Update types/node for happy-dom compat again
* Decrease max-workers to stabilise jest tests
* Split jest over 3 runners to alleviate memory woes
* Switch jest to runInBand
* Attempt to deflake jest tests
* tweak coverage
* tweak coverage
* fix: don't display the empty/collapse icon when the room list is empty
* Fix jest lcov projectRoot config
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* First version of shared component
* Refactor as a functional component
* Add unit tests and more documentation
* Fix problem where wrappedRef was used by parent before assignment was performed.
* Use the shared component in app/web
* Clean up unused styling
* Added scrollbar-gutters as default styling in shared component
* Make sure the legacy mx_AutoHideScrollbar is set in app/web
* Updated snapshots
* Removing default style, scrollbar-gutter: stable;
* Updated snapshots
* useRef on wrapperRef to avoid loop in rendering
* scrollbar-width does not propagate
* Add AutoHideScrollbar to RoomListView
* Fix Prettier issue
* Updated snapshots
* Updated snapshot after merge
* Fix Sonar issue
* Remove legacy export
* Extract view map to a switch case statement with typescript checking that all cases are handled
This lets us drop the `default` case as we know we will never reach it.
Additionally move all the settings conditions to the state-setters rather than the renderer so we are never stuck in an undefined state
* Fix comment
* Handle unknown screens better
Redirect to welcome/home rather than getting stuck at spinner
* First pass at new retention
* Add more test cases
* fixup
* Fix TODO
* Disable retention explicitly from the start
* fixup
* Just apply retention as-is
* Fixup
* fix: hide section separator in context menu when there is no section
* fix: truncate long section name
* feat: add remove from section entry to room list item context menu
* test: update tests and stories
* test: add new test
* test: use same mocks
* test: add e2e test for "Remove from section"
Sort out duplication between presence icon code, have the MemberIconView
position the presence icon rather than the presence icon trying to position
itself.
* Add user status on user profile icon
Currently unstyled & no tests
* Style the user status icon
* Update snapshot
for avatar wrapper
* More snapshot updates
* add if braces
* Split out user status functions
to avoid circular dep which has the weird effect of just breaking
jest's mocking.
* type imports
* Update imports
* Update snapshot
* Tests
* baseline image
* Just snapshot the component itself
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* PoC Sign in with QR on new EW using generated QR for MSC4108 v2024
* Revert package.json changes
* Prettier
* Fix i18n
* Tidy up
* Remove unused state variable
* Iterate tests
* Partial revert
* Iterate
* Wire up qr_login route
* Iterate UI
* Fix React dev mode double rendering issue
* Fix react key warning
* Hide flow header on login
* Re-roll qr code on channel expiry
* Switch to AbortSignal
* Improve auto-retry QR UX
* Ensure we only show sign in with QR button if enabled
* XXX: enable labs flag on Netlify builds
* Tweak QR code sizing
* Move qr login flow into a dialog to match designs
* Fix null deviceId
* Remove duplicate log
* Iterate
* Fix tests
* Fix types
* Fix tests
* Fix tests
* Make Netlify more useful
* Make Netlify more useful v2
* Update copy
* Refactor QR link flow to use new SDK methods
Requires https://github.com/matrix-org/matrix-js-sdk/pull/5283
For element-hq/wat-internal#188
Split out from https://github.com/element-hq/element-web/pull/33184
* Link to js-sdk branch
* Update tests
* Simplify
* Revert js-sdk linking
* Iterate
* Iterate
* Refactor to handle most of the TODOs
* Remove unused code
* Remove unused code
* Use js-sdk isSignInWithQRAvailable API to simplify code
* Restore app-test.ts
* Improve coverage
* Improve coverage
* Remove unused prop/state
* Iterate
* Fix tests
* Iterate
* Tests
* Handle TODOs
* Docs
* Remove redundant call to crossSignDevice()
* Workaround to remove training slash on the serverName before auto-discovery
* Revert "Workaround to remove training slash on the serverName before auto-discovery"
This reverts commit 0335a8fdd1b8e8d949ab7fca17c76f8fab335b58.
* setLoggedIn not to be used with OIDC flows as it clears storage
as per docs on setLoggedIn we should use restoreSessionFromStorage
* Don't show the security_code_prompt unconditionally(i.e. for the web logging in mobile flow)
* Update LoginWithQRFlow-test.tsx.snap
* Update MatrixChat-test from setLoggedInSpy to restoreSessionSpy
* Add todo for server switch
* Add todo about handling base URL or server name
* Handle server name or base URL being returned
* Format
* Fix loading state height
* Handle the homeserver URL differing during QR code login
* Comments
* Comments
* Register OIDC client ID after homeserver swap
* Make QrLoginDialog async to minimise the impact on bundle size
* Handle unsupported HS earlier in the flow
* Iterate
* Delint
* Fix test
* Discard changes to apps/web/element.io/develop/config.json
---------
Co-authored-by: Hugh Nimmo-Smith <hughns@element.io>
Co-authored-by: David Langley <langley.dave@gmail.com>
* Fix incoherent DeviceListener tests
* Re-order DeviceListenerCurrentDevice.recheck to reduce unnecessary work
* Introduce scopes in recheck to demonstrate which variables are shared
* Break recheck into separate functions
* Remove `onFocus` and `onBlur` handlers
react-resizable-panels fixed the issue where focus-visible was not
working as expected, so we no longer need this bit of code.
* Implement new hover/focus separator
* Collapse the panel when clicking on the new focus separator
* Remove `isFocusedViaKeyboard` from snapshot
* Update tests and storybook
* Expand panel only on double click
* Add animation
* Fix tests
* Don't render border when type is bar
* Single click to expand, double click to collapse
* Change focus separator color
* Support MSC4287 m.key_backup stable prefix as well as the unstable prefix
* Update comments to avoid talking about EX since this now applies more widely
* Make comments about m.key_backup more helpful
* Improve comment on recheckBackupDisabled
* Explicitly say backup is disabled only if enabled is actually set to false
* apply new design to logout dialog
* factor out check for other verified devices
* only show recovery warning when user has no other verified devices
* fix playwright tests
* tweak style to better match design
* another playwright test fix
* fix playwright
* Look for the remove button within the dialog
* Use testid to locate 'Remove this device' button
* move rendering to sub-components, rather than embedded functions
* use <Type> element
* use <Text> for the <a> element
---------
Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
* fix: use configured brand name in JSON and PlainText chat export filenames
The JSON and PlainText chat export functions were using the hardcoded
default 'matrix' as the brand name in filenames, while the HTML/ZIP
export correctly used the configured brand (e.g., 'Element').
This made the filenames inconsistent:
- ZIP: Element - Room - Chat Export - timestamp.zip
- JSON: matrix - Room - Chat Export - timestamp.json
Now both JSON and PlainText exports pass SdkConfig.get().brand to
makeFileNameNoExtension(), matching the behavior of the base Exporter
class used by HTML exports.
Fixes#32853
Signed-off-by: RoySerbi <roy676564@gmail.com>
* refactor: read brand from SdkConfig inside makeFileNameNoExtension
Address review feedback from @t3chguy: the brand parameter on
makeFileNameNoExtension was effectively dead (all three call sites passed
SdkConfig.get().brand and the 'matrix' default was unreachable).
- Exporter.makeFileNameNoExtension now reads SdkConfig.get().brand directly
- All call sites (Exporter, JSONExport, PlainTextExport) simplified to no-arg
- Drop now-unused SdkConfig imports in JSONExport and PlainTextExport
Tests are unchanged: they already mock SdkConfig to return 'Element', so the
existing 'Element-branded destination file name' snapshots remain valid.
---------
Signed-off-by: RoySerbi <roy676564@gmail.com>
* Make EventTileViewModel an owned root VM
* Move timestamp sub-VMs under EventTileViewModel
* Move thread-list action bar VM under EventTileViewModel
* Clean up for improved readability
* Clean up to avoid duplicate EventTile render derivations
* Avoid mutating EventTileViewModel during render
* Move EventTile child VM syncing into adapters
* Replace timestamp VM field setters with batched setProps
* Component wrappers at the end of the file
* Lazy-create EventTile child view models