screenshare_roles shortcode parameter to granularly control who can share their screen[cite: 25].[cite_start]'all' Support: Setting screenshare_roles="all" allows every participant (including guests) to share their screen[cite: 25].[cite_start]Specific Roles: Supports comma-separated role slugs (e.g., screenshare_roles="subscriber,customer")[cite: 25].[cite_start]Presenter Rights: Presenters/Admins always retain screen sharing rights regardless of this setting[cite: 25].screenshare_roles shortcode parameter to granularly control who can share their screen[cite: 25].screenshare_roles="all" allows every participant (including guests) to share their screen[cite: 25].screenshare_roles="subscriber,customer")[cite: 25].wpj_generate_token_callback to receive mic_state and cam_state params and store them securely in the WordPress Transient (mic_enabled, cam_enabled).wpj_generate_token_callback to receive mic_state and cam_state params and store them securely in the WordPress Transient (mic_enabled, cam_enabled).pick_mic_current, pick_cam_current, mute_microphone, disable_camera, etc.) to translations.json.pick_mic_current, pick_cam_current, mute_microphone, disable_camera, etc.) to translations.json.share_roles to screenshare_roles for better clarity and standard naming convention[cite: 27].share_roles to screenshare_roles for better clarity and standard naming convention[cite: 27].wpj_generate_token_callback to calculate can_share status server-side based on the context key and store it in the session[cite: 27].wpj_generate_token_callback to calculate can_share status server-side based on the context key and store it in the session[cite: 27].wpj-lobby.js):Refactored populateDeviceDropdowns to update data-wpj-tooltip attributes instead of button text.Added updateControlTooltip() helper for real-time state feedback.Updated proceedToJoin to capture and send current device states to the server.populateDeviceDropdowns to update data-wpj-tooltip attributes instead of button text.updateControlTooltip() helper for real-time state feedback.proceedToJoin to capture and send current device states to the server.wpj-meetingroom.js):Updated createVideoTask and createAudioTask to respect micEnabled and camEnabled flags from session data.UX Fix: Ensured the "Enable Camera" button remains enabled (.prop('disabled', false)) even if the user enters the room with the camera turned off, allowing them to enable it later.createVideoTask and createAudioTask to respect micEnabled and camEnabled flags from session data..prop('disabled', false)) even if the user enters the room with the camera turned off, allowing them to enable it later.room_title: Sets the welcome title displayed in the lobby (Default: "Meeting Room").display_name: Controls the user naming strategy. Options: Firstname, Lastname, Displayname, Anonym.room_id: Manually overrides the channel name (e.g., for creating a permanent VIP room).presenter_roles: Allows overriding global presenter permissions for a specific room (e.g., presenter_roles="editor,shop_manager").auto_approve: Controls waiting room logic (on/off).room_title: Sets the welcome title displayed in the lobby (Default: "Meeting Room").display_name: Controls the user naming strategy. Options: Firstname, Lastname, Displayname, Anonym.room_id: Manually overrides the channel name (e.g., for creating a permanent VIP room).presenter_roles: Allows overriding global presenter permissions for a specific room (e.g., presenter_roles="editor,shop_manager").auto_approve: Controls waiting room logic (on/off).user_role parameter was missing in the shared asset loader (wpj_load_lobby_assets), causing Admins/Presenters to be treated as guests (forcing them to "Knock") when joining from BuddyBoss tabs or non-standard pages.Resolution: The system now calculates the role server-side using the wpj_get_user_role_status helper and explicitly passes it to the JavaScript settings object in all scenarios.user_role parameter was missing in the shared asset loader (wpj_load_lobby_assets), causing Admins/Presenters to be treated as guests (forcing them to "Knock") when joining from BuddyBoss tabs or non-standard pages.wpj_get_user_role_status helper and explicitly passes it to the JavaScript settings object in all scenarios.presenter_roles).Resolution: The wpj_meetingroom_shortcode function now prioritizes the role stored in the secure Transient (session) over the global settings, ensuring HTML elements match the actual user permissions.presenter_roles).wpj_meetingroom_shortcode function now prioritizes the role stored in the secure Transient (session) over the global settings, ensuring HTML elements match the actual user permissions.wpj_load_lobby_assets() to ensure consistent behavior between standard WP pages and shortcode fallbacks.wpj_load_lobby_assets() to ensure consistent behavior between standard WP pages and shortcode fallbacks.localStorage.Lobby Persistence: Automatically restores the user's previously selected Microphone, Camera, and Speaker upon entering the lobby.Meeting Persistence: Saves any device changes made via the Device Dock during a meeting.Refresh Restoration: When refreshing the meeting room page, the system validates and restores the last active device configuration instead of resetting to defaults.Smart Validation: Added checks to ensure saved device IDs still exist physically (e.g., if a USB mic was unplugged) before attempting to restore them, falling back gracefully if missing.localStorage.wpj-lobby.js):Removed redundant global variable declarations for dropdown elements.Consolidated device population logic into a single, cleaner function with local scoping to prevent variable collisions.undefined remote stats, ensuring the UI degrades gracefully if a user is not sending streams.undefined remote stats, ensuring the UI degrades gracefully if a user is not sending streams.#player-wrapper-{safeId}) instead of attribute selectors ([data-uid]) for reliable DOM targeting across all user types.stats.remoteUsers (which is empty for idle users) to rtcClient.remoteUsers (client list source of truth).Fallback: Implemented default "Good" status for users with no active stream stats to prevent UI confusion.stats.remoteUsers (which is empty for idle users) to rtcClient.remoteUsers (client list source of truth).translations.json and wpj_t().translations.json and wpj_t().50% height on sub-grids in stretched mode. Grids now naturally stack based on content height.50% height on sub-grids in stretched mode. Grids now naturally stack based on content height.USER_ATTRIBUTES_UPDATE).Benefit: Users without cameras (Audio-Only) or those with delayed video tracks now appear instantly as avatars.USER_ATTRIBUTES_UPDATE).attributeSyncInterval (10s) to periodically broadcast user presence.Benefit: Fixes issues where users in background tabs (minimized browsers) would "disappear" or fail to sync status.attributeSyncInterval (10s) to periodically broadcast user presence.role or joinTime changes, eliminating UI flicker during Heartbeat updates.role or joinTime changes, eliminating UI flicker during Heartbeat updates.<div class="clipper">) for screen sharing.Benefit: Solves the persistent "Overflow Hidden" bug on Chrome/Edge where the video player ignored border-radius.<div class="clipper">) for screen sharing.leaveMeeting() with a shouldRedirect parameter.Browser refresh (beforeunload) now gracefully cleans up resources without kicking the user back to the lobby.leaveMeeting() with a shouldRedirect parameter.beforeunload) now gracefully cleans up resources without kicking the user back to the lobby.auto_approve is disabled.Lobby: Users send "Knock" requests via RTM and wait for a host response. Implemented a "Heartbeat" mechanism (every 3s) to ensure new presenters see pending requests immediately.Presenter UI: Presenters receive "Join Requests" as Toast notifications with Approve/Reject buttons.Co-Host Sync: Approval/Rejection actions are synchronized; if one presenter handles a request, the toast automatically clears for all other presenters.auto_approve is disabled.presenter role (e.g., Administrator) now bypass the waiting room and join directly, regardless of settings.-webkit-scrollbar) to minimize visual clutter in the split view.-webkit-scrollbar) to minimize visual clutter in the split view.< 767px) to ensure a seamless touch experience without nested scroll traps.< 767px) to ensure a seamless touch experience without nested scroll traps.-webkit-scrollbar) for a cleaner UI.-webkit-scrollbar) for a cleaner UI..wpj_call-grid to 100% width on mobile to prevent flexbox shrinking issues..wpj_call-grid to 100% width on mobile to prevent flexbox shrinking issues.guest_xxx) appeared in the meeting room User List before being approved.#wpj_sidebar--messages).Functionality: Allows participants to send and receive messages instantly via Agora RTM.Smart Notifications: Automatically injects a notification badge (red dot with count) into the Message toolbar button when the sidebar is hidden or when viewing the People tab.#wpj_sidebar--messages).startMeetingTimer() and initial Grid Sorting immediately after local DOM creation.Benefit: Eliminates the ~3-second perceived delay ("frozen state") while waiting for RTC/RTM connection and hardware acquisition. The room UI now feels instant and responsive.startMeetingTimer() and initial Grid Sorting immediately after local DOM creation.CMD_WHO_ARE_YOU.Logic: Upon joining (or re-joining), the client now broadcasts a discovery request. All existing participants immediately reply with their user attributes (uname, role).Benefit: Guarantees that the User List and Video Grid display correct names instantly instead of UIDs, even if the standard REMOTE_JOIN event is delayed or missed.CMD_WHO_ARE_YOU.uname, role).REMOTE_JOIN event is delayed or missed.joinMeeting flow for maximum responsiveness (Instant Mirror, Non-blocking RTM).setTimeout with requestAnimationFrame in grid sorting logic.e.stopPropagation() prevented Admin buttons (Mute/Kick) from being clickable. Implemented smart event delegation to allow button clicks while keeping the sidebar open.