mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-12 15:26:16 -08:00
109 lines
2.8 KiB
TypeScript
109 lines
2.8 KiB
TypeScript
import type { SubscriptionHost } from '../component/resources'
|
|
import { appendElement } from '../component/dom'
|
|
import { entryScope, subscribeEntry } from '../component/resources'
|
|
import { isClosing } from '../lifecycle/instance'
|
|
import { addClass, hasClass, removeClass, setStyle } from '../utils'
|
|
import { lockKeyboard } from './lock-keyboard'
|
|
|
|
export interface LockHost extends SubscriptionHost<{ lock: [boolean] }> {
|
|
template: { $player: HTMLElement, $bottom: HTMLElement }
|
|
i18n: { get: (key: string) => string }
|
|
icons: { lock: string | Element, unlock: string | Element }
|
|
isLock: boolean
|
|
emit: (name: 'lock', state: boolean) => unknown
|
|
layers: { add: (option: { name: string, mounted: (element: HTMLDivElement) => void, click: () => void }) => unknown }
|
|
}
|
|
|
|
export default function lock(art: LockHost): { name: string, state: boolean } {
|
|
const {
|
|
layers,
|
|
icons,
|
|
template: { $player },
|
|
} = art
|
|
|
|
function getState() {
|
|
return hasClass($player, 'art-lock')
|
|
}
|
|
|
|
function setLock() {
|
|
if (isClosing(art))
|
|
return
|
|
addClass($player, 'art-lock')
|
|
if (isClosing(art))
|
|
return
|
|
art.isLock = true
|
|
if (!isClosing(art))
|
|
art.emit('lock', true)
|
|
}
|
|
|
|
function setUnlock() {
|
|
if (isClosing(art))
|
|
return
|
|
removeClass($player, 'art-lock')
|
|
if (isClosing(art))
|
|
return
|
|
art.isLock = false
|
|
if (!isClosing(art))
|
|
art.emit('lock', false)
|
|
}
|
|
|
|
layers.add({
|
|
name: 'lock',
|
|
mounted($el) {
|
|
const scope = entryScope($el)
|
|
if (scope.closed || isClosing(art))
|
|
return
|
|
const $lock = appendElement($el, icons.lock)
|
|
if (scope.closed || isClosing(art))
|
|
return
|
|
const $unlock = appendElement($el, icons.unlock)
|
|
if (scope.closed || isClosing(art))
|
|
return
|
|
const updateKeyboard = lockKeyboard(art, $el, scope, getState)
|
|
if (scope.closed || isClosing(art))
|
|
return
|
|
if (getState()) {
|
|
setStyle($lock, 'display', 'inline-flex')
|
|
if (!scope.closed && !isClosing(art))
|
|
setStyle($unlock, 'display', 'none')
|
|
}
|
|
else {
|
|
setStyle($lock, 'display', 'none')
|
|
}
|
|
|
|
subscribeEntry<{ lock: [boolean] }, 'lock'>(art, $el, 'lock', (state) => {
|
|
if (isClosing(art))
|
|
return
|
|
setStyle($lock, 'display', state ? 'inline-flex' : 'none')
|
|
if (!scope.closed && !isClosing(art))
|
|
setStyle($unlock, 'display', state ? 'none' : 'inline-flex')
|
|
if (!scope.closed && !isClosing(art))
|
|
updateKeyboard(state)
|
|
})
|
|
},
|
|
click() {
|
|
if (getState()) {
|
|
setUnlock()
|
|
}
|
|
else {
|
|
setLock()
|
|
}
|
|
},
|
|
})
|
|
|
|
return {
|
|
name: 'lock',
|
|
get state() {
|
|
return getState()
|
|
},
|
|
set state(value: boolean) {
|
|
if (value) {
|
|
setLock()
|
|
}
|
|
else {
|
|
setUnlock()
|
|
}
|
|
},
|
|
}
|
|
}
|