Skip to content

Refactor flow entering guest name and guest access - #3275

Open
Sabr1n4W wants to merge 41 commits into
developfrom
refactor-flow-entering-guest-name-and-guest-access
Open

Refactor flow entering guest name and guest access#3275
Sabr1n4W wants to merge 41 commits into
developfrom
refactor-flow-entering-guest-name-and-guest-access

Conversation

@Sabr1n4W

@Sabr1n4W Sabr1n4W commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Fixes #2450

Type

  • Bugfix
  • Feature
  • Documentation
  • Refactoring (e.g. Style updates, Test implementation, etc.)
  • Other (please describe):

Checklist

  • Code updated to current develop branch head
  • Passes CI checks
  • Is a part of an issue
  • Tests added for the bugfix or newly implemented feature, describe below why if not
  • Changelog is updated
  • Documentation of code and features exists

Changes

  • Move guest name input from join dialog to room access overlay
  • Add possibility to remember the guest name for future visits
  • Add possibility to pass access code and personalized link as hash params
  • Include the room access code in room share links as a hash parameter
  • Move personalized link tokens from route parameters to hash parameters
  • Store access code and personalized link tokens in sessionStorage to preserve room access across page reloads
  • Clear room tab / user tab hash when an invalid hash was provided and falling back to first / default tab

Other information

Summary by CodeRabbit

  • New Features
    • Introduced a room access overlay for guests with “continue as guest,” login-as-user, optional “remember name,” and participant-name editing.
    • Added a new participant name validation endpoint used by the room join flow.
    • Updated room/sharing links to include access-code/personalized-link details via URL hash.
  • Bug Fixes
    • Improved resilience for invalid room/user/tab links by clearing bad hashes and tightening fallback behavior.
    • Preserved guest access state (including saved names/codes) across reloads.
  • Tests
    • Expanded backend validation tests and refreshed/added Cypress E2E coverage for guest and access-code flows.
  • Chores
    • Updated changelog and UI text/localization; minor layout spacing adjustments.

@Sabr1n4W Sabr1n4W self-assigned this Jul 1, 2026
@Sabr1n4W Sabr1n4W added the UI User Interface label Jul 1, 2026
@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7e30a660-19f7-4566-887a-57af21600ec9

📥 Commits

Reviewing files that changed from the base of the PR and between d03fe1f and f149d81.

📒 Files selected for processing (2)
  • resources/js/views/RoomsView.vue
  • tests/Frontend/e2e/RoomsViewAccessParticipantName.cy.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/Frontend/e2e/RoomsViewAccessParticipantName.cy.js

Walkthrough

This PR reworks guest room entry with a dedicated access overlay, shared participant-name validation, remembered guest names, hash-based access-code and personalized-link handling, invalid tab-hash cleanup, updated translations, and extensive frontend and system test coverage.

Changes

Guest Access and Room Link Flow

