1
0
mirror of https://github.com/element-hq/element-web.git synced 2026-10-23 11:09:01 +03:00

1230 Commits

Author SHA1 Message Date
Valere Fedronic
314f3662ca Revert element-call-embedded to 0.26.1 (#35549) 2026-10-21 13:34:41 +00:00
ElementRobot
2d38e33279 [create-pull-request] automated change (#35548)
Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com>
2026-10-21 06:51:41 +00:00
renovate[bot]
6b97ebf1ad Update dependency sanitize-html to v2.18.1 (#35530)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-20 13:16:39 +00:00
renovate[bot]
e1b9e0c566 Update dependency happy-dom to v21 (#35528)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-20 12:50:48 +00:00
Skye Elliot
df9d6798d0 Allow generating a recovery key when logging out and this is the last device (#35401)
* feat(web): add a success style to `EncryptionCard`

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web): generate the recovery key inside the logout dialog

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(web): cover generating the recovery key inside the logout dialog

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore: Group translations under settings|encryption|recovery

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 12:12:45 +00:00
renovate[bot]
0cad4b4ac1 Update dependency postcss-nested to v9 (#35538)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 19:34:46 +00:00
renovate[bot]
fa3e014605 Update dependency @sentry/webpack-plugin to v11 (#35537)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 19:32:22 +00:00
renovate[bot]
1d5da9a49b Update css (#35529)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 17:36:35 +00:00
renovate[bot]
539e663f79 Update oxc (#35526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 17:34:38 +00:00
renovate[bot]
0d3ffdcb2b Update nginxinc/nginx-unprivileged:alpine-slim Docker digest to a8cb0f3 (#35513)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 17:13:36 +00:00
renovate[bot]
4c6843812e Update pnpm to v12.14.0 (#35519)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 17:11:22 +00:00
David Langley
a9a05a8225 Show read receipts in the new timeline(labs) (#35276)
* Show read receipts in the new timeline

The labs timeline drew no read receipts. It now shows them, using the
same code as the old timeline, moved out of MessagePanel into shared
functions that both timelines call:

- getReadReceiptsForEvent and getReadReceiptsByShownEvent in
  utils/read-receipts: which receipts an event carries (leaving out our
  own and ignored users'), and which shown message each is drawn beside.
  A receipt on a hidden event goes beside the last shown message before
  it, a receipt that moves onto an event not loaded stays where it was,
  and each message's receipts are ordered newest first.
- isSentState and findLastSuccessfulWeSent beside
  isEligibleForSpecialReceipt: which message shows the "Sent" tick.

MessagePanel's behaviour is unchanged. RoomTimelineViewModel publishes
the receipts and the "Sent" message with every rebuild and whenever a
receipt arrives. NewTimelinePanel hands them to the tiles with one
shared receipt-position map, so avatars animate between rows as before,
and RoomView passes the room's showReadReceipts setting, which the panel
follows while the room is open.

Receipts and the "Sent" tick are worked out over the same events the
rows are built from, our pending messages included, so a message the
server has accepted takes the tick before its remote echo arrives, as
it does in the old timeline.

* Work out receipts and the "Sent" tick from one list of events per publish

republish built the loaded-plus-pending event list twice more, once for
the receipts and once for the "Sent" tick. Build it once and hand it to
both.

* Refresh read receipt avatars when room members change

Receipts carry the reader's room member for its avatar and name, but were
only updated when a receipt arrived or the rows were rebuilt. With
lazy-loaded members, receipts worked out before the members arrived kept a
placeholder avatar and a bare user id. The old timeline picked them up
through RoomView re-rendering on RoomStateEvent.Update; the view model
now listens for it too.

Receipt updates that arrive while a load or rebuild is due are skipped,
since the republish that follows updates the receipts for the new rows
anyway.

* Share the read receipt comparison and keep unchanged receipts

EventTile compared its readReceipts prop inline so a re-render that
moved no receipt did not redraw the tile. That check now lives in
utils/read-receipts as readReceiptsEqual (same readers in order, same
timestamps, same room members by reference), and also compares
timestamps, which the inline copy did not.

The new timeline's view model put the receipts in a fresh map on
every publish and every receipt, our own included, so every row was
redrawn even when no avatar moved. reuseUnchangedReadReceipts keeps the
previous list for each message whose receipts are unchanged, and the
previous map when none changed, so only the rows whose receipts moved
get new props.
2026-10-19 16:31:48 +00:00
renovate[bot]
a5258eccb6 Update dependency @element-hq/element-call-embedded to v0.28.0 (#35517)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-19 14:16:30 +00:00
Andrew Ferrazzutti
9d4681cbb3 Replace delay options arg with numeric delay (#35413)
* Replace delay options arg with numeric delay

When calling the (unstable) delayed event scheduling methods of
`MatrixClient`, pass a numeric delay instead of the now-deprecated delay
options object that contains the delay.

See https://github.com/matrix-org/matrix-js-sdk/pull/5199, which adds
support for a numeric delay & deprecates the delay options object.

* Update tests
2026-10-19 12:49:57 +00:00
Michael Telatynski
43c93a43ac Remove map_style_url from config.sample.json (#35511) 2026-10-19 10:08:08 +00:00
Matthew Hodgson
8459bb5e4a Expand the device wildcard when a widget sends an encrypted to-device message (#35183)
* Expand the device wildcard when a widget sends an encrypted to-device message

A widget may address every device of a user with "*", which the server
expands for plaintext sends but the crypto layer can't; such sends
were dropped with "unknown device". Element Call subscribes to a
transcription bot this way, so captions waited forever.

* Expand the wildcard with an if, so coverage sees both branches

v8 reported the non-wildcard arm of the multi-line ternary as an
uncovered line even though both arms have tests, which failed diff-cover.
2026-10-19 11:23:51 +01:00
ElementRobot
c0fb881d6a [create-pull-request] automated change (#35509)
Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com>
2026-10-19 07:00:06 +00:00
Johannes Marbach
fc4d45cce1 Keep opening voice-only calls in PiP when the lobby is skipped (#35495)
* Keep opening voice-only calls in PiP when the lobby is skipped

* Ignore Vitest's console-log teardown race in unit test runs

Vitest intermittently fails a run where every test passed with 'Closing rpc while "onUserConsoleLog" was pending'
(vitest-dev/vitest#11153).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Revert "Ignore Vitest's console-log teardown race in unit test runs"

This reverts commit 0c1084c6a4.

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:49:34 +00:00
Michael Telatynski
af4ddc94a8 Add custom lint rule to clean up subscriptions before unmount (#35502)
* Add custom lint rule to clean up timers before unmount

Claude wrote the linter plugin

* Add custom lint rule to clean up subscriptions before unmount

Claude wrote the linter plugin

Also cleaned up a stray listener in MPollBody calling `this.render.bind(this)` which would not do anything.

* oxfmt
2026-10-16 15:30:08 +00:00
Michael Telatynski
b64db9894b Fix another merge conflict issue 2026-10-16 15:28:24 +01:00
RiotRobot
2a21153a3a Merge remote-tracking branch 'origin/master' into develop
# Conflicts:
#	apps/web/package.json
#	apps/web/playwright/e2e/crypto/toasts.spec.ts
#	apps/web/src/Lifecycle.ts
#	apps/web/src/components/structures/auth/CompleteSecurity.test.tsx
#	pnpm-lock.yaml
2026-10-16 13:18:58 +00:00
RiotRobot
ed0a1239e8 v1.12.32 2026-10-16 13:15:24 +00:00
Half-Shot
5e1f3fdda5 Remove support for NEB starter links in messages
Clicking one sent the user's scalar_token to a URL chosen by the message sender.

Remove the action body wrapper from TextualBodyView

It existed only for NEB starter links, which are no longer supported.

Rename ScalarAuthClient.getStarterLink to appendScalarToken
2026-10-16 14:07:12 +01:00
Michael Telatynski
560b3f7f8f Remove support for guest_access_token & guest_user_id
It never made it into the Matrix spec and was removed from Synapse in 2019 - https://github.com/matrix-org/synapse/pull/5625
2026-10-16 14:06:59 +01:00
Half-Shot
00f0c53cd2 Remove support for NEB starter links in messages
Clicking one sent the user's scalar_token to a URL chosen by the message sender.

Remove the action body wrapper from TextualBodyView

It existed only for NEB starter links, which are no longer supported.

Rename ScalarAuthClient.getStarterLink to appendScalarToken
2026-10-16 14:03:54 +01:00
Michael Telatynski
792453c88a Remove support for guest_access_token & guest_user_id
It never made it into the Matrix spec and was removed from Synapse in 2019 - https://github.com/matrix-org/synapse/pull/5625
2026-10-16 14:03:53 +01:00
ElementRobot
d4d201782f Fix crash when preview room is under the fold (#35490) (#35500)
Co-authored-by: Florian Duros <florianduros@element.io>
2026-10-16 14:03:26 +01:00
ElementRobot
e2da94ca58 [create-pull-request] automated change (#35496)
Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com>
2026-10-16 11:22:53 +00:00
Michael Telatynski
d4b1500ae5 Add custom lint rule to clean up timers before unmount (#35480)
Claude wrote the linter plugin
2026-10-16 11:19:15 +00:00
Florian Duros
440079b599 Fix crash when preview room is under the fold (#35490)
* Fix crash when previewed room is under the fold

* Cast visibility type to avoid ts-ignore
2026-10-16 11:19:07 +00:00
Jason J
420fa9056f Fix /spoiler command not converting markdown to HTML (#35103)
* Fix /spoiler command not converting message content to HTML

The spoiler slash command was inserting the raw message text directly into
the formatted_body HTML span, so markdown syntax and special characters
were never processed. Run the message through htmlSerializeFromMdIfNeeded
so that e.g. **bold** becomes <strong>bold</strong> inside the spoiler span.

Fixes #21185

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

* tests: add vitest tests for /spoiler markdown serialization fix

* fix(/spoiler): reject empty message and fix test assertions

Two issues:
1. The runFn used a default `message = ""` so /spoiler with no args
   silently sent an empty spoiler. Added a guard that returns
   reject(this.getUsage()) when message is empty/whitespace.

2. The tests accessed result.value which does not exist on RunResult.
   RunResult uses result.promise (a Promise). Updated all three
   success-path assertions to await result.promise.

* fix(test): cast IContent to fix formatted_body TypeScript error in spoiler test

Property 'formatted_body' does not exist on RoomMessageEventContent — cast
the awaited promise result to IContent which declares formatted_body as an
optional string field.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

* Address review: assert full formatted_body snapshot and explain forceHTML

* Use exact toEqual assertions in spoiler tests instead of snapshots

Snapshots require local generation before CI can use them.
toEqual with the precise expected strings is clearer and does not
need a separate generation step.

* Fix copyright holder in spoiler test to external contributor name

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Florian Duros <florianduros@element.io>
2026-10-16 09:55:48 +00:00
renovate[bot]
3bddaab412 Update react (#35348)
* Update react

* Update patch

* Fix test

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2026-10-16 09:53:13 +00:00
Richard van der Hoff
fc4c0390ff Copy changes for "set up recovery" (#35437)
* Update "your chats are backed up" copy

... in the Settings dialog (RecoveryPanel), and the "set up recovery" toast.

* Change labels on "set up recovery" UI

* Add help text to 'Allow key storage' toggle

* update playwright snapshots
2026-10-15 23:01:37 +00:00
Matthew Hodgson
da1ef31b68 Open a call that is already in progress maximised, even for voice (#35443)
The header's Join button for a voice call went through the voice-call
PiP shortcut, so (outside DMs, where Element Call skips the lobby) the
user landed in a lobby inside a PiP. Only starting a voice call should
open in PiP; joining one in progress opens it maximised like video.
2026-10-15 14:45:31 +00:00
Florian Duros
1accbbb13f Fix guest login in oidc flow (#35432) 2026-10-15 11:52:51 +00:00
Michael Telatynski
4e55d8fc57 Add custom lint rule to catch subscriptions after unmount (#35479)
Claude wrote the linter plugin
2026-10-15 11:44:12 +00:00
Michael Telatynski
b72623d5f1 Add custom lint rule to require cancelling lodash throttle/debounce (#35477)
Claude wrote the linter plugin
2026-10-15 11:44:01 +00:00
Hugh Nimmo-Smith
006bf30b56 Avoid unhandled promise rejection from CallStore.onReady() (#34861)
* Avoid unhandled promise rejection from CallStore.onReady()

As well as the usual network/server errors, a call to `waitForClientWellKnown()` can throw whilst the client is still starting up.

* Appease the CI

---------

Co-authored-by: Johannes Marbach <johannesm@element.io>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-10-15 10:52:16 +00:00
Michael Telatynski
1ea4b1ac72 Enable eslint-plugin-react-web-api in oxlint (#35473)
Subset of https://github.com/element-hq/element-web/pull/35325
2026-10-15 09:38:08 +00:00
Michael Telatynski
ad9c1ccffb Deflake more tests (#35472)
* Fix mock route race condition in playwright test

Fixes https://github.com/element-hq/element-web/issues/34942

* Fix axe racing with button being enabled in playwright test

Fixes https://github.com/element-hq/element-web/issues/31919

* Fix race condition in audio player test

Fixes https://github.com/element-hq/element-web/issues/27760

* Fix slow favicon vitest test

Preload base image
2026-10-15 07:56:51 +00:00
Milton Moura
db69764acd Fix PiP dragger when displaying over widgets (#35395)
Signed-off-by: Milton Moura <milton.moura@nordeck.net>
Co-authored-by: Milton Moura <milton.moura@nordeck.net>
2026-10-14 13:53:28 +00:00
Michael Telatynski
b39d7266fa Fix dangling promises in test files (#35462)
* Fix floating promises in test files

Enables typescript/no-floating-promises

Fixes https://github.com/element-hq/element-web/issues/35300

* Fix flaky url preview test due to expecting old class names
2026-10-14 13:28:12 +00:00
Johannes Marbach
5031938732 Add widget driver actions and capabilities for LiveKit C-S endpoints (#35446)
* Add widget driver actions and capabilities for LiveKit C-S endpoints

* Avoid filtering response
2026-10-14 13:01:26 +00:00
Michael Telatynski
206e7a7ea4 Fix some flaky Playwright tests (#35337)
* Fix race condition in routing

The cached value was written back asynchronously so doing A->B->A quickly enough would skip the last transition.

Fixes https://github.com/element-hq/element-web/issues/29795

* Fix testcontainers logs not being attached in certain cases

* Fix race with MAS-issued tokens not being immediately accepted by Synapse

* Fix race condition with logging back in too quickly whilst logout has not finished

Fixes https://github.com/element-hq/element-web/issues/30153
Fixes https://github.com/element-hq/element-web/issues/31316

* Iterate

* Iterate

* Iterate
2026-10-14 12:44:04 +00:00
Timo
d07c0d36e3 Fix calls respawning from error screen on room switch. (#35470)
Calls did come back due to a nifty issue.
The close call yeilded a stat that throws. Which blocks the successful
clean up of element call.
2026-10-14 11:50:36 +00:00
ElementRobot
02cee08b38 [create-pull-request] automated change (#35466)
Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com>
2026-10-14 06:52:13 +00:00
Skye Elliot
abe512a2f2 Split ChangeRecoveryKeyBody out of ChangeRecoveryKey (#35403)
* refactor(web): split `ChangeRecoveryKeyBody` out of the settings breadcrumbs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(web): cover `ChangeRecoveryKeyBody` outside settings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: Update deprecation notice on `CreateSecretStorageDialog`

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:56:53 +00:00
Skye Elliot
d514d6ddb8 Use a dialog to prompt the user about their recovery key when logging out (#35398)
* fix(web): match logout confirmation copy to new design

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Skye Elliot <actuallyori@gmail.com>

* refactor(web): let `LogoutDialog` open any encryption settings state

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(web): warn about recovery key when removing the only device

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Skye Elliot <actuallyori@gmail.com>

* test(web): cover recovery key warning when removing the only device

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Skye Elliot <actuallyori@gmail.com>

* fixup! refactor(web): let `LogoutDialog` open any encryption settings state

---------

Signed-off-by: Skye Elliot <actuallyori@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 15:08:26 +00:00
Richard van der Hoff
5455765fe5 Remove introductory screen from "create recovery key" flow (#35451)
* Remove introductory screen from "create recovery key" flow.

Between them, https://github.com/element-hq/element-meta/issues/3188 and
https://github.com/element-hq/element-meta/issues/3185 move all the information
about "what is a recovery key" into the toasts and modals that lead into the
"create recovery key" flow, thus making the introductory screen redundant.

Fixes https://github.com/element-hq/element-web/issues/35428

* update broken vitest

* playwright: Move body of `enableKeyBackup` into a `step`

... to make the logs a bit clearer

* Fix broken playwright tests
2026-10-13 14:32:33 +00:00
Michael Telatynski
6d8ff234e2 Fix playwright flaky tests (#35453)
* Fix edge case in edit history dialog

Where an edit happens while the dialog is opened and the event content is overwritten.

Fixes https://github.com/element-hq/element-web/issues/34399

* Fix test race condition with RTE

Fixes https://github.com/element-hq/element-web/issues/33663

* Fix race condition in tests around toasts

Fixes https://github.com/element-hq/element-web/issues/27804
2026-10-13 14:16:26 +00:00