playable
Version:
Video player based on HTML5Video
345 lines (298 loc) • 7.5 kB
text/typescript
import playerAPI from '../../../core/player-api-decorator';
import View from './bottom-block.view';
import { UIEvent } from '../../../constants';
import { IEventEmitter } from '../../event-emitter/types';
import { IPlayControl } from '../controls/play/types';
import { ITimeControl } from '../controls/time/types';
import { IProgressControl } from '../controls/progress/types';
import { IVolumeControl } from '../controls/volume/types';
import { IFullScreenControl } from '../controls/full-screen/types';
import { ILogoControl } from '../controls/logo/types';
import { IDownloadButton } from '../controls/download/types';
import { IChromecastButton } from '../controls/chromecast/types';
import { IPictureInPictureControl } from '../controls/picture-in-picture/types';
import {
IBottomBlockAPI,
IBottomBlock,
IBottomBlockViewConfig,
IBottomBlockViewElements,
} from './types';
interface IDependencies {
eventEmitter: IEventEmitter;
playControl: IPlayControl;
progressControl: IProgressControl;
timeControl: ITimeControl;
volumeControl: IVolumeControl;
fullScreenControl: IFullScreenControl;
logo: ILogoControl;
downloadButton: IDownloadButton;
chromecastButton: IChromecastButton;
pictureInPictureControl: IPictureInPictureControl;
}
interface IAddControllOptions {
position?: 'left' | 'right';
}
class BottomBlock implements IBottomBlock {
static moduleName = 'bottomBlock';
static View = View;
static dependencies = [
'playControl',
'progressControl',
'timeControl',
'volumeControl',
'fullScreenControl',
'logo',
'downloadButton',
'eventEmitter',
'pictureInPictureControl',
];
private _eventEmitter: IEventEmitter;
private _isBlockFocused: boolean = false;
private _unbindEvents: () => void;
view: View;
isHidden: boolean = false;
constructor(dependencies: IDependencies) {
const { eventEmitter } = dependencies;
this._eventEmitter = eventEmitter;
this._bindViewCallbacks();
this._initUI(this._getControlElements(dependencies));
this._bindEvents();
}
private _getControlElements(
dependencies: IDependencies,
): IBottomBlockViewElements {
const {
playControl,
progressControl,
timeControl,
volumeControl,
fullScreenControl,
logo,
downloadButton,
pictureInPictureControl,
} = dependencies;
return {
play: playControl.getElement(),
progress: progressControl.getElement(),
time: timeControl.getElement(),
volume: volumeControl.getElement(),
fullScreen: fullScreenControl.getElement(),
download: downloadButton.getElement(),
logo: logo.getElement(),
pictureInPicture: pictureInPictureControl.getElement(),
};
}
getElement() {
return this.view.getElement();
}
addControl(key: string, element: HTMLElement, options?: IAddControllOptions) {
const { position = 'right' } = options || {};
this.view.addControl(key, element, position);
}
private _initUI(elements: IBottomBlockViewElements) {
const config: IBottomBlockViewConfig = {
elements,
callbacks: {
onBlockMouseMove: this._setFocusState,
onBlockMouseOut: this._removeFocusState,
},
};
this.view = new BottomBlock.View(config);
this.hideLogo();
this.hideDownloadButton();
}
private _bindEvents() {
this._unbindEvents = this._eventEmitter.bindEvents(
[[UIEvent.FULL_SCREEN_STATE_CHANGED, this._removeFocusState]],
this,
);
}
private _bindViewCallbacks() {
this._setFocusState = this._setFocusState.bind(this);
this._removeFocusState = this._removeFocusState.bind(this);
}
private _setFocusState() {
this._isBlockFocused = true;
}
private _removeFocusState() {
this._isBlockFocused = false;
}
get isFocused() {
return this._isBlockFocused;
}
showContent() {
this.view.showContent();
}
hideContent() {
this.view.hideContent();
}
hide() {
this.isHidden = true;
this.view.hide();
}
show() {
this.isHidden = false;
this.view.show();
}
/**
* Method for allowing logo to be always shown in bottom block
* @param flag - `true` for showing always
* @example
* player.setAlwaysShowLogo(true);
*
*/
setAlwaysShowLogo(flag: boolean) {
this.view.setShouldLogoShowAlwaysFlag(flag);
}
/**
* Method for hiding logo. If you use `setAlwaysShowLogo` or `setControlsShouldAlwaysShow`, logo would automaticaly appear.
* @example
* player.hideLogo();
*/
hideLogo() {
this.view.hideLogo();
}
/**
* Method for showing logo.
* @example
* player.showLogo();
*/
showLogo() {
this.view.showLogo();
}
/**
* Method for showing play control.
* @example
* player.showPlayControl();
*/
showPlayControl() {
this.view.showPlayControl();
}
/**
* Method for showing volume control.
* @example
* player.showVolumeControl();
*/
showVolumeControl() {
this.view.showVolumeControl();
}
/**
* Method for showing time control.
* @example
* player.showTimeControl();
*/
showTimeControl() {
this.view.showTimeControl();
}
/**
* Method for showing full screen control.
* @example
* player.showFullScreenControl();
*/
showFullScreenControl() {
this.view.showFullScreenControl();
}
/**
* Method for showing picture-in-picture control.
* @example
* player.showPictureInPictureControl();
*/
showPictureInPictureControl() {
this.view.showPictureInPictureControl();
}
/**
* Method for showing progress control.
* @example
* player.showProgressControl();
*/
showProgressControl() {
this.view.showProgressControl();
}
/**
* Method for showing download button.
* @example
* player.showDownloadButton();
*/
showDownloadButton() {
this.view.showDownloadButton();
}
/**
* Method for hiding play control.
* @example
* player.hidePlayControl();
*/
hidePlayControl() {
this.view.hidePlayControl();
}
/**
* Method for hiding voluem control.
* @example
* player.hideVolumeControl();
*/
hideVolumeControl() {
this.view.hideVolumeControl();
}
/**
* Method for hiding time control.
* @example
* player.hideTimeControl();
*/
hideTimeControl() {
this.view.hideTimeControl();
}
/**
* Method for hiding full screen control.
* @example
* player.hideFullScreenControl();
*/
hideFullScreenControl() {
this.view.hideFullScreenControl();
}
/**
* Method for hiding picture-in-picture control.
* @example
* player.hidePictureInPictureControl();
*/
hidePictureInPictureControl() {
this.view.hidePictureInPictureControl();
}
/**
* Method for hiding progress control.
* @example
* player.hideProgressControl();
*/
hideProgressControl() {
this.view.hideProgressControl();
}
/**
* Method for hiding download button.
* @example
* player.hideDownloadButton();
*/
hideDownloadButton() {
this.view.hideDownloadButton();
}
destroy() {
this._unbindEvents();
this.view.destroy();
}
}
export { IBottomBlockAPI };
export default BottomBlock;