Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
1b10122
Allow disabling legacy calls and make `Voice & Video` settings `Legac…
toger5 Jul 7, 2026
e46acef
Implement tombstone tiles for calls in room and DM (#34141)
MidhunSureshR Jul 7, 2026
ff8abcd
URL Preview further design iteration (#34054)
Half-Shot Jul 7, 2026
38e29c5
Fix composer preview getting stuck on a single module API preview (#3…
Half-Shot Jul 7, 2026
2bc9656
Adapt OAuth2 implementation to Matrix Spec v1.18 (#34026)
t3chguy Jul 8, 2026
af881a1
[create-pull-request] automated change (#34177)
RiotRobot Jul 8, 2026
8d4ec11
shared components 0.1.2 (#34175)
Half-Shot Jul 8, 2026
1b3ef74
module-api 1.15.0 (#34174)
Half-Shot Jul 8, 2026
bf1b771
Center long user ids in the user menu (#34182)
dbkr Jul 8, 2026
d593285
RoomList: fix room scroll when clicked in thread activity centre (#34…
florianduros Jul 8, 2026
a8fdbc9
Enable forwardRef oxlint rule
t3chguy Jul 8, 2026
67a20c5
Move more tests from Jest to Vitest (#34181)
t3chguy Jul 8, 2026
da80e72
Enable no-unused-vars oxlint rule
t3chguy Jul 8, 2026
b45225a
Enable no-implied-eval oxlint rule
t3chguy Jul 8, 2026
ba3fb85
Enable no-duplicate-type-constituents oxlint rule
t3chguy Jul 8, 2026
2bb0f01
Enable explicit-length-check oxlint rule
t3chguy Jul 8, 2026
c7ef92a
Enable prefer-number-properties oxlint rule
t3chguy Jul 8, 2026
6c79b23
Enable no-callback-in-promise oxlint rule
t3chguy Jul 8, 2026
439c3e6
Enable no-require-imports oxlint rule
t3chguy Jul 8, 2026
8362dc6
Remove disablement of most unicorn oxlint rules
t3chguy Jul 8, 2026
d653c26
Enable no-conditional-tests oxlint rule
t3chguy Jul 8, 2026
59606d4
Enable promise-valid-params oxlint rule
t3chguy Jul 8, 2026
761acf8
Enable require-unicode-regexp oxlint rule
t3chguy Jul 8, 2026
6454090
Merge branch 'develop' of ssh://github.com/element-hq/element-web int…
t3chguy Jul 8, 2026
59fcb66
Remove max-len comments as we use oxfmt for formatting
t3chguy Jul 8, 2026
014ee77
Enable majority of oxlint `suspicious` rules
t3chguy Jul 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 8 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,15 @@ jobs:
node-version: "lts/*"
cache: "pnpm"

- name: Install Deps
- name: Install Deps (layered)
run: "./scripts/layered.sh"
if: matrix.path != 'packages/shared-components'
env:
JS_SDK_GITHUB_BASE_REF: ${{ inputs.matrix-js-sdk-sha }}

- name: Install Deps (normal)
run: "pnpm install"
if: matrix.path == 'packages/shared-components'

- name: Cache storybook & vitest
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/electron-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ if (process.env.VARIANT_PATH) {
console.log(`Using variant configuration from '${process.env.VARIANT_PATH}':`);
variant = {
...variant,
...JSON.parse(fs.readFileSync(`${process.env.VARIANT_PATH}`, "utf8")),
...JSON.parse(fs.readFileSync(process.env.VARIANT_PATH, "utf8")),
};
} else {
console.warn(`No VARIANT_PATH specified, using default variant configuration '${DEFAULT_VARIANT}':`);
Expand Down
4 changes: 0 additions & 4 deletions apps/desktop/element.io/nightly/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,11 @@
"features": {
"threadsActivityCentre": true,
"feature_spotlight": true,
"feature_group_calls": true,
"feature_video_rooms": true,
"feature_element_call_video_rooms": true
},
"setting_defaults": {
"RustCrypto.staged_rollout_percent": 100
},
"element_call": {
"url": "https://call.element.dev"
},
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
}
4 changes: 0 additions & 4 deletions apps/desktop/element.io/release/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,6 @@
},
"features": {
"feature_video_rooms": true,
"feature_group_calls": true,
"feature_element_call_video_rooms": true
},
"element_call": {
"url": "https://call.element.io"
}
}
3 changes: 2 additions & 1 deletion apps/desktop/hak/matrix-seshat/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ export default async function (hakEnv: HakEnv, moduleInfo: DependencyInfo): Prom
"` " +
"or your package manager if not using `rustup`",
);
return;
}
fsProm.unlink("tmp").then(resolve);
resolve(fsProm.unlink("tmp"));
},
);
rustc.stdin!.write("fn main() {}");
Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/playwright/e2e/launch/oidc.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { test, expect } from "../../element-desktop-test.js";

