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.HH:MM:SS) to the header._WPJ_DEBUG_ is false./wpj/v1/rtm-token for on-demand RTM token generation.joinMeeting to execute RTC connection, RTM initialization, and Media Track creation in parallel (using Promise.all) to optimize the joining process.convertMetadataArrayToObject) and fixed duplicate event listeners in initializeRtm.[uid]_screen) to publish the screen track.SHARE_START, SHARE_STOP) now include the screenUid to allow viewers to map the correct track to the correct user.handleUserPublished now checks for the _screen UID suffix to correctly route screen share streams to the main container, solving all previous race conditions./wpj/v1/rtc-token) to generate RTC tokens on-demand for the new screen sharing client.renderUserList) is now filtered to exclude screen share clients (e.g., uid_screen) from appearing as participants.input type="hidden" fields and URL parameters with a secure, one-time-use WordPress Transient system. All data (Room ID, User Name, Mic/Cam IDs, Auto-Approve) is now passed securely via the server.defined('WPJ_BUDDYBOSS_ADDON_ACTIVE').bp_get_current_group_id()) as the room_id when the [wpj_lobby] shortcode is used within a group tab.WPJ_BUDDYBOSS_ADDON_ACTIVE constant not being defined on the front-end. Moved its definition from the admin_init hook to the plugins_loaded hook in the addon file.shortcode.php fallback loader. plugins_url() calls for wpj-lobby.js and wpj-front-style.css now correctly use ../public/ to find the assets folder.setUserMetadata) system with a new method using RTM Channel Messages (publish) to broadcast user names (uname) and roles. This resolves the -12019 and -10019 errors.getOnlineUsers (with correct 'MESSAGE' type) and existing users re-publish their attributes when a new user joins (REMOTE_JOIN).undefined. The app now correctly parses event.message instead of the non-existent event.message.text.TypeError in jd-wpjointly.php where wpj_t() was called with a string as the second argument instead of the required array.