Layer / File(s) Summary
Participant-name validation and API
app/Http/Requests/*.php, routes/api.php, tests/Backend/Feature/api/v1/Room/RoomTest.php
Adds shared participant-name validation, exposes participantName/check, reuses the rules for meeting requests, and adds backend coverage.
Room access UI and integration
resources/js/components/RoomAccessOverlay.vue, resources/js/components/RoomParticipantNameChangeButton.vue, resources/js/components/RoomJoinButton.vue, resources/js/views/RoomsView.vue
Moves guest-name entry into the room access overlay, adds remembered-name and change-name flows, and passes the selected name into join/start requests.
Room credentials and routing
resources/js/router.js, resources/js/views/RoomsView.vue, resources/js/components/RoomShareButton.vue, resources/js/components/RoomTabPersonalizedLinksCopyButton.vue
Uses hash parameters for access codes and personalized links, redirects legacy token routes, persists room credentials, and handles reload and authentication errors.
Tab fallback and layout
resources/js/components/RoomTabSection.vue, resources/js/components/UserTabSection.vue, resources/js/components/RoomHeader.vue, resources/js/components/RoomBBBMessage.vue, resources/js/components/RoomTab*.vue
Clears invalid tab hashes and updates spacing and padding across room-related views.
Test support and migration coverage
tests/Frontend/support/commands/*, tests/Frontend/fixtures/config.json, tests/Frontend/e2e/*.cy.js, tests/System/e2e/*.cy.js
Adds remembered-name helpers and updates existing room, lobby, access, meeting, file, recording, and tab-flow tests.
Comprehensive access coverage
tests/Frontend/e2e/RoomsViewAccess*.cy.js
Adds coverage for guest names, access codes, personalized links, saved credential priority, reloads, storage cleanup, throttling, and authentication errors.

Estimated code review effort: 4 (Complex) | ~75 minutes

Possibly related PRs

Suggested labels: frontend, UI, refactor

Suggested reviewers: copilot, samuelwei

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR also includes broad hash, sessionStorage, share-link, and tab-handling changes beyond the linked guest-name flow. Split the hash/session/share-link/tab-hash work into separate PRs or link the additional changes to their own issue.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and matches the PR’s main guest-name/access-flow refactor.
Description check ✅ Passed The description follows the template and covers issue link, type, checklist, and change summary.
Linked Issues check ✅ Passed The PR implements the linked guest-name flow change by moving name entry out of the join/start modal.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor-flow-entering-guest-name-and-guest-access

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Jul 1, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.31650% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 97.10%. Comparing base (45e729f) to head (f149d81).
⚠️ Report is 16 commits behind head on develop.

Files with missing lines Patch % Lines
resources/js/views/RoomsView.vue 97.74% 3 Missing ⚠️
resources/js/components/RoomJoinButton.vue 66.66% 2 Missing ⚠️
Additional details and impacted files
@@              Coverage Diff              @@
##             develop    #3275      +/-   ##
=============================================
- Coverage      97.11%   97.10%   -0.02%     
- Complexity      1948     1951       +3     
=============================================
  Files            483      486       +3     
  Lines          16654    16867     +213     
  Branches        2408     2451      +43     
=============================================
+ Hits           16174    16378     +204     
- Misses           480      489       +9     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@cypress

cypress Bot commented Jul 1, 2026

Copy link
Copy Markdown

PILOS    Run #3200

Run Properties:  status check failed Failed #3200  •  git commit f149d815c6: Refactor flow entering guest name and guest access
Project PILOS
Branch Review refactor-flow-entering-guest-name-and-guest-access
Run status status check failed Failed #3200
Run duration 08m 05s
Commit git commit f149d815c6: Refactor flow entering guest name and guest access
Committer Sabrina Wüst
View all properties for this run ↗︎

Test results
Tests that failed  Failures 1
Tests that were flaky  Flaky 0
Tests that did not run due to a developer annotating a test with .skip  Pending 0
Tests that did not run due to a failure in a mocha hook  Skipped 0
Tests that passed  Passing 651
View all changes introduced in this branch ↗︎

Tests for review

Failed  e2e/RoomsJoinWithLobby.cy.js • 1 failed test • System tests

View Output

Test Artifacts
Room Join with lobby settings > Lobby enabled for guests only Test Replay Screenshots

@Sabr1n4W
Sabr1n4W marked this pull request as ready for review July 8, 2026 08:09

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🧹 Nitpick comments (2)
app/Http/Requests/ValidateParticipantNameRequest.php (1)

12-17: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Optional: document the rules() return shape.

Straightforward and correct; omitting authorize() is fine here since this codebase's Laravel 11+ FormRequest::passesAuthorization() defaults to true. As a nitpick, per coding guidelines you could add a PHPDoc array-shape annotation for rules()'s return value for consistency with the rest of the codebase.

As per coding guidelines: "Use array shape type definitions in PHPDoc blocks."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/Http/Requests/ValidateParticipantNameRequest.php` around lines 12 - 17,
Add a PHPDoc array-shape annotation for the
ValidateParticipantNameRequest::rules() return value to match the codebase
guideline on documenting array shapes. Keep the existing validation logic
unchanged, and place the docblock directly above rules() so the shape of the
returned array is explicit for future readers and static analysis.

Source: Coding guidelines

resources/js/components/RoomAccessOverlay.vue (1)

94-127: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated error-block markup uses raw Tailwind colors instead of PrimeVue tokens.

The authThrottledFor and accessCodeInvalid error blocks are near-identical (same classes/structure, different message) and both use raw Tailwind palette colors (text-red-500 dark:text-red-300) rather than PrimeVue color tokens. Consider consolidating into one block driven by a computed message, and switching to PrimeVue's semantic error/danger color tokens for design consistency.

As per path instructions: "Use PrimeVue color tokens instead of custom colors to maintain design consistency."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@resources/js/components/RoomAccessOverlay.vue` around lines 94 - 127, The two
alert blocks in RoomAccessOverlay.vue are duplicated and both hardcode Tailwind
red classes, so simplify this section by using a single error block driven by a
computed/current error message instead of separate authThrottledFor and
accessCodeInvalid branches. Update the shared markup to use PrimeVue semantic
error/danger tokens rather than text-red-500 and dark:text-red-300, keeping the
same structure and formError ref/role behavior. Use the existing conditionals
and message sources in RoomAccessOverlay.vue to determine which message to
render, but avoid repeating the entire block.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@resources/js/components/RoomAccessOverlay.vue`:
- Around line 94-126: The `formError` focus hook in `RoomAccessOverlay.vue` is
unused, so the alert never receives programmatic focus when `authThrottledFor`
or `accessCodeInvalid` appears. Add a `formError` ref in `<script setup>`, then
use the existing `ref="formError"` on the error alert blocks to focus the
element when either error state becomes visible (for example via a watcher or
after the submit/error state updates). Keep the fix aligned with the access-code
flow in `RoomAccessOverlay` so the alert announcement behavior is restored for
screen-reader and keyboard users.
- Around line 2-13: The Badge sizing in RoomAccessOverlay.vue is using Tailwind
v3 important classes, so update the Badge class on the header icon wrapper to
Tailwind v4 important syntax using the suffix form instead of the prefix form.
Locate the Badge inside the RoomAccessOverlay.vue template and replace the
existing size utilities so the dimensions still override PrimeVue defaults while
remaining compatible with Tailwind v4.

In `@resources/js/views/RoomsView.vue`:
- Around line 571-572: initializeRoomView() currently keeps running after
loadSavedAccessParameters() redirects authenticated users away from guest-only
links, which can still lead to load() being called; update
loadSavedAccessParameters() to return a boolean indicating whether it
redirected, and in initializeRoomView() exit early when that return value shows
the redirect happened. Use the existing loadSavedAccessParameters and
initializeRoomView symbols to keep the control flow clear and prevent any
post-redirect initialization.
- Around line 678-689: The credential persistence in RoomsView.vue leaves the
previously stored alternate token behind, so a new access code can be
overshadowed by an old personalized link on reload. Update the save logic around
the room auth token handling to clear the other sessionStorage entry whenever
one credential type is written: in the personalized-link branch remove the
roomAccessCode_${props.id} item, and in the roomAuthToken.value.type ===
ROOM_AUTH_TOKEN_TYPE_CODE branch remove the roomPersonalizedLink_${props.id}
item.

In `@routes/api.php`:
- Around line 179-182: The new public participantName.check endpoint is missing
the same abuse protection used by the other guest routes. Add an appropriate
throttle middleware to the Route::post('participantName/check') definition in
routes/api.php, following the pattern already used for login/local, login/ldap,
password/reset, password/email, and the rooms/{room}/auth group so
ValidateParticipantNameRequest remains rate-limited.

In `@tests/Frontend/support/commands/roomCommands.js`:
- Around line 162-166: The guest-login flow in roomCommands.js is missing a stub
for api/v1/participantName/check, so the `#participant-name` to room-login-button
path can hit the real backend. Update the guest-login helper used by
cy.init()/cy.interceptRoomViewRequests() to reuse
setValidRememberedParticipantName(), or add the intercept directly in the
guest-login step before typing the name, so the participant name check is always
mocked.

---

Nitpick comments:
In `@app/Http/Requests/ValidateParticipantNameRequest.php`:
- Around line 12-17: Add a PHPDoc array-shape annotation for the
ValidateParticipantNameRequest::rules() return value to match the codebase
guideline on documenting array shapes. Keep the existing validation logic
unchanged, and place the docblock directly above rules() so the shape of the
returned array is explicit for future readers and static analysis.

In `@resources/js/components/RoomAccessOverlay.vue`:
- Around line 94-127: The two alert blocks in RoomAccessOverlay.vue are
duplicated and both hardcode Tailwind red classes, so simplify this section by
using a single error block driven by a computed/current error message instead of
separate authThrottledFor and accessCodeInvalid branches. Update the shared
markup to use PrimeVue semantic error/danger tokens rather than text-red-500 and
dark:text-red-300, keeping the same structure and formError ref/role behavior.
Use the existing conditionals and message sources in RoomAccessOverlay.vue to
determine which message to render, but avoid repeating the entire block.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: b0950a24-c392-40cc-9f01-ababbbe34cff

📥 Commits

Reviewing files that changed from the base of the PR and between 45e729f and 3c0ebc4.

📒 Files selected for processing (43)
  • CHANGELOG.md
  • app/Http/Requests/ValidateParticipantNameRequest.php
  • lang/en/app.php
  • lang/en/auth.php
  • lang/en/rooms.php
  • resources/js/components/RoomAccessOverlay.vue
  • resources/js/components/RoomBBBMessage.vue
  • resources/js/components/RoomHeader.vue
  • resources/js/components/RoomJoinButton.vue
  • resources/js/components/RoomParticipantNameChangeButton.vue
  • resources/js/components/RoomShareButton.vue
  • resources/js/components/RoomTabHistory.vue
  • resources/js/components/RoomTabPersonalizedLinksCopyButton.vue
  • resources/js/components/RoomTabRecordings.vue
  • resources/js/components/RoomTabSection.vue
  • resources/js/components/RoomTabSettings.vue
  • resources/js/components/RoomTabStreaming.vue
  • resources/js/components/UserTabSection.vue
  • resources/js/composables/useRoomHelpers.js
  • resources/js/router.js
  • resources/js/views/RoomsView.vue
  • routes/api.php
  • tests/Backend/Feature/api/v1/Room/RoomTest.php
  • tests/Frontend/e2e/AdminUsersEdit.cy.js
  • tests/Frontend/e2e/AdminUsersView.cy.js
  • tests/Frontend/e2e/RoomsViewAccess.cy.js
  • tests/Frontend/e2e/RoomsViewDescription.cy.js
  • tests/Frontend/e2e/RoomsViewFiles.cy.js
  • tests/Frontend/e2e/RoomsViewFilesFileActions.cy.js
  • tests/Frontend/e2e/RoomsViewGeneral.cy.js
  • tests/Frontend/e2e/RoomsViewHistory.cy.js
  • tests/Frontend/e2e/RoomsViewMeetings.cy.js
  • tests/Frontend/e2e/RoomsViewMembers.cy.js
  • tests/Frontend/e2e/RoomsViewPersonalizedLinks.cy.js
  • tests/Frontend/e2e/RoomsViewPersonalizedLinksTokenActions.cy.js
  • tests/Frontend/e2e/RoomsViewRecordings.cy.js
  • tests/Frontend/e2e/RoomsViewRecordingsRecordingActions.cy.js
  • tests/Frontend/e2e/RoomsViewSettings.cy.js
  • tests/Frontend/e2e/UserProfile.cy.js
  • tests/Frontend/fixtures/config.json
  • tests/Frontend/support/commands/roomCommands.js
  • tests/System/e2e/RoomsJoinWithLobby.cy.js
  • tests/System/e2e/RoomsViewGeneral.cy.js

Comment thread resources/js/components/RoomAccessOverlay.vue
Comment thread resources/js/components/RoomAccessOverlay.vue Outdated
Comment thread resources/js/views/RoomsView.vue
Comment thread resources/js/views/RoomsView.vue
Comment thread routes/api.php
Comment thread tests/Frontend/support/commands/roomCommands.js
@Sabr1n4W
Sabr1n4W requested a review from samuelwei July 8, 2026 11:46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@resources/js/components/RoomAccessOverlay.vue`:
- Line 91: The InputMask key handler is triggering submit twice because
`@keydown.enter="submit"` runs alongside the form’s `@submit="submit"` behavior.
Update `RoomAccessOverlay.vue` by changing the `@keydown.enter` binding on the
input element to prevent the default Enter action so only one submit path runs.
Keep the fix localized to the existing `submit()` flow and the `@keydown.enter`
handler.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 6dbdd51e-d917-43be-97f6-b6156b037b3b

📥 Commits

Reviewing files that changed from the base of the PR and between 6302074 and e6fad45.

📒 Files selected for processing (12)
  • app/Http/Requests/JoinMeetingRequest.php
  • app/Http/Requests/StartMeetingRequest.php
  • app/Http/Requests/ValidateParticipantNameRequest.php
  • resources/js/components/RoomAccessOverlay.vue
  • resources/js/components/RoomTabDescription.vue
  • resources/js/components/RoomTabFiles.vue
  • resources/js/components/RoomTabHistory.vue
  • resources/js/components/RoomTabMembers.vue
  • resources/js/components/RoomTabPersonalizedLinks.vue
  • resources/js/components/RoomTabRecordings.vue
  • resources/js/components/RoomTabSection.vue
  • resources/js/views/RoomsView.vue
✅ Files skipped from review due to trivial changes (6)
  • resources/js/components/RoomTabMembers.vue
  • resources/js/components/RoomTabDescription.vue
  • resources/js/components/RoomTabFiles.vue
  • resources/js/components/RoomTabRecordings.vue
  • resources/js/components/RoomTabPersonalizedLinks.vue
  • resources/js/components/RoomTabHistory.vue
🚧 Files skipped from review as they are similar to previous changes (3)
  • app/Http/Requests/ValidateParticipantNameRequest.php
  • resources/js/components/RoomTabSection.vue
  • resources/js/views/RoomsView.vue

Comment thread resources/js/components/RoomAccessOverlay.vue
v-if="room.last_meeting?.detached"
severity="warn"
icon="fa-solid fa-unlink"
:class="

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Unsure about this. Could be move this to the parent div or increase the gap there?

Comment thread resources/js/components/RoomJoinButton.vue Outdated
Comment thread resources/js/components/RoomAccessOverlay.vue
EventBus.on(EVENT_FORBIDDEN, reload);
EventBus.on(EVENT_UNAUTHORIZED, reload);

initializeRoomView();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

We could add an eventListener to detect user-triggered changes to the hash.
If the hash is changed via hashParams the event is not triggered (https://developer.mozilla.org/en-US/docs/Web/API/Window/hashchange_event)

Currently if the page is already loaded and we get an auth error, e.g. in the meantime an access code has been added or changes, we cannot copy the new url and paste it in the url

window.addEventListener("hashchange", () => {
    console.log(hashParams.accessCode);
});

@samuelwei samuelwei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

RoomView.vue Review still pending due to its complexity

Copilot AI review requested due to automatic review settings July 23, 2026 10:19

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR refactors the guest onboarding and room access flow by moving guest-name entry into a dedicated room access overlay, adding “remember guest name” behavior, and supporting access credentials (access code / personalized link) via URL hash + sessionStorage to persist access across reloads.

Changes:

  • Introduces a new RoomAccessOverlay + guest participant-name validation endpoint and updates room join/start flows to consume the participant name from the room view state.
  • Moves personalized-link tokens and access codes to hash parameters (with legacy route compatibility), and persists them in sessionStorage for reload resilience.
  • Expands/adjusts Cypress E2E coverage and adds backend validation tests for participant-name rules.

Reviewed changes

Copilot reviewed 51 out of 52 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/System/e2e/RoomsViewGeneral.cy.js Updates system E2E selectors/flow for new access overlay.
tests/System/e2e/RoomsJoinWithLobby.cy.js Adjusts join flow by pre-seeding remembered guest name.
tests/Frontend/support/commands/roomCommands.js Updates shared Cypress room commands for new overlay and access persistence.
tests/Frontend/support/commands/generalCommands.js Adds Cypress helper for reloading with a hash.
tests/Frontend/fixtures/config.json Adds allowed_name_characters to fixture config.
tests/Frontend/e2e/UserProfile.cy.js Updates invalid tab-hash behavior expectations.
tests/Frontend/e2e/RoomsViewSettings.cy.js Updates overlay selector assertions.
tests/Frontend/e2e/RoomsViewRecordingsRecordingActions.cy.js Updates recordings actions flows for hash-based access code / remembered guest name.
tests/Frontend/e2e/RoomsViewRecordings.cy.js Updates recordings flows for hash-based access code / personalized link.
tests/Frontend/e2e/RoomsViewPersonalizedLinksTokenActions.cy.js Updates expected copied personalized-link URL format.
tests/Frontend/e2e/RoomsViewPersonalizedLinks.cy.js Updates access overlay interactions and tab-hash expectations.
tests/Frontend/e2e/RoomsViewMembers.cy.js Updates access overlay interactions and tab-hash expectations.
tests/Frontend/e2e/RoomsViewMeetings.cy.js Updates meeting join/start flows to use remembered participant name and hash access parameters.
tests/Frontend/e2e/RoomsViewHistory.cy.js Updates access overlay interactions and tab-hash expectations.
tests/Frontend/e2e/RoomsViewFilesFileActions.cy.js Updates file actions flows for hash-based access code and overlay.
tests/Frontend/e2e/RoomsViewFiles.cy.js Updates files flows for hash-based access code and personalized link.
tests/Frontend/e2e/RoomsViewDescription.cy.js Seeds remembered participant name for guest flows.
tests/Frontend/e2e/RoomsViewAccessPersonalizedLink.cy.js New E2E coverage for hash/sessionStorage personalized-link access.
tests/Frontend/e2e/RoomsViewAccessParticipantName.cy.js New E2E coverage for participant-name validation and remembered-name behavior.
tests/Frontend/e2e/RoomsViewAccess.cy.js New E2E coverage for the overall room access overlay guest flow.
tests/Frontend/e2e/AdminUsersView.cy.js Updates invalid tab-hash behavior expectations.
tests/Frontend/e2e/AdminUsersEdit.cy.js Updates invalid tab-hash behavior expectations.
tests/Backend/Feature/api/v1/Room/RoomTest.php Adds backend feature test coverage for participant-name validation.
routes/api.php Adds participantName/check validation endpoint.
resources/js/views/RoomsView.vue Refactors room access flow: overlay, hash params, sessionStorage persistence, guest-name state.
resources/js/router.js Removes token route param from rooms view; adds legacy redirect route to hash-based token.
resources/js/composables/useRoomHelpers.js Minor formatting/noise change.
resources/js/components/UserTabSection.vue Clears invalid tab hash (user tabs) on mount.
resources/js/components/RoomTabSection.vue Clears invalid room tab hash on mount; minor layout tweaks.
resources/js/components/RoomTabRecordings.vue Minor layout tweaks (padding changes).
resources/js/components/RoomTabPersonalizedLinksCopyButton.vue Updates copied link to hash-based personalized-link token.
resources/js/components/RoomTabPersonalizedLinks.vue Minor layout tweaks (padding changes).
resources/js/components/RoomTabMembers.vue Minor layout tweaks (padding changes).
resources/js/components/RoomTabHistory.vue Minor layout tweaks (padding changes).
resources/js/components/RoomTabFiles.vue Minor layout tweaks (padding changes).
resources/js/components/RoomTabDescription.vue Minor layout tweaks (padding changes).
resources/js/components/RoomShareButton.vue Includes access code in share link hash when applicable.
resources/js/components/RoomParticipantNameChangeButton.vue New guest UI to change/remember participant name with validation.
resources/js/components/RoomJoinButton.vue Removes guest-name input from join dialog; uses participant name passed in from room view.
resources/js/components/RoomHeader.vue Moves connection warning notes out of header; minor spacing tweaks.
resources/js/components/RoomBBBMessage.vue Minor spacing tweaks.
resources/js/components/RoomAccessOverlay.vue New access overlay component for guest name + access code + login CTA.
lang/en/rooms.php Adds/updates strings for guest onboarding and name management.
lang/en/auth.php Adds login CTA label string.
lang/en/app.php Adds “or” translation used in overlay.
CHANGELOG.md Documents the new guest name/access persistence behavior.
app/Http/Requests/ValidateParticipantNameRequest.php New FormRequest encapsulating participant-name validation rules.
app/Http/Requests/StartMeetingRequest.php Reuses participant-name validation rules via new request helper.
app/Http/Requests/JoinMeetingRequest.php Reuses participant-name validation rules via new request helper.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +81 to +83
.then(() => {
cy.reload();
});
Comment on lines +194 to +196
watch(participantName, (value) => {
participantNameInput.value = value;
});
Comment thread resources/js/components/RoomAccessOverlay.vue
*/
function handleInvalidPersonalizedLink() {
// Show error message
tokenInvalid.value = true;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
tokenInvalid.value = true;
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);

