import { CommonOptions, NextPreviousVideoButtonOptions, PeerTubeLinkButtonOptions, PeertubePlayerManagerOptions, PlayerMode } from '../../types' export class ControlBarOptionsBuilder { private options: CommonOptions constructor ( globalOptions: PeertubePlayerManagerOptions, private mode: PlayerMode ) { this.options = globalOptions.common } getChildrenOptions () { const children = {} if (this.options.previousVideo) { Object.assign(children, this.getPreviousVideo()) } Object.assign(children, { playToggle: {} }) if (this.options.nextVideo) { Object.assign(children, this.getNextVideo()) } Object.assign(children, { currentTimeDisplay: {}, timeDivider: {}, durationDisplay: {}, liveDisplay: {}, flexibleWidthSpacer: {}, ...this.getProgressControl(), p2PInfoButton: { p2pEnabled: this.options.p2pEnabled }, muteToggle: {}, volumeControl: {}, ...this.getSettingsButton() }) if (this.options.peertubeLink === true) { Object.assign(children, { peerTubeLinkButton: { shortUUID: this.options.videoShortUUID } as PeerTubeLinkButtonOptions }) } if (this.options.theaterButton === true) { Object.assign(children, { theaterButton: {} }) } Object.assign(children, { fullscreenToggle: {} }) return children } private getSettingsButton () { const settingEntries: string[] = [] settingEntries.push('playbackRateMenuButton') if (this.options.captions === true) settingEntries.push('captionsButton') settingEntries.push('resolutionMenuButton') return { settingsButton: { setup: { maxHeightOffset: 40 }, entries: settingEntries } } } private getProgressControl () { const loadProgressBar = this.mode === 'webtorrent' ? 'peerTubeLoadProgressBar' : 'loadProgressBar' return { progressControl: { children: { seekBar: { children: { [loadProgressBar]: {}, mouseTimeDisplay: {}, playProgressBar: {} } } } } } } private getPreviousVideo () { const buttonOptions: NextPreviousVideoButtonOptions = { type: 'previous', handler: this.options.previousVideo, isDisabled: () => { if (!this.options.hasPreviousVideo) return false return !this.options.hasPreviousVideo() } } return { previousVideoButton: buttonOptions } } private getNextVideo () { const buttonOptions: NextPreviousVideoButtonOptions = { type: 'next', handler: this.options.nextVideo, isDisabled: () => { if (!this.options.hasNextVideo) return false return !this.options.hasNextVideo() } } return { nextVideoButton: buttonOptions } } }