Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
92d866e
fix: remove call from the call state when a user is left the group (#…
zskhan Nov 21, 2025
59de699
chore(deps-dev): bump rimraf from 6.1.0 to 6.1.2 in /server (#19791)
dependabot[bot] Nov 23, 2025
bd2f77a
refactor(WPB-21957): create fixture for creating teams + refactor edi…
markbrockhoff Nov 24, 2025
d70f2fa
test(WPB-19966): write "Reply" regression tests (#19760)
markbrockhoff Nov 24, 2025
6dcc1a6
fix: accessibility improvements login(https://wearezeta.atlassian.net…
arjita-mitra Nov 25, 2025
1d5c874
chore(deps): bump @wireapp/core from 46.46.3 to 46.46.5 (#19793)
dependabot[bot] Nov 25, 2025
a092a94
chore(deps): bump core-js from 3.46.0 to 3.47.0 (#19797)
dependabot[bot] Nov 25, 2025
220d86d
chore(deps): bump emoji-picker-react from 4.15.1 to 4.15.2 (#19802)
dependabot[bot] Nov 25, 2025
7011bd3
chore(deps-dev): bump html-webpack-plugin from 5.6.4 to 5.6.5 (#19800)
dependabot[bot] Nov 25, 2025
3cd71f6
chore(deps): bump oidc-client-ts from 3.4.0 to 3.4.1 (#19801)
dependabot[bot] Nov 25, 2025
d09efa4
chore(deps-dev): bump webpack from 5.102.1 to 5.103.0 (#19796)
dependabot[bot] Nov 25, 2025
34b18c7
chore(deps-dev): bump workbox-webpack-plugin from 7.3.0 to 7.4.0 (#19…
dependabot[bot] Nov 25, 2025
14ecacd
chore(deps-dev): bump stylelint from 16.25.0 to 16.26.0 (#19798)
dependabot[bot] Nov 25, 2025
f968d66
chore(deps-dev): bump baseline-browser-mapping from 2.8.28 to 2.8.31 …
dependabot[bot] Nov 25, 2025
4544833
test(WPB-19968): add tests for self deleting messages (#19805)
markbrockhoff Nov 25, 2025
75705f3
fix: prevent microphone disabled dialog display when muted (#19808)
zskhan Nov 25, 2025
9b6e8dc
test(WPB-21957): update backend endpoint to match api version (#19809)
markbrockhoff Nov 25, 2025
0315fc1
chore: bump avs to v10.2.19 (#19810)
zskhan Nov 26, 2025
add472a
chore(deps): bump pm2 from 6.0.13 to 6.0.14 in /server (#19814)
dependabot[bot] Nov 30, 2025
6271407
chore(deps): bump js-yaml from 3.14.1 to 3.14.2 in /server (#19817)
dependabot[bot] Nov 30, 2025
98b4875
test(WPB-19939): add authentication regression tests (#19826)
markbrockhoff Dec 1, 2025
7cb1c06
fix(websocket): optimise event handling. Add heartbeat [WPB-21950] (#…
aweiss-dev Dec 2, 2025
f6fd501
chore(deps): bump lexical from 0.27.2 to 0.38.2
dependabot[bot] Dec 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions __mocks__/@wireapp/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,11 @@ export const util = {
TaskScheduler,
};

export enum ConnectionState {
CLOSED = 'closed',
CONNECTING = 'connecting',
PROCESSING_NOTIFICATIONS = 'processing_notifications',
LIVE = 'live',
}

export {Ciphersuite} from '@wireapp/core-crypto';
25 changes: 13 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
"@mediapipe/tasks-vision": "0.10.21",
"@tanstack/react-table": "8.21.3",
"@tanstack/react-virtual": "3.13.4",
"@wireapp/avs": "10.2.17",
"@wireapp/avs": "10.2.19",
"@wireapp/avs-debugger": "0.0.7",
"@wireapp/commons": "5.4.9",
"@wireapp/core": "46.46.3",
"@wireapp/core": "^46.46.6-beta.9.457c85ad6",
"@wireapp/kalium-backup": "0.0.4",
"@wireapp/promise-queue": "2.4.9",
"@wireapp/react-ui-kit": "9.69.6",
Expand All @@ -27,25 +27,25 @@
"beautiful-react-hooks": "5.0.3",
"classnames": "2.5.1",
"copy-webpack-plugin": "13.0.1",
"core-js": "3.46.0",
"core-js": "3.47.0",
"date-fns": "4.1.0",
"dexie-batch": "0.4.3",
"dexie-encrypted": "2.0.0",
"emoji-picker-react": "4.15.1",
"emoji-picker-react": "4.15.2",
"http-status-codes": "2.3.0",
"immer": "10.2.0",
"jimp": "0.22.12",
"js-cookie": "3.0.5",
"jszip": "3.10.1",
"keyboardjs": "2.7.0",
"knockout": "3.5.1",
"lexical": "0.27.2",
"lexical": "0.38.2",
"libsodium-wrappers": "0.7.15",
"linkify-it": "5.0.0",
"long": "5.3.2",
"markdown-it": "14.0.0",
"murmurhash": "2.0.1",
"oidc-client-ts": "3.4.0",
"oidc-client-ts": "3.4.1",
"path-to-regexp": "8.3.0",
"platform": "1.3.6",
"prism-themes": "^1.9.0",
Expand Down Expand Up @@ -123,7 +123,7 @@
"autoprefixer": "10.4.22",
"babel-loader": "10.0.0",
"babel-plugin-transform-import-meta": "2.3.3",
"baseline-browser-mapping": "^2.8.28",
"baseline-browser-mapping": "^2.8.31",
"browserslist": "^4.28.0",
"cross-env": "7.0.3",
"css-loader": "7.1.2",
Expand All @@ -135,7 +135,7 @@
"eslint-plugin-prettier": "5.1.3",
"fake-indexeddb": "6.2.5",
"generate-changelog": "1.8.0",
"html-webpack-plugin": "5.6.4",
"html-webpack-plugin": "5.6.5",
"husky": "9.1.7",
"i18next-scanner": "4.6.0",
"intersection-observer": "0.12.2",
Expand Down Expand Up @@ -164,19 +164,19 @@
"simple-git": "3.30.0",
"sinon": "18.0.0",
"style-loader": "4.0.0",
"stylelint": "16.25.0",
"stylelint": "16.26.0",
"stylelint-config-idiomatic-order": "10.0.0",
"svg-inline-loader": "0.8.2",
"text-encoding": "0.7.0",
"ts-node": "10.9.2",
"tsc-watch": "6.2.1",
"typescript": "5.5.2",
"webpack": "5.102.1",
"webpack": "5.103.0",
"webpack-bundle-analyzer": "^4.10.2",
"webpack-cli": "6.0.1",
"webpack-dev-middleware": "7.4.5",
"webpack-hot-middleware": "2.26.1",
"workbox-webpack-plugin": "7.3.0"
"workbox-webpack-plugin": "7.4.0"
},
"engines": {
"yarn": ">= 4.1.1",
Expand Down Expand Up @@ -237,7 +237,8 @@
"xml2js": "0.5.0",
"@stablelib/utf8": "1.0.2",
"dexie-encrypted@2.0.0": "patch:dexie-encrypted@npm%3A2.0.0#./.yarn/patches/dexie-encrypted-npm-2.0.0-eb61eb5975.patch",
"axios": "^1.9.0"
"axios": "^1.9.0",
"js-yaml": "^4.1.0"
},
"version": "0.27.0",
"packageManager": "yarn@4.1.1"
Expand Down
4 changes: 2 additions & 2 deletions server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"maxmind": "4.3.10",
"nocache": "4.0.0",
"opn": "6.0.0",
"pm2": "6.0.13"
"pm2": "6.0.14"
},
"devDependencies": {
"@types/express": "4.17.21",
Expand All @@ -33,7 +33,7 @@
"@types/node": "22.5.5",
"browserslist": "^4.28.0",
"jest": "29.7.0",
"rimraf": "6.1.0",
"rimraf": "6.1.2",
"typescript": "5.6.3"
},
"resolutions": {
Expand Down
42 changes: 21 additions & 21 deletions server/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -797,7 +797,7 @@ __metadata:
languageName: node
linkType: hard

"@pm2/pm2-version-check@npm:latest":
"@pm2/pm2-version-check@npm:^1.0.4":
version: 1.0.4
resolution: "@pm2/pm2-version-check@npm:1.0.4"
dependencies:
Expand Down Expand Up @@ -3623,26 +3623,26 @@ __metadata:
languageName: node
linkType: hard

"js-yaml@npm:4.1.0":
version: 4.1.0
resolution: "js-yaml@npm:4.1.0"
"js-yaml@npm:4.1.1":
version: 4.1.1
resolution: "js-yaml@npm:4.1.1"
dependencies:
argparse: "npm:^2.0.1"
bin:
js-yaml: bin/js-yaml.js
checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140
checksum: 10/a52d0519f0f4ef5b4adc1cde466cb54c50d56e2b4a983b9d5c9c0f2f99462047007a6274d7e95617a21d3c91fde3ee6115536ed70991cd645ba8521058b78f77
languageName: node
linkType: hard

"js-yaml@npm:^3.13.1":
version: 3.14.1
resolution: "js-yaml@npm:3.14.1"
version: 3.14.2
resolution: "js-yaml@npm:3.14.2"
dependencies:
argparse: "npm:^1.0.7"
esprima: "npm:^4.0.0"
bin:
js-yaml: bin/js-yaml.js
checksum: 10/9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379
checksum: 10/172e0b6007b0bf0fc8d2469c94424f7dd765c64a047d2b790831fecef2204a4054eabf4d911eb73ab8c9a3256ab8ba1ee8d655b789bf24bf059c772acc2075a1
languageName: node
linkType: hard

Expand Down Expand Up @@ -4525,15 +4525,15 @@ __metadata:
languageName: node
linkType: hard

"pm2@npm:6.0.13":
version: 6.0.13
resolution: "pm2@npm:6.0.13"
"pm2@npm:6.0.14":
version: 6.0.14
resolution: "pm2@npm:6.0.14"
dependencies:
"@pm2/agent": "npm:~2.1.1"
"@pm2/blessed": "npm:0.1.81"
"@pm2/io": "npm:~6.1.0"
"@pm2/js-api": "npm:~0.8.0"
"@pm2/pm2-version-check": "npm:latest"
"@pm2/pm2-version-check": "npm:^1.0.4"
ansis: "npm:4.0.0-node10"
async: "npm:3.2.6"
chokidar: "npm:3.6.0"
Expand All @@ -4545,7 +4545,7 @@ __metadata:
enquirer: "npm:2.3.6"
eventemitter2: "npm:5.0.1"
fclone: "npm:1.0.11"
js-yaml: "npm:4.1.0"
js-yaml: "npm:4.1.1"
mkdirp: "npm:1.0.4"
needle: "npm:2.4.0"
pidusage: "npm:3.0.2"
Expand All @@ -4567,7 +4567,7 @@ __metadata:
pm2-dev: bin/pm2-dev
pm2-docker: bin/pm2-docker
pm2-runtime: bin/pm2-runtime
checksum: 10/6743d91fc52413ed2e7e1764769e95f8db5916c9d75f2f8066014372fa304933a53284e39806f6e8cb58754e115ddd6a8c431b3fff1215d1136c6215db46a5de
checksum: 10/7211b4647c993d295e52f9a11fa2f604fd4dd1149b264beadde69d0c1739839230ce038c9081a9c8adaac8d632e0eb64ddcd02e10f9d8c2512da4e02e5d4df3b
languageName: node
linkType: hard

Expand Down Expand Up @@ -4796,15 +4796,15 @@ __metadata:
languageName: node
linkType: hard

"rimraf@npm:6.1.0":
version: 6.1.0
resolution: "rimraf@npm:6.1.0"
"rimraf@npm:6.1.2":
version: 6.1.2
resolution: "rimraf@npm:6.1.2"
dependencies:
glob: "npm:^11.0.3"
glob: "npm:^13.0.0"
package-json-from-dist: "npm:^1.0.1"
bin:
rimraf: dist/esm/bin.mjs
checksum: 10/ce376c041ef4212dce2b30690dff3c09fc34253ec21821dffec77731061241888c04c3baf0b052bc5a1698b9f348c08ef83bddbd6e2553e79bf939bedb1a31a9
checksum: 10/add8e566fe903f59d7b55c6c2382320c48302778640d1951baf247b3b451af496c2dee7195c204a8c646fd6327feadd1f5b61ce68c1362d4898075a726d83cc6
languageName: node
linkType: hard

Expand Down Expand Up @@ -5554,8 +5554,8 @@ __metadata:
maxmind: "npm:4.3.10"
nocache: "npm:4.0.0"
opn: "npm:6.0.0"
pm2: "npm:6.0.13"
rimraf: "npm:6.1.0"
pm2: "npm:6.0.14"
rimraf: "npm:6.1.2"
typescript: "npm:5.6.3"
languageName: unknown
linkType: soft
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,8 @@
"authLoginTitle": "Log in",
"authPlaceholderEmail": "Email",
"authPlaceholderPassword": "Password",
"showTogglePasswordLabel": "Show password",
"hideTogglePasswordLabel": "Hide password",
"authPostedResend": "Resend to {email}",
"authPostedResendAction": "No email showing up?",
"authPostedResendDetail": "Check your email inbox and follow the instructions.",
Expand Down Expand Up @@ -1969,6 +1971,8 @@
"verify.headline": "You’ve got mail",
"verify.resendCode": "Resend code",
"verify.subhead": "Enter the six-digit verification code we sent to{newline}{email}",
"verify.codeLabel": "Six-digit code",
"verify.codePlaceholder": "Input field, enter digit",
"videoCallMenuMoreAddReaction": "Add reaction",
"videoCallMenuMoreAudioSettings": "Audio Settings",
"videoCallMenuMoreChangeView": "Change view",
Expand Down
4 changes: 4 additions & 0 deletions src/script/auth/component/AccountForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,8 @@ const AccountFormComponent = ({
placeholder={t('accountForm.passwordPlaceholder')}
pattern={ValidationUtil.getNewPasswordPattern(Config.getConfig().NEW_PASSWORD_MINIMUM_LENGTH)}
data-uie-name="enter-password"
showTogglePasswordLabel={t('showTogglePasswordLabel')}
hideTogglePasswordLabel={t('hideTogglePasswordLabel')}
/>
<Text muted css={styles.passwordInfo(!!validationErrors.length)} data-uie-name="element-password-help">
{t('accountForm.passwordHelp', {minPasswordLength: String(Config.getConfig().NEW_PASSWORD_MINIMUM_LENGTH)})}
Expand All @@ -269,6 +271,8 @@ const AccountFormComponent = ({
placeholder={t('accountForm.confirmPasswordPlaceholder')}
pattern={`^${registrationData.password?.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`}
data-uie-name="enter-confirm-password"
showTogglePasswordLabel={t('showTogglePasswordLabel')}
hideTogglePasswordLabel={t('hideTogglePasswordLabel')}
/>

<Exception errors={[authError, ...validationErrors]} />
Expand Down
12 changes: 7 additions & 5 deletions src/script/auth/component/BackButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@ export const BackButton = () => {
const navigate = useNavigate();

return (
<ArrowIcon
<button
type="button"
onClick={() => navigate(-1)}
direction="left"
data-uie-name="go-index"
aria-label={t('createPersonalAccount.goBack')}
color={COLOR.TEXT}
/>
data-uie-name="go-index"
css={{background: 'none', border: 'none', cursor: 'pointer'}}
>
<ArrowIcon direction="left" aria-hidden="true" focusable="false" color={COLOR.TEXT} />
</button>
);
};
2 changes: 2 additions & 0 deletions src/script/auth/component/ClientItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,8 @@ const ClientItem = ({selected, onClientRemoval, onClick, client, clientError, re
placeholder={t('clientItem.passwordPlaceholder')}
required
type="password"
showTogglePasswordLabel={t('showTogglePasswordLabel')}
hideTogglePasswordLabel={t('hideTogglePasswordLabel')}
value={password}
/>
</FlexBox>
Expand Down
2 changes: 2 additions & 0 deletions src/script/auth/component/JoinGuestLinkPasswordModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ const JoinGuestLinkPasswordModal = ({
id="guest_link_join_password"
className="modal__input"
type="password"
showTogglePasswordLabel={t('showTogglePasswordLabel')}
hideTogglePasswordLabel={t('hideTogglePasswordLabel')}
autoComplete="off"
value={passwordValue}
onChange={event => setPasswordValue(event.currentTarget.value)}
Expand Down
2 changes: 2 additions & 0 deletions src/script/auth/component/LoginForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ const LoginForm = ({isFetching, onSubmit}: LoginFormProps) => {
pattern={'.{1,1024}'}
required
data-uie-name="enter-password"
showTogglePasswordLabel={t('showTogglePasswordLabel')}
hideTogglePasswordLabel={t('hideTogglePasswordLabel')}
/>

{isFetching ? (
Expand Down
25 changes: 25 additions & 0 deletions src/script/auth/component/RouteA11y.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Wire
* Copyright (C) 2025 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*/

import {useRouteA11y} from '../hooks/useRouteA11y';

export const RouteA11y: React.FC = (): null => {
useRouteA11y();
return null;
};
53 changes: 53 additions & 0 deletions src/script/auth/hooks/useRouteA11y.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Wire
* Copyright (C) 2025 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*/

import {useEffect} from 'react';

import {useLocation} from 'react-router-dom';

export function useRouteA11y(screenKey?: string) {
const location = useLocation();

useEffect(() => {
const focusTarget: HTMLElement | null =
document.querySelector<HTMLElement>('[data-page-title]') ||
document.querySelector<HTMLElement>('main,[role="main"]') ||
document.querySelector<HTMLElement>('h1');

if (!focusTarget) {
return;
}

// scroll to top on each route change
window.scrollTo({top: 0, left: 0});

const element = focusTarget;
element.setAttribute('tabindex', '-1');
element.classList.add('sr-only-focus');
element.focus({preventScroll: true});

// remove tabindex after blur
const handleBlur = () => {
element.classList.remove('sr-only-focus');
element.removeAttribute('tabindex');
element.removeEventListener('blur', handleBlur);
};
element.addEventListener('blur', handleBlur);
}, [location.key, screenKey]);
}
Loading
Loading