fix(dash): [PKG-DASH-MENU-01] preserve settings navigation during SDK refresh

This commit is contained in:
Harvey Zhao committed 2026-09-14 20:35:22 +08:00
1 parent 30f646be97
commit 88ce836f85
21 files changed
+769 -23

No files matched your search

@@ -20,7 +20,18 @@ export default function artplayerPluginDashControl<Level extends object = Qualit
const subscriptions: [EventName, Cleanup][] = []
const observer = observeSDK<Level, Track>({
active: dash => !closed && !art.isDestroy && art.dash === dash,
refresh: update,
refresh() {
const dash = art.dash
let version = revision
const current = () => !closed && !art.isDestroy && art.dash === dash && revision === version
const restore = quality.captureNavigation(current) || audio.captureNavigation(current)
if (!current())
return
version++
update()
if (current())
restore?.()
},
reset() {
const version = ++revision
clear(() => version === revision)
@@ -1,4 +1,4 @@
import type { DisplayConfig, Label, MenuHost, MenuModel, SelectorItem, Valid } from './types'
import type { Cleanup, DisplayConfig, Label, MenuHost, MenuModel, SelectorItem, Valid } from './types'
export function createMenu<Item extends SelectorItem>(art: MenuHost, name: string, icon: string) {
let current: object | undefined
@@ -70,5 +70,21 @@ export function createMenu<Item extends SelectorItem>(art: MenuHost, name: strin
}
}
return { update, clear }
function captureNavigation(active: Valid): Cleanup | undefined {
const setting = art.setting
const item = setting.find?.(name)
const callback = owned.get('setting')
if (!active() || !callback || setting.show !== true || item?.onSelect !== callback || !item.selector || setting.active !== item.selector || typeof setting.render !== 'function')
return
return () => {
if (!active() || art.setting !== setting || setting.show !== true || !setting.option || setting.active !== setting.option)
return
const replacement = setting.find?.(name)
const callback = owned.get('setting')
if (active() && callback && replacement?.onSelect === callback && replacement.selector)
setting.render?.(replacement.selector)
}
}
return { update, clear, captureNavigation }
}
@@ -77,7 +77,11 @@ export interface Registry {
remove: (name: string) => unknown
check: (item: SelectorItem) => unknown
cache?: { get?: (name: string) => { option?: { onSelect?: unknown } } | undefined }
find?: (name: string) => { onSelect?: unknown } | undefined
find?: (name: string) => { onSelect?: unknown, selector?: SelectorItem[] } | null | undefined
active?: SelectorItem[] | null
option?: SelectorItem[]
show?: boolean
render?: (option: SelectorItem[]) => unknown
}
export interface MenuHost {