bitmovin-player-ui
Version:
Bitmovin Player UI Framework
73 lines (59 loc) • 2.24 kB
text/typescript
import { ToggleButton, ToggleButtonConfig } from './ToggleButton';
import { UIInstanceManager } from '../../UIManager';
import { PlayerAPI } from 'bitmovin-player';
import { i18n } from '../../localization/i18n';
/**
* A button that toggles Apple macOS picture-in-picture mode.
*
* @category Buttons
*/
export class PictureInPictureToggleButton extends ToggleButton<ToggleButtonConfig> {
constructor(config: ToggleButtonConfig = {}) {
super(config);
this.config = this.mergeConfig(
config,
{
cssClass: 'ui-piptogglebutton',
text: i18n.getLocalizer('pictureInPicture'),
},
this.config,
);
}
configure(player: PlayerAPI, uimanager: UIInstanceManager): void {
super.configure(player, uimanager);
const isPictureInPictureAvailable = () => {
return player.isViewModeAvailable(player.exports.ViewMode.PictureInPicture);
};
const pictureInPictureStateHandler = () => {
player.getViewMode() === player.exports.ViewMode.PictureInPicture ? this.on() : this.off();
};
const pictureInPictureAvailabilityChangedHandler = () => {
isPictureInPictureAvailable() ? this.show() : this.hide();
};
player.on(player.exports.PlayerEvent.ViewModeChanged, pictureInPictureStateHandler);
// Available only in our native SDKs for now
if ((player.exports.PlayerEvent as any).ViewModeAvailabilityChanged) {
player.on(
(player.exports.PlayerEvent as any).ViewModeAvailabilityChanged,
pictureInPictureAvailabilityChangedHandler,
);
}
uimanager.getConfig().events.onUpdated.subscribe(pictureInPictureAvailabilityChangedHandler);
this.onClick.subscribe(() => {
if (!isPictureInPictureAvailable()) {
if (console) {
console.log('PIP unavailable');
}
return;
}
const targetViewMode =
player.getViewMode() === player.exports.ViewMode.PictureInPicture
? player.exports.ViewMode.Inline
: player.exports.ViewMode.PictureInPicture;
player.setViewMode(targetViewMode);
});
// Startup init
pictureInPictureAvailabilityChangedHandler(); // Hide button if PIP not available
pictureInPictureStateHandler();
}
}