Unsure about the behavior when entering an invalid personalized room link.

Before this PR the user could paste the regular room url to load without a personalized link.

With the PR the user cannot paste the regular room url, the invalid personalized link is persisted in the local storage.
The only option to successfully load the room is either pasting a new valid personalized link or a link with an access code.

@Sabr1n4W Sabr1n4W Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Not persisting the personalized link in the session storage could lead to the following problem (because the hash is cleared):

  • User tries to enter the room with an invalid personalized link
  • Error message is shown that the personalized link is invalid
  • User reloads the whole page => User enters the room as "normal" guest instead of the personalized link without noticing it (especially if the room does not have an access code)

Because of that the personalized link is currently persisted to make sure that the user does not "change" to the "normal" guest access without noticing it / intending to do so if I remember it correctly

An alternative approach could maybe be to keep the personalized link in the hash and only clear it after the auth request was successfull

Another possible solution I thought about was maybe offering an explicit way to change to the "normal" guest access on the error page

@samuelwei samuelwei Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Fair point, maybe adding a new route to redirect users to? I'll try it

Comment on lines +737 to +803
async function loadSavedAccessParameters() {
// Load personalized link from hash params
if (hashParams.personalizedLink) {
personalizedLink.value = hashParams.personalizedLink;

sessionStorage.setItem(
"roomPersonalizedLink_" + props.id,
hashParams.personalizedLink,
);

// Clear hash params
await nextTick();
hashParams.personalizedLink = null;

// Treat a personalized link from the hash as the selected credential
// discard any competing hash access code so it cannot win on a later reload when
// the personalized link is only stored in session storage
hashParams.accessCode = null;
return;
}

// Load Access Parameters stored in hash params
if (hashParams.accessCode) {
accessCodeInput.value = hashParams.accessCode;
// Set access code param in session storage to make sure that access code
// stays set if the user decides to log in (navigates to login page)
sessionStorage.setItem("roomAccessCode_" + props.id, hashParams.accessCode);

// Treat an access code from the hash as the selected credential
// discard any saved personalized link so it cannot win on a later reload when
// the access code is only stored in session storage
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);

// Clear hash params
await nextTick();
hashParams.accessCode = null;
}

