1 import videojs from 'video.js'
2 import { VideoPlaylistElement } from '@shared/models'
3 import { PlaylistPluginOptions } from '../peertube-videojs-typings'
4 import { PlaylistMenuItem } from './playlist-menu-item'
6 const Component = videojs.getComponent('Component')
8 class PlaylistMenu extends Component {
9 private menuItems: PlaylistMenuItem[]
11 constructor (player: videojs.Player, options?: PlaylistPluginOptions) {
12 super(player, options as any)
14 this.player().on('userinactive', () => {
18 this.player().on('click', event => {
19 let current = event.target as HTMLElement
23 current.classList.contains('vjs-playlist-menu') ||
24 current.classList.contains('vjs-playlist-button')
29 current = current.parentElement
39 const options = this.getOptions()
41 const menu = super.createEl('div', {
42 className: 'vjs-playlist-menu',
47 const header = super.createEl('div', {
51 const headerLeft = super.createEl('div')
53 const leftTitle = super.createEl('div', {
54 innerHTML: options.playlist.displayName,
58 const leftSubtitle = super.createEl('div', {
59 innerHTML: this.player().localize('By {1}', [ options.playlist.videoChannel.displayName ]),
63 headerLeft.appendChild(leftTitle)
64 headerLeft.appendChild(leftSubtitle)
66 const tick = super.createEl('div', {
69 tick.addEventListener('click', () => this.close())
71 header.appendChild(headerLeft)
72 header.appendChild(tick)
74 const list = super.createEl('ol')
76 for (const playlistElement of options.elements) {
77 const item = new PlaylistMenuItem(this.player(), {
78 element: playlistElement,
79 onClicked: () => this.onItemClicked(playlistElement)
82 list.appendChild(item.el())
84 this.menuItems.push(item)
87 menu.appendChild(header)
88 menu.appendChild(list)
94 const options = this.getOptions()
96 this.updateSelected(options.getCurrentPosition())
100 this.player().addClass('playlist-menu-displayed')
104 this.player().removeClass('playlist-menu-displayed')
107 updateSelected (newPosition: number) {
108 for (const item of this.menuItems) {
109 item.setSelected(item.getElement().position === newPosition)
113 private getOptions () {
114 return this.options_ as PlaylistPluginOptions
117 private onItemClicked (element: VideoPlaylistElement) {
118 this.getOptions().onItemClicked(element)
122 Component.registerComponent('PlaylistMenu', PlaylistMenu)
124 export { PlaylistMenu }