feat: 播放控制移入页眉 + 媒体铺满智能裁切

页眉播放控制(仅媒体轮播页):
- 新增 MediaHeaderControls:播放/暂停、上一段/下一段、序号、当前文件名(点击进后台)、声音解锁
- 新增 mediaControl 共享状态桥:媒体页同步播放状态,页眉订阅渲染并下发指令
- 移除媒体页底部控制区,媒体区保持纯净全屏

媒体展示:
- .ms-media 改为 object-fit: cover,填满整个容器并智能居中裁切(原 contain 留黑边)

修复:
- MediaScreen useEffect 依赖数组引用后声明函数导致的 TDZ 崩溃
- 清理 MediaScreen 中不再使用的 Icon/cleanName/togglePlayPause
This commit is contained in:
Pine
2026-08-17 22:45:46 +08:00
parent 07dbd404a9
commit 29bdad316f
6 changed files with 266 additions and 209 deletions
+37
View File
@@ -0,0 +1,37 @@
/* =========================================================
媒体播放控制桥 —— 页眉控制区与媒体页之间的共享状态
· 媒体页把播放状态同步进来(paused/index/total/name/soundBlocked/loaded
· 页眉控制区订阅状态渲染,并通过 mediaCommand() 下发指令
========================================================= */
let state = {
paused: false,
index: 0,
total: 0,
name: '',
soundBlocked: false,
loaded: false,
};
const listeners = new Set();
export function setMediaUiState(patch) {
state = { ...state, ...patch };
listeners.forEach((fn) => fn(state));
}
export function getMediaUiState() {
return state;
}
/** 订阅状态,返回取消函数 */
export function onMediaUiState(fn) {
listeners.add(fn);
fn(state);
return () => listeners.delete(fn);
}
/** 页眉控制区下发指令(媒体页监听 dpm:media-control 执行) */
export function mediaCommand(action, params) {
window.dispatchEvent(new CustomEvent('dpm:media-control', { detail: { action, params } }));
}