import { version } from '../package.json'
import { addClass, errorHandle, isMobile, query, replaceElement, supportsFlex } from './utils'
export default class Template {
constructor(art) {
this.art = art
const { option, constructor } = art
if (option.container instanceof Element) {
this.$container = option.container
}
else {
this.$container = query(option.container)
errorHandle(this.$container, `No container element found by ${option.container}`)
}
errorHandle(supportsFlex(), 'The current browser does not support flex layout')
const type = this.$container.tagName.toLowerCase()
errorHandle(type === 'div', `Unsupported container element type, only support 'div' but got '${type}'`)
errorHandle(
constructor.instances.every(ins => ins.template.$container !== this.$container),
'Cannot mount multiple instances on the same dom element',
)
this.query = this.query.bind(this)
this.$container.dataset.artId = art.id
this.init()
}
static get html() {
return `
Player version:
${version}
[x]
`
}
query(className) {
return query(className, this.$container)
}
init() {
const { option } = this.art
if (!option.useSSR) {
this.$container.innerHTML = Template.html
}
this.$player = this.query('.art-video-player')
this.$video = this.query('.art-video')
this.$track = this.query('track')
this.$poster = this.query('.art-poster')
this.$subtitle = this.query('.art-subtitle')
this.$danmuku = this.query('.art-danmuku')
this.$bottom = this.query('.art-bottom')
this.$progress = this.query('.art-progress')
this.$controls = this.query('.art-controls')
this.$controlsLeft = this.query('.art-controls-left')
this.$controlsCenter = this.query('.art-controls-center')
this.$controlsRight = this.query('.art-controls-right')
this.$layer = this.query('.art-layers')
this.$loading = this.query('.art-loading')
this.$notice = this.query('.art-notice')
this.$noticeInner = this.query('.art-notice-inner')
this.$mask = this.query('.art-mask')
this.$state = this.query('.art-state')
this.$setting = this.query('.art-settings')
this.$info = this.query('.art-info')
this.$infoPanel = this.query('.art-info-panel')
this.$infoClose = this.query('.art-info-close')
this.$contextmenu = this.query('.art-contextmenus')
if (option.proxy) {
const video = option.proxy.call(this.art, this.art)
errorHandle(
video instanceof HTMLVideoElement || video instanceof HTMLCanvasElement,
`Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'`,
)
replaceElement(video, this.$video)
video.className = 'art-video'
this.$video = video
}
if (option.backdrop) {
addClass(this.$player, 'art-backdrop')
}
if (isMobile) {
addClass(this.$player, 'art-mobile')
}
}
destroy(removeHtml) {
this.$video.src = ''
if (removeHtml) {
this.$container.innerHTML = ''
}
else {
addClass(this.$player, 'art-destroy')
}
}
}