mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-18 02:21:20 -08:00
55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
import type ResourceScope from '../lifecycle/scope'
|
|
import type { ComponentHost } from './types'
|
|
import { getScope } from '../lifecycle/instance'
|
|
|
|
const scopes = new WeakMap<HTMLElement, ResourceScope>()
|
|
|
|
export function ownEntry(art: ComponentHost, element: HTMLElement): ResourceScope {
|
|
const scope = getScope(art).child()
|
|
scopes.set(element, scope)
|
|
return scope
|
|
}
|
|
|
|
export function entryScope(element: HTMLElement): ResourceScope {
|
|
const scope = scopes.get(element)
|
|
if (!scope)
|
|
throw new Error('ArtPlayer component has not been registered')
|
|
return scope
|
|
}
|
|
|
|
export function releaseEntry(element: HTMLElement): void {
|
|
scopes.get(element)?.dispose()
|
|
}
|
|
|
|
export function proxyEntry<Name extends keyof HTMLElementEventMap>(art: ComponentHost, element: HTMLElement, target: EventTarget, name: Name, callback: (event: HTMLElementEventMap[Name]) => unknown): () => void {
|
|
const scope = entryScope(element)
|
|
if (scope.closed)
|
|
return () => {}
|
|
const cleanup = art.events.proxy(target, name, (event) => {
|
|
if (!scope.closed)
|
|
return callback(event as HTMLElementEventMap[Name])
|
|
})
|
|
return scope.add(() => {
|
|
art.events.remove(cleanup)
|
|
})
|
|
}
|
|
|
|
export interface SubscriptionHost<Events extends { [Name in keyof Events]: readonly unknown[] }> {
|
|
on: <Name extends keyof Events>(name: Name, callback: (...args: [...Events[Name]]) => unknown) => unknown
|
|
off: <Name extends keyof Events>(name: Name, callback: (...args: [...Events[Name]]) => unknown) => unknown
|
|
}
|
|
|
|
export function subscribeEntry<Events extends { [Name in keyof Events]: readonly unknown[] }, Name extends keyof Events>(art: SubscriptionHost<Events>, element: HTMLElement, name: Name, callback: (...args: [...Events[Name]]) => unknown): void {
|
|
const scope = entryScope(element)
|
|
if (scope.closed)
|
|
return
|
|
const guarded = (...args: [...Events[Name]]) => {
|
|
if (!scope.closed)
|
|
return callback(...args)
|
|
}
|
|
art.on(name, guarded)
|
|
scope.add(() => {
|
|
art.off(name, guarded)
|
|
})
|
|
}
|