Skip to content
Open
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
20 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
44c5de1
chore: Automate RC creation [WPB-22028]
thisisamir98 Nov 28, 2025
c5d9ddd
disable eslint react hooks for spec files
thisisamir98 Nov 28, 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
72 changes: 72 additions & 0 deletions .github/workflows/prepare-rc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: Prepare RC

on:
workflow_dispatch:
inputs:
rc_branch:
description: 'RC branch name (e.g. rc/2025-11-27)'
required: true
type: string
Comment on lines +6 to +9
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Important] The rc_branch input lacks validation and could be exploited for command injection or create unintended branch names. Although GitHub Actions provides some sanitization, it's best practice to explicitly validate the input format.

Consider adding a validation step after checkout:

- name: Validate RC branch name format
  run: |
    if ! [[ "${{ inputs.rc_branch }}" =~ ^rc/[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
      echo "Invalid RC branch name format. Expected: rc/YYYY-MM-DD" >&2
      exit 1
    fi

Copilot generated this review using guidance from repository custom instructions.

permissions:
contents: write
pull-requests: write

jobs:
prepare_rc:
runs-on: ubuntu-latest

steps:
- name: Ensure workflow is run from dev branch
if: github.ref_name != 'dev'
run: |
echo "This workflow can only be run when 'dev' is selected as the workflow ref (current: '${{ github.ref_name }}')." >&2
exit 1

- name: Checkout dev
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: dev

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22.x
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Important] Node.js version 22.x is inconsistent with the majority of workflows in this repository, which use 18.16.x. This could lead to:

  1. Dependency resolution differences
  2. Different build behavior
  3. Potential compatibility issues

Unless there's a specific reason to use Node 22 for RC preparation (which should be documented), change to match other workflows:

node-version: 18.16.x
Suggested change
node-version: 22.x
node-version: 18.16.x

Copilot uses AI. Check for mistakes.
cache: yarn

- name: Install JS dependencies (dev state)
run: yarn --immutable

# set -euo pipefail ensures the script fails on error
- name: Update @wireapp/* to latest stable
run: |
set -euo pipefail
yarn add \
@wireapp/store-engine@$(npm view @wireapp/store-engine dist-tags.latest) \
@wireapp/commons@$(npm view @wireapp/commons dist-tags.latest) \
@wireapp/core@$(npm view @wireapp/core dist-tags.latest) \
@wireapp/promise-queue@$(npm view @wireapp/promise-queue dist-tags.latest) \
@wireapp/react-ui-kit@$(npm view @wireapp/react-ui-kit dist-tags.latest) \
@wireapp/store-engine-dexie@$(npm view @wireapp/store-engine-dexie dist-tags.latest) \
@wireapp/telemetry@$(npm view @wireapp/telemetry dist-tags.latest) \
@wireapp/webapp-events@$(npm view @wireapp/webapp-events dist-tags.latest) \
@wireapp/copy-config@$(npm view @wireapp/copy-config dist-tags.latest) \
@wireapp/eslint-config@$(npm view @wireapp/eslint-config dist-tags.latest) \
@wireapp/prettier-config@$(npm view @wireapp/prettier-config dist-tags.latest)
Comment on lines +45 to +56
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Important] Missing error handling for npm view commands. If any package doesn't exist or the registry is unreachable, the command will fail silently or with unclear errors due to command substitution happening before yarn add executes.

Consider adding explicit checks or error handling:

- name: Update @wireapp/* to latest stable
  run: |
    set -euo pipefail
    
    # Fetch all versions first to fail fast if registry is unreachable
    STORE_ENGINE=$(npm view @wireapp/store-engine dist-tags.latest) || exit 1
    COMMONS=$(npm view @wireapp/commons dist-tags.latest) || exit 1
    # ... repeat for other packages
    
    yarn add \
      @wireapp/store-engine@${STORE_ENGINE} \
      @wireapp/commons@${COMMONS} \
      # ... etc
Suggested change
yarn add \
@wireapp/store-engine@$(npm view @wireapp/store-engine dist-tags.latest) \
@wireapp/commons@$(npm view @wireapp/commons dist-tags.latest) \
@wireapp/core@$(npm view @wireapp/core dist-tags.latest) \
@wireapp/promise-queue@$(npm view @wireapp/promise-queue dist-tags.latest) \
@wireapp/react-ui-kit@$(npm view @wireapp/react-ui-kit dist-tags.latest) \
@wireapp/store-engine-dexie@$(npm view @wireapp/store-engine-dexie dist-tags.latest) \
@wireapp/telemetry@$(npm view @wireapp/telemetry dist-tags.latest) \
@wireapp/webapp-events@$(npm view @wireapp/webapp-events dist-tags.latest) \
@wireapp/copy-config@$(npm view @wireapp/copy-config dist-tags.latest) \
@wireapp/eslint-config@$(npm view @wireapp/eslint-config dist-tags.latest) \
@wireapp/prettier-config@$(npm view @wireapp/prettier-config dist-tags.latest)
# Fetch all versions first to fail fast if registry is unreachable or a package is missing
STORE_ENGINE=$(npm view @wireapp/store-engine dist-tags.latest) || { echo "Failed to fetch @wireapp/store-engine version" >&2; exit 1; }
COMMONS=$(npm view @wireapp/commons dist-tags.latest) || { echo "Failed to fetch @wireapp/commons version" >&2; exit 1; }
CORE=$(npm view @wireapp/core dist-tags.latest) || { echo "Failed to fetch @wireapp/core version" >&2; exit 1; }
PROMISE_QUEUE=$(npm view @wireapp/promise-queue dist-tags.latest) || { echo "Failed to fetch @wireapp/promise-queue version" >&2; exit 1; }
REACT_UI_KIT=$(npm view @wireapp/react-ui-kit dist-tags.latest) || { echo "Failed to fetch @wireapp/react-ui-kit version" >&2; exit 1; }
STORE_ENGINE_DEXIE=$(npm view @wireapp/store-engine-dexie dist-tags.latest) || { echo "Failed to fetch @wireapp/store-engine-dexie version" >&2; exit 1; }
TELEMETRY=$(npm view @wireapp/telemetry dist-tags.latest) || { echo "Failed to fetch @wireapp/telemetry version" >&2; exit 1; }
WEBAPP_EVENTS=$(npm view @wireapp/webapp-events dist-tags.latest) || { echo "Failed to fetch @wireapp/webapp-events version" >&2; exit 1; }
COPY_CONFIG=$(npm view @wireapp/copy-config dist-tags.latest) || { echo "Failed to fetch @wireapp/copy-config version" >&2; exit 1; }
ESLINT_CONFIG=$(npm view @wireapp/eslint-config dist-tags.latest) || { echo "Failed to fetch @wireapp/eslint-config version" >&2; exit 1; }
PRETTIER_CONFIG=$(npm view @wireapp/prettier-config dist-tags.latest) || { echo "Failed to fetch @wireapp/prettier-config version" >&2; exit 1; }
yarn add \
@wireapp/store-engine@${STORE_ENGINE} \
@wireapp/commons@${COMMONS} \
@wireapp/core@${CORE} \
@wireapp/promise-queue@${PROMISE_QUEUE} \
@wireapp/react-ui-kit@${REACT_UI_KIT} \
@wireapp/store-engine-dexie@${STORE_ENGINE_DEXIE} \
@wireapp/telemetry@${TELEMETRY} \
@wireapp/webapp-events@${WEBAPP_EVENTS} \
@wireapp/copy-config@${COPY_CONFIG} \
@wireapp/eslint-config@${ESLINT_CONFIG} \
@wireapp/prettier-config@${PRETTIER_CONFIG}

Copilot uses AI. Check for mistakes.
Comment on lines +46 to +56
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Blocker] The dependency update list is incomplete. Based on package.json, the following @wireapp packages are missing from this update:

  • @wireapp/avs (dependency)
  • @wireapp/avs-debugger (dependency)
  • @wireapp/kalium-backup (dependency)

These packages should either be included in the update or explicitly documented why they're excluded. If they follow a different versioning strategy, that should be noted in a comment.

Suggested change
@wireapp/store-engine@$(npm view @wireapp/store-engine dist-tags.latest) \
@wireapp/commons@$(npm view @wireapp/commons dist-tags.latest) \
@wireapp/core@$(npm view @wireapp/core dist-tags.latest) \
@wireapp/promise-queue@$(npm view @wireapp/promise-queue dist-tags.latest) \
@wireapp/react-ui-kit@$(npm view @wireapp/react-ui-kit dist-tags.latest) \
@wireapp/store-engine-dexie@$(npm view @wireapp/store-engine-dexie dist-tags.latest) \
@wireapp/telemetry@$(npm view @wireapp/telemetry dist-tags.latest) \
@wireapp/webapp-events@$(npm view @wireapp/webapp-events dist-tags.latest) \
@wireapp/copy-config@$(npm view @wireapp/copy-config dist-tags.latest) \
@wireapp/eslint-config@$(npm view @wireapp/eslint-config dist-tags.latest) \
@wireapp/prettier-config@$(npm view @wireapp/prettier-config dist-tags.latest)
@wireapp/avs@$(npm view @wireapp/avs dist-tags.latest) \
@wireapp/avs-debugger@$(npm view @wireapp/avs-debugger dist-tags.latest) \
@wireapp/commons@$(npm view @wireapp/commons dist-tags.latest) \
@wireapp/copy-config@$(npm view @wireapp/copy-config dist-tags.latest) \
@wireapp/core@$(npm view @wireapp/core dist-tags.latest) \
@wireapp/eslint-config@$(npm view @wireapp/eslint-config dist-tags.latest) \
@wireapp/kalium-backup@$(npm view @wireapp/kalium-backup dist-tags.latest) \
@wireapp/prettier-config@$(npm view @wireapp/prettier-config dist-tags.latest) \
@wireapp/promise-queue@$(npm view @wireapp/promise-queue dist-tags.latest) \
@wireapp/react-ui-kit@$(npm view @wireapp/react-ui-kit dist-tags.latest) \
@wireapp/store-engine@$(npm view @wireapp/store-engine dist-tags.latest) \
@wireapp/store-engine-dexie@$(npm view @wireapp/store-engine-dexie dist-tags.latest) \
@wireapp/telemetry@$(npm view @wireapp/telemetry dist-tags.latest) \
@wireapp/webapp-events@$(npm view @wireapp/webapp-events dist-tags.latest)

Copilot uses AI. Check for mistakes.

- name: Show diff
run: git diff
Comment on lines +58 to +59
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] [Suggestion] The Show diff step is helpful for debugging but doesn't fail the workflow if there are no changes. Consider adding a check to ensure dependencies were actually updated:

- name: Show diff and verify changes
  run: |
    git diff
    if ! git diff --quiet; then
      echo "✓ Dependencies updated successfully"
    else
      echo "⚠️  Warning: No changes detected after dependency update" >&2
    fi

This helps catch scenarios where all packages are already at the latest version.

Suggested change
- name: Show diff
run: git diff
- name: Show diff and verify changes
run: |
git diff
if git diff --quiet; then
echo "⚠️ Warning: No changes detected after dependency update" >&2
else
echo "✓ Dependencies updated successfully"
fi

Copilot uses AI. Check for mistakes.

- name: Create RC pull request
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Important] Using GITHUB_TOKEN for automated PR creation is inconsistent with other workflows in this repository. All other automated PR workflows (cherry-pick, translations sync) use OTTO_THE_BOT_GH_TOKEN, which:

  1. Properly attributes the PR to the bot user
  2. Allows triggered workflows to run (GITHUB_TOKEN-created PRs don't trigger workflows by design)
  3. Maintains consistency across the repository

Change to:

token: ${{ secrets.OTTO_THE_BOT_GH_TOKEN }}
Suggested change
token: ${{ secrets.GITHUB_TOKEN }}
token: ${{ secrets.OTTO_THE_BOT_GH_TOKEN }}

Copilot uses AI. Check for mistakes.
commit-message: 'chore: ${{ inputs.rc_branch }}'
branch: ${{ inputs.rc_branch }}
base: master
title: 'chore: ${{ inputs.rc_branch }}'
Comment on lines +65 to +68
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] The commit message and PR title use the full RC branch name which may not be descriptive. Consider a more informative format:

commit-message: 'chore: Prepare release candidate ${{ inputs.rc_branch }}'

And for the title (line 68):

title: 'chore: Prepare release candidate ${{ inputs.rc_branch }}'

This makes it clearer that this is an RC preparation PR when reviewing the commit history.

Suggested change
commit-message: 'chore: ${{ inputs.rc_branch }}'
branch: ${{ inputs.rc_branch }}
base: master
title: 'chore: ${{ inputs.rc_branch }}'
commit-message: 'chore: Prepare release candidate ${{ inputs.rc_branch }}'
branch: ${{ inputs.rc_branch }}
base: master
title: 'chore: Prepare release candidate ${{ inputs.rc_branch }}'

Copilot uses AI. Check for mistakes.
body: |
Automated RC creation from `dev`.
@wireapp/* dependencies have been bumped to dist-tags.latest (stable) on this branch.
sign-commits: true
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Important] sign-commits: true may not work correctly with GITHUB_TOKEN. According to peter-evans/create-pull-request documentation, signed commits require either:

  1. A Personal Access Token (PAT) with signing configured
  2. The bot token to have GPG signing set up

Since line 64 uses GITHUB_TOKEN (which should be changed to OTTO_THE_BOT_GH_TOKEN per another comment), ensure that otto-the-bot has GPG signing configured. If not, remove this line or configure signing for the bot account.

Suggested change
sign-commits: true

Copilot uses AI. Check for mistakes.
23 changes: 12 additions & 11 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.5",
"@wireapp/kalium-backup": "0.0.4",
"@wireapp/promise-queue": "2.4.9",
"@wireapp/react-ui-kit": "9.69.6",
Expand All @@ -27,11 +27,11 @@
"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",
Expand All @@ -45,7 +45,7 @@
"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",
"[email protected]": "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": "[email protected]"
Expand Down
2 changes: 1 addition & 1 deletion server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
12 changes: 6 additions & 6 deletions server/yarn.lock
Original file line number Diff line number Diff line change
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 @@ -5555,7 +5555,7 @@ __metadata:
nocache: "npm:4.0.0"
opn: "npm:6.0.0"
pm2: "npm:6.0.13"
rimraf: "npm:6.1.0"
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]);
}
4 changes: 3 additions & 1 deletion src/script/auth/page/CreatePersonalAccount.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ export const CreatePersonalAccount = () => {
<div css={styles.backButtonContainer}>
<BackButton />
</div>
<p css={styles.header}>{t('createPersonalAccount.headLine')}</p>
<p css={styles.header} role="heading" aria-level={1} data-page-title tabIndex={-1}>
{t('createPersonalAccount.headLine')}
</p>
<AccountForm onSubmit={onSubmit} />
<p css={styles.footer}>{t('createPersonalAccount.subHeader')}</p>
<a css={styles.teamCreateButton} href={EXTERNAL_ROUTE.WIRE_TEAMS_SIGNUP} target="_blank" rel="noreferrer">
Expand Down
Loading
Loading