// Load Access Parameters stored in session storage only if parameters are not already set by hash params
if (accessCodeInput.value === "") {
const savedPersonalizedLink = sessionStorage.getItem(
"roomPersonalizedLink_" + props.id,
);
if (savedPersonalizedLink) {
if (authStore.isAuthenticated) {
// User is authenticated and not allowed to use personalized link, remove it from session storage
// and continue without loading the existing personalized link
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);
} else {
personalizedLink.value = savedPersonalizedLink;
return;
}
}

const savedAccessCode = sessionStorage.getItem(
"roomAccessCode_" + props.id,
);

if (savedAccessCode) {
accessCodeInput.value = savedAccessCode;
}
}

if (!authStore.isAuthenticated) {
await loadSavedGuestName();
}
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
async function loadSavedAccessParameters() {
// Load personalized link from hash params
if (hashParams.personalizedLink) {
personalizedLink.value = hashParams.personalizedLink;
sessionStorage.setItem(
"roomPersonalizedLink_" + props.id,
hashParams.personalizedLink,
);
// Clear hash params
await nextTick();
hashParams.personalizedLink = null;
// Treat a personalized link from the hash as the selected credential
// discard any competing hash access code so it cannot win on a later reload when
// the personalized link is only stored in session storage
hashParams.accessCode = null;
return;
}
// Load Access Parameters stored in hash params
if (hashParams.accessCode) {
accessCodeInput.value = hashParams.accessCode;
// Set access code param in session storage to make sure that access code
// stays set if the user decides to log in (navigates to login page)
sessionStorage.setItem("roomAccessCode_" + props.id, hashParams.accessCode);
// Treat an access code from the hash as the selected credential
// discard any saved personalized link so it cannot win on a later reload when
// the access code is only stored in session storage
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);
// Clear hash params
await nextTick();
hashParams.accessCode = null;
}
// Load Access Parameters stored in session storage only if parameters are not already set by hash params
if (accessCodeInput.value === "") {
const savedPersonalizedLink = sessionStorage.getItem(
"roomPersonalizedLink_" + props.id,
);
if (savedPersonalizedLink) {
if (authStore.isAuthenticated) {
// User is authenticated and not allowed to use personalized link, remove it from session storage
// and continue without loading the existing personalized link
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);
} else {
personalizedLink.value = savedPersonalizedLink;
return;
}
}
const savedAccessCode = sessionStorage.getItem(
"roomAccessCode_" + props.id,
);
if (savedAccessCode) {
accessCodeInput.value = savedAccessCode;
}
}
if (!authStore.isAuthenticated) {
await loadSavedGuestName();
}
}
async function loadSavedAccessParameters() {
if (!authStore.isAuthenticated) {
await loadSavedGuestName();
}
// Load personalized link from hash params
if (hashParams.personalizedLink) {
personalizedLink.value = hashParams.personalizedLink;
sessionStorage.setItem(
"roomPersonalizedLink_" + props.id,
hashParams.personalizedLink,
);
// Clear hash params
await nextTick();
hashParams.personalizedLink = null;
// Treat a personalized link from the hash as the selected credential
// discard any competing hash access code so it cannot win on a later reload when
// the personalized link is only stored in session storage
hashParams.accessCode = null;
return;
}
// Load Access Parameters stored in hash params
if (hashParams.accessCode) {
accessCodeInput.value = hashParams.accessCode;
// Set access code param in session storage to make sure that access code
// stays set if the user decides to log in (navigates to login page)
sessionStorage.setItem("roomAccessCode_" + props.id, hashParams.accessCode);
// Treat an access code from the hash as the selected credential
// discard any saved personalized link so it cannot win on a later reload when
// the access code is only stored in session storage
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);
// Clear hash params
await nextTick();
hashParams.accessCode = null;
return;
}
// Load Access Parameters stored in session storage only if parameters are not already set by hash params
if (accessCodeInput.value === "") {
const savedPersonalizedLink = sessionStorage.getItem(
"roomPersonalizedLink_" + props.id,
);
if (savedPersonalizedLink) {
if (authStore.isAuthenticated) {
// User is authenticated and not allowed to use personalized link, remove it from session storage
// and continue without loading the existing personalized link
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);
} else {
personalizedLink.value = savedPersonalizedLink;
return;
}
const savedPersonalizedLink = sessionStorage.getItem(
"roomPersonalizedLink_" + props.id,
);
if (savedPersonalizedLink) {
if (authStore.isAuthenticated) {
// User is authenticated and not allowed to use personalized link, remove it from session storage
// and continue without loading the existing personalized link
sessionStorage.removeItem("roomPersonalizedLink_" + props.id);
} else {
personalizedLink.value = savedPersonalizedLink;
}
const savedAccessCode = sessionStorage.getItem(
"roomAccessCode_" + props.id,
);
if (savedAccessCode) {
accessCodeInput.value = savedAccessCode;
}
return;
}
if (!authStore.isAuthenticated) {
await loadSavedGuestName();
const savedAccessCode = sessionStorage.getItem("roomAccessCode_" + props.id);
if (savedAccessCode) {
accessCodeInput.value = savedAccessCode;
}
}
  • Move loadSavedGuestName to the top, always load the name from storage
  • Return after each step, removed complex nested code flows

@samuelwei samuelwei added this to the v4.x milestone Jul 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

UI User Interface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

UX: Flow entering guest name

3 participants