Addresses multiple issues when enabling/disabling PiP dynamically:
1. External API: Replace dead config-overwrite event handler with
interception in executeCommand. This properly manages the intersection
observer and PiP state when pip config changes via overwriteConfig.
2. PiPVideoElement: Fix ref access pattern - access videoRef.current
inside useEffects instead of capturing at render time. The captured
value was null on first render, causing blur/focus listeners to never
be set up when component mounted into a stable conference.
3. useCanvasAvatar: Return streamRef object instead of refs.current.stream
so consumers can access .current inside their effects. The stream is
created in an effect and wasn't available at render time.
4. Add on-mount focus check with loadedmetadata wait to handle PiP enable
while app is in background, ensuring video source is ready before
attempting to enter PiP mode.
Implements Picture-in-Picture functionality for the Electron wrapper to maintain video engagement when users are not actively focused on the conference window. This feature addresses the need to keep users visually connected to the conference even when multitasking.
Key features:
- Automatic PiP mode activation and deactivation based on user interaction
- Displays large video participant's stream or renders their avatar on canvas when video unavailable
- Provides audio/video mute controls via MediaSession API directly in PiP window
- Adds API events (_pip-requested) for Electron wrapper integration
Implementation includes new pip feature module with Redux architecture, canvas-based avatar rendering with custom backgrounds support, and integration with existing mute/unmute logic. Depends on jitsi-meet-electron-sdk#479 for proper user gesture handling in Electron.
* Change toolbar background color from IFrame API #16468 fixed
* fix(toolbar #16468): implement toolbar background color via configOverwrite for web and mobile
* keep toolbarConfig defaults commented in config.js
* add trailing comma to commented toolbarConfig.backgroundColor
* fix: resolve linting errors
* feat(api): add toolbarVisibilityChanged event to IFrame API
* fix lint
* Change toolbar background color from IFrame API #16468 fixed
* fix(toolbar #16468): implement toolbar background color via configOverwrite for web and mobile
* keep toolbarConfig defaults commented in config.js
* add trailing comma to commented toolbarConfig.backgroundColor
* fix: resolve linting errors
Fixes#16468
In order to use gDM in Electron the flow is somewhat reversed. It starts
from the Electron main process, so we need an API in the external_api
that can trigger the builtin picker. The picker is still necessary.
The proposal never passed stage 1 and was last updated 4 years ago,
which signals it won't make it into the language: https://github.com/tc39/proposal-export-default-from
The alternative is just a couple of characters longer.
* feat(shared-video): Shows confirmation dialog before playing video.
* feat(shared-video/native): created ShareVideoConfirmDialog and unified actions
* squash: Simplifies state and fixes stop and then start scenario.
* squash: Use constants everywhere.
* squash: Use helper function.
* squash: Ignore any command with not matching video URL.
---------
Co-authored-by: Calin-Teodor <calin.chitu@8x8.com>
Many of the events are not used at all or used only on one place. For the rest of them the listeners were added 2 times on promoted visitors and not cleaned at all.