declare global {
interface ElectronPlatform {
getOidcCallbackUrl(): URL;
getOAuthCallbackUrl(): URL;
}

interface Window {
Expand All @@ -29,7 +29,7 @@ test.describe("OIDC Native", () => {
test("should use OIDC callback URL without authority component", async ({ page }) => {
await expect(
page.evaluate<string>(() => {
return window.mxPlatformPeg.get().getOidcCallbackUrl().toString();
return window.mxPlatformPeg.get().getOAuthCallbackUrl().toString();
}),
).resolves.toMatch(/io\.element\.(desktop|nightly):\/vector\/webapp\//);
});
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/scripts/hak/copy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export default async function copy(hakEnv: HakEnv, moduleInfo: DependencyInfo):
if (moduleInfo.moduleBuildDirs.length > 1) {
if (!hakEnv.isMac()) {
console.error(
"You asked me to copy multiple targets but I've only been taught " + "how to do that on macOS.",
"You asked me to copy multiple targets but I've only been taught how to do that on macOS.",
);
throw new Error("Can't copy multiple targets on this platform");
}
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/scripts/hak/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ async function main(): Promise<void> {
for (const mod of modules) {
const depInfo = deps[mod];
if (depInfo === undefined) {
console.log("Module " + mod + " not found - is it in hakDependencies " + "in your package.json?");
console.log(`Module ${mod} not found - is it in hakDependencies in your package.json?`);
process.exit(1);
}
console.log("hak " + cmd + ": " + mod);
Expand Down
14 changes: 6 additions & 8 deletions apps/desktop/src/vectormenu.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,21 +42,19 @@ describe("buildMenuTemplate", () => {
({ buildMenuTemplate } = await import("./vectormenu.js"));
});

if (platform === "darwin") {
it("should have an app-named item first", () => {
const menu = buildMenuTemplate();
expect(menu.items[0].label).toBe("ChatApp");
});
}
it.runIf(platform === "darwin")("should have an app-named item first", () => {
const menu = buildMenuTemplate();
expect(menu.items[0].label).toBe("ChatApp");
});

it("should include expected `help` menu", () => {
const menu = buildMenuTemplate();

const helpMenu = menu.items.at(-1)!;
expect(helpMenu.label).toBe("common|help");
const helpSubmenu = helpMenu.submenu as unknown as MenuItemConstructorOptions[];
expect(helpSubmenu[0]!.label).toBe("common|brand_help");
helpSubmenu[0]!.click!(menu.items.at(-1)!, undefined, new Event("click") as KeyboardEvent);
expect(helpSubmenu[0].label).toBe("common|brand_help");
helpSubmenu[0].click!(menu.items.at(-1)!, undefined, new Event("click") as KeyboardEvent);
expect(shell.openExternal).toHaveBeenCalledWith("https://i.need.help");
});
});
Expand Down
1 change: 1 addition & 0 deletions apps/web/@types/webpack-version-file-plugin.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ declare module "webpack-version-file-plugin" {
extras?: Record<string, string>;
}

// oxlint-disable-next-line typescript/no-extraneous-class
export default class VersionFilePlugin {
public constructor(opts: Opts);
}
Expand Down
5 changes: 3 additions & 2 deletions apps/web/config.sample.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@
"preferred_domain": "meet.element.io"
},
"element_call": {
"url": "https://call.element.io",
"brand": "Element Call"
"brand": "Element Call",
"disable": false,
"use_exclusively": false
},
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
}
4 changes: 0 additions & 4 deletions apps/web/element.io/app/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,6 @@
},
"features": {
"feature_video_rooms": true,
"feature_group_calls": true,
"feature_element_call_video_rooms": true
},
"element_call": {
"url": "https://call.element.io"
}
}
4 changes: 0 additions & 4 deletions apps/web/element.io/develop/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,11 @@
"features": {
"threadsActivityCentre": true,
"feature_video_rooms": true,
"feature_group_calls": true,
"feature_element_call_video_rooms": true
},
"setting_defaults": {
"RustCrypto.staged_rollout_percent": 100,
"Registration.mobileRegistrationHelper": true
},
"element_call": {
"url": "https://call.element.dev"
},
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
}
2 changes: 2 additions & 0 deletions apps/web/jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ const config: Config = {
// Ignore vitest tests
"!<rootDir>/src/**/*.test.{ts,tsx}",
"!<rootDir>/src/test/**",
// Exclude mocks
"!<rootDir>/src/**/*-{mock,mocks}.{ts,tsx}",
],
coverageReporters: ["text-summary", ["lcov", { projectRoot: "../../" }]],
prettierPath: null,
Expand Down
1 change: 0 additions & 1 deletion apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@
"matrix-widget-api": "^1.16.1",
"memoize-one": "^6.0.0",
"mime": "^4.0.4",
"oidc-client-ts": "^3.0.1",
"opus-recorder": "^8.0.3",
"pako": "^3.0.0",
"png-chunks-extract": "^1.0.0",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/playwright/e2e/read-receipts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ class Helpers {
const roomListContainer = this.page.getByTestId("room-list");
const roomTiles = roomListContainer.getByRole("option");
for (const [i, room] of rooms.entries()) {
await expect(roomTiles.nth(i)).toHaveAccessibleName(new RegExp(`${room.name}`));
await expect(roomTiles.nth(i)).toHaveAccessibleName(new RegExp(room.name));
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions apps/web/playwright/e2e/read-receipts/read-receipts.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,19 +120,19 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => {
await sendUnthreadedReadReceipt(app, main2);

// (So the room has no unreads)
await expect(page.getByLabel(`${otherRoomName}`)).toBeVisible();
await expect(page.getByLabel(otherRoomName)).toBeVisible();

// And we persuade the app to persist its state to indexeddb by reloading and waiting
await page.reload();
await expect(page.getByLabel(`${selectedRoomName}`)).toBeVisible();
await expect(page.getByLabel(selectedRoomName)).toBeVisible();

// And we reload again, fetching the persisted state FROM indexeddb
await page.reload();

// Then the room is read, because the persisted state correctly remembers both
// receipts. (In #24629, the unthreaded receipt overwrote the main thread one,
// meaning that the room still said it had unread messages.)
await expect(page.getByLabel(`${otherRoomName}`)).toBeVisible();
await expect(page.getByLabel(otherRoomName)).toBeVisible();
await expect(page.getByLabel(`${otherRoomName} Unread messages.`)).not.toBeVisible();
});

Expand Down Expand Up @@ -172,7 +172,7 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => {
await sendThreadedReadReceipt(app, main3);

// Then the room has no unreads
await expect(page.getByLabel(`${otherRoomName}`)).toBeVisible();
await expect(page.getByLabel(otherRoomName)).toBeVisible();
});

test("Recognises unread messages on other thread after receiving a receipt for earlier ones", async ({
Expand Down Expand Up @@ -210,7 +210,7 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => {
await sendThreadedReadReceipt(app, thread1b, main1);

// Then the room has no unreads
await expect(page.getByLabel(`${otherRoomName}`)).toBeVisible();
await expect(page.getByLabel(otherRoomName)).toBeVisible();
await util.goTo({ name: otherRoomName, roomId: otherRoomId });
await util.assertReadThread("Message 1");
});
Expand All @@ -235,7 +235,7 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => {
// thread. The one in main is read because the unthreaded
// receipt is for a later event. The room should therefore be
// read, and the thread unread.
await expect(page.getByLabel(`${otherRoomName}`)).toBeVisible();
await expect(page.getByLabel(otherRoomName)).toBeVisible();
await util.goTo({ name: otherRoomName, roomId: otherRoomId });
await util.assertUnreadThread("Message 1");
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ test.describe("Account user settings tab", () => {
authorization_endpoint: `${EXTERNAL_ACCOUNT_MANAGEMENT_URL}authorize`,
token_endpoint: `${EXTERNAL_ACCOUNT_MANAGEMENT_URL}token`,
revocation_endpoint: `${EXTERNAL_ACCOUNT_MANAGEMENT_URL}revoke`,
registration_endpoint: `${EXTERNAL_ACCOUNT_MANAGEMENT_URL}register`,
response_types_supported: ["code"],
grant_types_supported: ["authorization_code"],
grant_types_supported: ["authorization_code", "refresh_token"],
response_modes_supported: ["query", "fragment"],
code_challenge_methods_supported: ["S256"],
account_management_uri: EXTERNAL_ACCOUNT_MANAGEMENT_URL,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
import { type Locator } from "@playwright/test";

import { test, expect } from "../../../element-web-test";
import { SettingLevel } from "../../../../src/settings/SettingLevel";

test.describe("Voice & Video room settings tab", () => {
const roomName = "Test room";

Expand All @@ -22,7 +20,6 @@ test.describe("Voice & Video room settings tab", () => {
test.beforeEach(async ({ user, app, page }) => {
// Execute client actions before setting, as the setting will force a reload.
await app.client.createRoom({ name: roomName });
await app.settings.setValue("feature_group_calls", null, SettingLevel.DEVICE, true);
await app.viewRoomByName(roomName);
settings = await app.settings.openRoomSettings("Voice & Video");
});
Expand Down
Loading
Loading