xxf_react 0.8.4 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/dist/cache/CacheEntry.d.ts +0 -28
- package/dist/cache/CacheEntry.d.ts.map +0 -1
- package/dist/cache/CacheEntry.js +0 -1
- package/dist/cache/DiskCacheConfig.d.ts +0 -56
- package/dist/cache/DiskCacheConfig.d.ts.map +0 -1
- package/dist/cache/DiskCacheConfig.js +0 -4
- package/dist/cache/DiskLruCache.d.ts +0 -69
- package/dist/cache/DiskLruCache.d.ts.map +0 -1
- package/dist/cache/DiskLruCache.js +0 -305
- package/dist/cache/LruMetadata.d.ts +0 -28
- package/dist/cache/LruMetadata.d.ts.map +0 -1
- package/dist/cache/LruMetadata.js +0 -6
- package/dist/cache/index.d.ts +0 -5
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -2
- package/dist/event-bus/EventBus.d.ts +0 -176
- package/dist/event-bus/EventBus.d.ts.map +0 -1
- package/dist/event-bus/EventBus.js +0 -278
- package/dist/event-bus/EventDemo.d.ts +0 -71
- package/dist/event-bus/EventDemo.d.ts.map +0 -1
- package/dist/event-bus/EventDemo.js +0 -76
- package/dist/event-bus/EventHooks.d.ts +0 -48
- package/dist/event-bus/EventHooks.d.ts.map +0 -1
- package/dist/event-bus/EventHooks.js +0 -73
- package/dist/event-bus/index.d.ts +0 -3
- package/dist/event-bus/index.d.ts.map +0 -1
- package/dist/event-bus/index.js +0 -2
- package/dist/fetch/Fetch.d.ts +0 -9
- package/dist/fetch/Fetch.d.ts.map +0 -1
- package/dist/fetch/Fetch.js +0 -54
- package/dist/fetch/TimeoutError.d.ts +0 -7
- package/dist/fetch/TimeoutError.d.ts.map +0 -1
- package/dist/fetch/TimeoutError.js +0 -23
- package/dist/fetch/index.d.ts +0 -3
- package/dist/fetch/index.d.ts.map +0 -1
- package/dist/fetch/index.js +0 -2
- package/dist/flow/PromiseExt.d.ts +0 -8
- package/dist/flow/PromiseExt.d.ts.map +0 -1
- package/dist/flow/PromiseExt.js +0 -50
- package/dist/flow/PromiseLifecycle.d.ts +0 -33
- package/dist/flow/PromiseLifecycle.d.ts.map +0 -1
- package/dist/flow/PromiseLifecycle.js +0 -37
- package/dist/flow/PromiseLoading.d.ts +0 -25
- package/dist/flow/PromiseLoading.d.ts.map +0 -1
- package/dist/flow/PromiseLoading.js +0 -30
- package/dist/flow/index.d.ts +0 -4
- package/dist/flow/index.d.ts.map +0 -1
- package/dist/flow/index.js +0 -3
- package/dist/foundation/Copy.d.ts +0 -8
- package/dist/foundation/Copy.d.ts.map +0 -1
- package/dist/foundation/Copy.js +0 -21
- package/dist/foundation/Debug.d.ts +0 -7
- package/dist/foundation/Debug.d.ts.map +0 -1
- package/dist/foundation/Debug.js +0 -12
- package/dist/foundation/LayoutSize.d.ts +0 -5
- package/dist/foundation/LayoutSize.d.ts.map +0 -1
- package/dist/foundation/LayoutSize.js +0 -1
- package/dist/foundation/PerformanceMonitor.d.ts +0 -13
- package/dist/foundation/PerformanceMonitor.d.ts.map +0 -1
- package/dist/foundation/PerformanceMonitor.js +0 -26
- package/dist/foundation/index.d.ts +0 -5
- package/dist/foundation/index.d.ts.map +0 -1
- package/dist/foundation/index.js +0 -4
- package/dist/http/api/ApiBuilder.d.ts +0 -251
- package/dist/http/api/ApiBuilder.d.ts.map +0 -1
- package/dist/http/api/ApiBuilder.js +0 -189
- package/dist/http/api/index.d.ts +0 -2
- package/dist/http/api/index.d.ts.map +0 -1
- package/dist/http/api/index.js +0 -1
- package/dist/http/cache/HttpCache.d.ts +0 -59
- package/dist/http/cache/HttpCache.d.ts.map +0 -1
- package/dist/http/cache/HttpCache.js +0 -215
- package/dist/http/cache/index.d.ts +0 -3
- package/dist/http/cache/index.d.ts.map +0 -1
- package/dist/http/cache/index.js +0 -2
- package/dist/http/client/ApiStream.d.ts +0 -80
- package/dist/http/client/ApiStream.d.ts.map +0 -1
- package/dist/http/client/ApiStream.js +0 -190
- package/dist/http/client/HttpClient.d.ts +0 -88
- package/dist/http/client/HttpClient.d.ts.map +0 -1
- package/dist/http/client/HttpClient.js +0 -381
- package/dist/http/client/index.d.ts +0 -3
- package/dist/http/client/index.d.ts.map +0 -1
- package/dist/http/client/index.js +0 -2
- package/dist/http/demo/api-builder.demo.d.ts +0 -102
- package/dist/http/demo/api-builder.demo.d.ts.map +0 -1
- package/dist/http/demo/api-builder.demo.js +0 -343
- package/dist/http/index.d.ts +0 -52
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -61
- package/dist/http/interceptor/CacheInterceptor.d.ts +0 -112
- package/dist/http/interceptor/CacheInterceptor.d.ts.map +0 -1
- package/dist/http/interceptor/CacheInterceptor.js +0 -6
- package/dist/http/interceptor/DefaultCacheInterceptor.d.ts +0 -53
- package/dist/http/interceptor/DefaultCacheInterceptor.d.ts.map +0 -1
- package/dist/http/interceptor/DefaultCacheInterceptor.js +0 -106
- package/dist/http/interceptor/index.d.ts +0 -3
- package/dist/http/interceptor/index.d.ts.map +0 -1
- package/dist/http/interceptor/index.js +0 -2
- package/dist/http/models/ApiTypes.d.ts +0 -54
- package/dist/http/models/ApiTypes.d.ts.map +0 -1
- package/dist/http/models/ApiTypes.js +0 -4
- package/dist/http/models/CacheConfig.d.ts +0 -58
- package/dist/http/models/CacheConfig.d.ts.map +0 -1
- package/dist/http/models/CacheConfig.js +0 -4
- package/dist/http/models/CacheMode.d.ts +0 -45
- package/dist/http/models/CacheMode.d.ts.map +0 -1
- package/dist/http/models/CacheMode.js +0 -45
- package/dist/http/models/HttpClientConfig.d.ts +0 -90
- package/dist/http/models/HttpClientConfig.d.ts.map +0 -1
- package/dist/http/models/HttpClientConfig.js +0 -4
- package/dist/http/models/RequestConfig.d.ts +0 -67
- package/dist/http/models/RequestConfig.d.ts.map +0 -1
- package/dist/http/models/RequestConfig.js +0 -4
- package/dist/http/models/index.d.ts +0 -24
- package/dist/http/models/index.d.ts.map +0 -1
- package/dist/http/models/index.js +0 -16
- package/dist/http/types.d.ts +0 -13
- package/dist/http/types.d.ts.map +0 -1
- package/dist/http/types.js +0 -14
- package/dist/index.d.ts +0 -15
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -20
- package/dist/layout/button/XButton.d.ts +0 -99
- package/dist/layout/button/XButton.d.ts.map +0 -1
- package/dist/layout/button/XButton.js +0 -131
- package/dist/layout/hover/XHover.d.ts +0 -147
- package/dist/layout/hover/XHover.d.ts.map +0 -1
- package/dist/layout/hover/XHover.js +0 -128
- package/dist/layout/image/XImage.d.ts +0 -35
- package/dist/layout/image/XImage.d.ts.map +0 -1
- package/dist/layout/image/XImage.effects.d.ts +0 -16
- package/dist/layout/image/XImage.effects.d.ts.map +0 -1
- package/dist/layout/image/XImage.effects.js +0 -77
- package/dist/layout/image/XImage.js +0 -261
- package/dist/layout/image/XImage.types.d.ts +0 -130
- package/dist/layout/image/XImage.types.d.ts.map +0 -1
- package/dist/layout/image/XImage.types.js +0 -2
- package/dist/layout/image/XImageGallery.d.ts +0 -76
- package/dist/layout/image/XImageGallery.d.ts.map +0 -1
- package/dist/layout/image/XImageGallery.js +0 -94
- package/dist/layout/image/index.d.ts +0 -12
- package/dist/layout/image/index.d.ts.map +0 -1
- package/dist/layout/image/index.js +0 -4
- package/dist/layout/index.d.ts +0 -12
- package/dist/layout/index.d.ts.map +0 -1
- package/dist/layout/index.js +0 -11
- package/dist/layout/resize/core/ResizeObserverHook.d.ts +0 -41
- package/dist/layout/resize/core/ResizeObserverHook.d.ts.map +0 -1
- package/dist/layout/resize/core/ResizeObserverHook.js +0 -57
- package/dist/layout/resize/core/SizedLayoutContext.d.ts +0 -23
- package/dist/layout/resize/core/SizedLayoutContext.d.ts.map +0 -1
- package/dist/layout/resize/core/SizedLayoutContext.js +0 -23
- package/dist/layout/resize/core/SizedLayoutProps.d.ts +0 -19
- package/dist/layout/resize/core/SizedLayoutProps.d.ts.map +0 -1
- package/dist/layout/resize/core/SizedLayoutProps.js +0 -1
- package/dist/layout/resize/impl/SizedContainer.d.ts +0 -45
- package/dist/layout/resize/impl/SizedContainer.d.ts.map +0 -1
- package/dist/layout/resize/impl/SizedContainer.js +0 -65
- package/dist/layout/resize/impl/SizedLayout.d.ts +0 -45
- package/dist/layout/resize/impl/SizedLayout.d.ts.map +0 -1
- package/dist/layout/resize/impl/SizedLayout.js +0 -65
- package/dist/layout/spinner/XSpinner.d.ts +0 -43
- package/dist/layout/spinner/XSpinner.d.ts.map +0 -1
- package/dist/layout/spinner/XSpinner.js +0 -47
- package/dist/layout/virtualized/VirtualizedConfig.d.ts +0 -16
- package/dist/layout/virtualized/VirtualizedConfig.d.ts.map +0 -1
- package/dist/layout/virtualized/VirtualizedConfig.js +0 -15
- package/dist/layout/visibility/ElementVisibilityHooks.d.ts +0 -13
- package/dist/layout/visibility/ElementVisibilityHooks.d.ts.map +0 -1
- package/dist/layout/visibility/ElementVisibilityHooks.js +0 -119
- package/dist/media/components/XVideo.d.ts +0 -205
- package/dist/media/components/XVideo.d.ts.map +0 -1
- package/dist/media/components/XVideo.js +0 -297
- package/dist/media/components/XVideoBufferingIndicator.d.ts +0 -13
- package/dist/media/components/XVideoBufferingIndicator.d.ts.map +0 -1
- package/dist/media/components/XVideoBufferingIndicator.js +0 -13
- package/dist/media/components/XVideoErrorIndicator.d.ts +0 -15
- package/dist/media/components/XVideoErrorIndicator.d.ts.map +0 -1
- package/dist/media/components/XVideoErrorIndicator.js +0 -19
- package/dist/media/index.d.ts +0 -7
- package/dist/media/index.d.ts.map +0 -1
- package/dist/media/index.js +0 -7
- package/dist/media/playback-queue-store.d.ts +0 -746
- package/dist/media/playback-queue-store.d.ts.map +0 -1
- package/dist/media/playback-queue-store.js +0 -670
- package/dist/media/video-play-safe.d.ts +0 -26
- package/dist/media/video-play-safe.d.ts.map +0 -1
- package/dist/media/video-play-safe.js +0 -56
- package/dist/media/video-state.d.ts +0 -38
- package/dist/media/video-state.d.ts.map +0 -1
- package/dist/media/video-state.js +0 -125
- package/dist/models/ApiPageDataFieldDTO.d.ts +0 -9
- package/dist/models/ApiPageDataFieldDTO.d.ts.map +0 -1
- package/dist/models/ApiPageDataFieldDTO.js +0 -1
- package/dist/models/ApiResponse.d.ts +0 -29
- package/dist/models/ApiResponse.d.ts.map +0 -1
- package/dist/models/ApiResponse.js +0 -32
- package/dist/models/PaginationDTO.d.ts +0 -8
- package/dist/models/PaginationDTO.d.ts.map +0 -1
- package/dist/models/PaginationDTO.js +0 -6
- package/dist/models/index.d.ts +0 -4
- package/dist/models/index.d.ts.map +0 -1
- package/dist/models/index.js +0 -3
- package/dist/refresh/LoadMoreAsync.d.ts +0 -36
- package/dist/refresh/LoadMoreAsync.d.ts.map +0 -1
- package/dist/refresh/LoadMoreAsync.js +0 -55
- package/dist/refresh/index.d.ts +0 -2
- package/dist/refresh/index.d.ts.map +0 -1
- package/dist/refresh/index.js +0 -2
- package/dist/responsive/BrowserAdapter.d.ts +0 -26
- package/dist/responsive/BrowserAdapter.d.ts.map +0 -1
- package/dist/responsive/BrowserAdapter.js +0 -79
- package/dist/responsive/ScreenAdapter.d.ts +0 -2
- package/dist/responsive/ScreenAdapter.d.ts.map +0 -1
- package/dist/responsive/ScreenAdapter.js +0 -5
- package/dist/responsive/index.d.ts +0 -3
- package/dist/responsive/index.d.ts.map +0 -1
- package/dist/responsive/index.js +0 -3
- package/dist/sse/SSEManager.d.ts +0 -21
- package/dist/sse/SSEManager.d.ts.map +0 -1
- package/dist/sse/SSEManager.js +0 -73
- package/dist/sse/SSERegistry.d.ts +0 -20
- package/dist/sse/SSERegistry.d.ts.map +0 -1
- package/dist/sse/SSERegistry.js +0 -36
- package/dist/sse/SSEStatus.d.ts +0 -7
- package/dist/sse/SSEStatus.d.ts.map +0 -1
- package/dist/sse/SSEStatus.js +0 -7
- package/dist/sse/UseSSE.d.ts +0 -13
- package/dist/sse/UseSSE.d.ts.map +0 -1
- package/dist/sse/UseSSE.js +0 -39
- package/dist/sse/index.d.ts +0 -5
- package/dist/sse/index.d.ts.map +0 -1
- package/dist/sse/index.js +0 -5
- package/dist/utils/MIME.d.ts +0 -137
- package/dist/utils/MIME.d.ts.map +0 -1
- package/dist/utils/MIME.js +0 -192
- package/dist/utils/Reload.d.ts +0 -62
- package/dist/utils/Reload.d.ts.map +0 -1
- package/dist/utils/Reload.js +0 -66
- package/dist/utils/ScrollToCenter.d.ts +0 -72
- package/dist/utils/ScrollToCenter.d.ts.map +0 -1
- package/dist/utils/ScrollToCenter.js +0 -145
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -5
- package/dist/utils/url-placholder.d.ts +0 -14
- package/dist/utils/url-placholder.d.ts.map +0 -1
- package/dist/utils/url-placholder.js +0 -17
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"playback-queue-store.d.ts","sourceRoot":"","sources":["../../src/media/playback-queue-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,670 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview 播放队列状态管理 (Zustand)
|
|
3
|
-
*
|
|
4
|
-
* 支持多 Tab / 多页面场景,全局只有一个视频在播放。
|
|
5
|
-
*
|
|
6
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
7
|
-
*
|
|
8
|
-
* @module playback-queue-store
|
|
9
|
-
* @see {@link ./playback-queue-store.md} 详细文档
|
|
10
|
-
*/
|
|
11
|
-
import { create } from 'zustand';
|
|
12
|
-
import { subscribeWithSelector } from 'zustand/middleware';
|
|
13
|
-
import { useShallow } from 'zustand/react/shallow';
|
|
14
|
-
// ============================================================================
|
|
15
|
-
// Initial State - 初始状态
|
|
16
|
-
// ============================================================================
|
|
17
|
-
/**
|
|
18
|
-
* 初始状态
|
|
19
|
-
*
|
|
20
|
-
* @internal
|
|
21
|
-
*/
|
|
22
|
-
const initialState = {
|
|
23
|
-
sources: {},
|
|
24
|
-
itemIdToSource: {},
|
|
25
|
-
activeSource: null,
|
|
26
|
-
currentId: null,
|
|
27
|
-
muted: true, // 默认静音,符合浏览器自动播放策略
|
|
28
|
-
loop: true, // 默认循环播放
|
|
29
|
-
};
|
|
30
|
-
// ============================================================================
|
|
31
|
-
// Helper Functions - 辅助函数
|
|
32
|
-
// ============================================================================
|
|
33
|
-
/**
|
|
34
|
-
* 更新单个 source 的反向索引
|
|
35
|
-
*
|
|
36
|
-
* @param currentIndex - 当前的反向索引
|
|
37
|
-
* @param sourceName - source 名称
|
|
38
|
-
* @param oldIds - 旧的 ID 列表
|
|
39
|
-
* @param newIds - 新的 ID 列表
|
|
40
|
-
* @returns 更新后的反向索引
|
|
41
|
-
*
|
|
42
|
-
* @internal
|
|
43
|
-
*/
|
|
44
|
-
function updateReverseIndexForSource(currentIndex, sourceName, oldIds, newIds) {
|
|
45
|
-
const index = { ...currentIndex };
|
|
46
|
-
// 移除旧的映射
|
|
47
|
-
for (const id of oldIds) {
|
|
48
|
-
if (index[id] === sourceName) {
|
|
49
|
-
delete index[id];
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// 添加新的映射
|
|
53
|
-
for (const id of newIds) {
|
|
54
|
-
index[id] = sourceName;
|
|
55
|
-
}
|
|
56
|
-
return index;
|
|
57
|
-
}
|
|
58
|
-
// ============================================================================
|
|
59
|
-
// Store - Zustand Store 定义
|
|
60
|
-
// ============================================================================
|
|
61
|
-
/**
|
|
62
|
-
* 播放队列 Zustand Store
|
|
63
|
-
*
|
|
64
|
-
* 使用 `subscribeWithSelector` 中间件支持选择性订阅。
|
|
65
|
-
*
|
|
66
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* ```tsx
|
|
70
|
-
* // 直接使用 store(不推荐,建议使用封装的 hooks)
|
|
71
|
-
* const currentId = usePlaybackQueueStore(state => state.currentId)
|
|
72
|
-
* ```
|
|
73
|
-
*/
|
|
74
|
-
export const usePlaybackQueueStore = create()(subscribeWithSelector((set, get) => ({
|
|
75
|
-
...initialState,
|
|
76
|
-
setSource: (source, ids, autoPlay = false) => {
|
|
77
|
-
if (!source) {
|
|
78
|
-
if (process.env.NODE_ENV === 'development') {
|
|
79
|
-
console.warn('[PlaybackQueue] source name is required');
|
|
80
|
-
}
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
const uniqueIds = [...new Set(ids || [])];
|
|
84
|
-
set(state => {
|
|
85
|
-
var _a;
|
|
86
|
-
const oldIds = ((_a = state.sources[source]) === null || _a === void 0 ? void 0 : _a.itemIds) || [];
|
|
87
|
-
const newSources = {
|
|
88
|
-
...state.sources,
|
|
89
|
-
[source]: { itemIds: uniqueIds },
|
|
90
|
-
};
|
|
91
|
-
const newIndex = updateReverseIndexForSource(state.itemIdToSource, source, oldIds, uniqueIds);
|
|
92
|
-
// 检查当前播放的项目是否还在列表中
|
|
93
|
-
let newCurrentId = state.currentId;
|
|
94
|
-
let newActiveSource = state.activeSource;
|
|
95
|
-
if (state.activeSource === source && state.currentId) {
|
|
96
|
-
if (!uniqueIds.includes(state.currentId)) {
|
|
97
|
-
// 当前播放的项目不在新列表中
|
|
98
|
-
newCurrentId = autoPlay && uniqueIds.length > 0 ? uniqueIds[0] : null;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// 如果要自动播放且当前没有在播放
|
|
102
|
-
if (autoPlay && uniqueIds.length > 0 && !state.currentId) {
|
|
103
|
-
newActiveSource = source;
|
|
104
|
-
newCurrentId = uniqueIds[0];
|
|
105
|
-
}
|
|
106
|
-
return {
|
|
107
|
-
sources: newSources,
|
|
108
|
-
itemIdToSource: newIndex,
|
|
109
|
-
activeSource: newActiveSource,
|
|
110
|
-
currentId: newCurrentId,
|
|
111
|
-
};
|
|
112
|
-
});
|
|
113
|
-
},
|
|
114
|
-
appendToSource: (source, ids) => {
|
|
115
|
-
if (!source || !ids || ids.length === 0)
|
|
116
|
-
return;
|
|
117
|
-
set(state => {
|
|
118
|
-
const sourceData = state.sources[source];
|
|
119
|
-
const existingIds = (sourceData === null || sourceData === void 0 ? void 0 : sourceData.itemIds) || [];
|
|
120
|
-
const existingSet = new Set(existingIds);
|
|
121
|
-
const newIds = ids.filter(id => !existingSet.has(id));
|
|
122
|
-
if (newIds.length === 0)
|
|
123
|
-
return state;
|
|
124
|
-
const allIds = [...existingIds, ...newIds];
|
|
125
|
-
const newIndex = { ...state.itemIdToSource };
|
|
126
|
-
for (const id of newIds) {
|
|
127
|
-
newIndex[id] = source;
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
sources: {
|
|
131
|
-
...state.sources,
|
|
132
|
-
[source]: { itemIds: allIds },
|
|
133
|
-
},
|
|
134
|
-
itemIdToSource: newIndex,
|
|
135
|
-
};
|
|
136
|
-
});
|
|
137
|
-
},
|
|
138
|
-
removeSource: (source) => {
|
|
139
|
-
set(state => {
|
|
140
|
-
const sourceData = state.sources[source];
|
|
141
|
-
if (!sourceData)
|
|
142
|
-
return state;
|
|
143
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
144
|
-
const { [source]: _removed, ...restSources } = state.sources;
|
|
145
|
-
// 清理反向索引
|
|
146
|
-
const newIndex = { ...state.itemIdToSource };
|
|
147
|
-
for (const id of sourceData.itemIds) {
|
|
148
|
-
if (newIndex[id] === source) {
|
|
149
|
-
delete newIndex[id];
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// 如果移除的是当前激活的 source,停止播放
|
|
153
|
-
if (state.activeSource === source) {
|
|
154
|
-
return {
|
|
155
|
-
sources: restSources,
|
|
156
|
-
itemIdToSource: newIndex,
|
|
157
|
-
activeSource: null,
|
|
158
|
-
currentId: null,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
sources: restSources,
|
|
163
|
-
itemIdToSource: newIndex,
|
|
164
|
-
};
|
|
165
|
-
});
|
|
166
|
-
},
|
|
167
|
-
play: (source, id) => {
|
|
168
|
-
const { sources } = get();
|
|
169
|
-
const sourceData = sources[source];
|
|
170
|
-
if (!sourceData) {
|
|
171
|
-
if (process.env.NODE_ENV === 'development') {
|
|
172
|
-
console.warn(`[PlaybackQueue] Source "${source}" not found`);
|
|
173
|
-
}
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
if (!sourceData.itemIds.includes(id)) {
|
|
177
|
-
if (process.env.NODE_ENV === 'development') {
|
|
178
|
-
console.warn(`[PlaybackQueue] Item "${id}" not found in source "${source}"`);
|
|
179
|
-
}
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
set({
|
|
183
|
-
activeSource: source,
|
|
184
|
-
currentId: id,
|
|
185
|
-
});
|
|
186
|
-
},
|
|
187
|
-
playById: (id) => {
|
|
188
|
-
var _a;
|
|
189
|
-
const { sources, activeSource, itemIdToSource } = get();
|
|
190
|
-
// 优先检查当前 activeSource
|
|
191
|
-
if (activeSource && ((_a = sources[activeSource]) === null || _a === void 0 ? void 0 : _a.itemIds.includes(id))) {
|
|
192
|
-
set({ currentId: id });
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
// 使用反向索引快速查找
|
|
196
|
-
const source = itemIdToSource[id];
|
|
197
|
-
if (!source) {
|
|
198
|
-
if (process.env.NODE_ENV === 'development') {
|
|
199
|
-
console.warn(`[PlaybackQueue] Item "${id}" not found in any source`);
|
|
200
|
-
}
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
set({
|
|
204
|
-
activeSource: source,
|
|
205
|
-
currentId: id,
|
|
206
|
-
});
|
|
207
|
-
},
|
|
208
|
-
next: () => {
|
|
209
|
-
const { sources, activeSource, currentId, loop } = get();
|
|
210
|
-
if (!activeSource)
|
|
211
|
-
return;
|
|
212
|
-
const sourceData = sources[activeSource];
|
|
213
|
-
if (!sourceData || sourceData.itemIds.length === 0)
|
|
214
|
-
return;
|
|
215
|
-
// 如果没有当前播放项,播放第一个
|
|
216
|
-
if (!currentId) {
|
|
217
|
-
set({ currentId: sourceData.itemIds[0] });
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
const currentIndex = sourceData.itemIds.indexOf(currentId);
|
|
221
|
-
if (currentIndex === -1) {
|
|
222
|
-
set({ currentId: sourceData.itemIds[0] });
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
const nextIndex = currentIndex + 1;
|
|
226
|
-
if (nextIndex >= sourceData.itemIds.length) {
|
|
227
|
-
// 已是最后一个
|
|
228
|
-
set({ currentId: loop ? sourceData.itemIds[0] : null });
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
set({ currentId: sourceData.itemIds[nextIndex] });
|
|
232
|
-
},
|
|
233
|
-
prev: () => {
|
|
234
|
-
const { sources, activeSource, currentId, loop } = get();
|
|
235
|
-
if (!activeSource)
|
|
236
|
-
return;
|
|
237
|
-
const sourceData = sources[activeSource];
|
|
238
|
-
if (!sourceData || sourceData.itemIds.length === 0)
|
|
239
|
-
return;
|
|
240
|
-
if (!currentId) {
|
|
241
|
-
set({ currentId: sourceData.itemIds[sourceData.itemIds.length - 1] });
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
const currentIndex = sourceData.itemIds.indexOf(currentId);
|
|
245
|
-
if (currentIndex === -1) {
|
|
246
|
-
set({ currentId: sourceData.itemIds[0] });
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
const prevIndex = currentIndex - 1;
|
|
250
|
-
if (prevIndex < 0) {
|
|
251
|
-
set({
|
|
252
|
-
currentId: loop ? sourceData.itemIds[sourceData.itemIds.length - 1] : null
|
|
253
|
-
});
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
set({ currentId: sourceData.itemIds[prevIndex] });
|
|
257
|
-
},
|
|
258
|
-
stop: () => {
|
|
259
|
-
set({ currentId: null });
|
|
260
|
-
},
|
|
261
|
-
onEnded: () => {
|
|
262
|
-
get().next();
|
|
263
|
-
},
|
|
264
|
-
setMuted: (muted) => {
|
|
265
|
-
set({ muted });
|
|
266
|
-
},
|
|
267
|
-
toggleMute: () => {
|
|
268
|
-
set(state => ({ muted: !state.muted }));
|
|
269
|
-
},
|
|
270
|
-
setLoop: (loop) => {
|
|
271
|
-
set({ loop });
|
|
272
|
-
},
|
|
273
|
-
reset: () => {
|
|
274
|
-
set(initialState);
|
|
275
|
-
},
|
|
276
|
-
})));
|
|
277
|
-
// ============================================================================
|
|
278
|
-
// Selectors - 选择器(静态引用,避免重复创建)
|
|
279
|
-
// ============================================================================
|
|
280
|
-
/** @internal */
|
|
281
|
-
const selectActions = (state) => ({
|
|
282
|
-
setSource: state.setSource,
|
|
283
|
-
appendToSource: state.appendToSource,
|
|
284
|
-
removeSource: state.removeSource,
|
|
285
|
-
play: state.play,
|
|
286
|
-
playById: state.playById,
|
|
287
|
-
next: state.next,
|
|
288
|
-
prev: state.prev,
|
|
289
|
-
stop: state.stop,
|
|
290
|
-
onEnded: state.onEnded,
|
|
291
|
-
setMuted: state.setMuted,
|
|
292
|
-
toggleMute: state.toggleMute,
|
|
293
|
-
setLoop: state.setLoop,
|
|
294
|
-
reset: state.reset,
|
|
295
|
-
});
|
|
296
|
-
/** @internal */
|
|
297
|
-
const selectMuted = (state) => state.muted;
|
|
298
|
-
/** @internal */
|
|
299
|
-
const selectCurrentId = (state) => state.currentId;
|
|
300
|
-
/** @internal */
|
|
301
|
-
const selectActiveSource = (state) => state.activeSource;
|
|
302
|
-
/** @internal */
|
|
303
|
-
const selectLoop = (state) => state.loop;
|
|
304
|
-
// ============================================================================
|
|
305
|
-
// Hooks - React Hooks(选择性订阅,性能优化)
|
|
306
|
-
// ============================================================================
|
|
307
|
-
/**
|
|
308
|
-
* 获取播放队列操作方法
|
|
309
|
-
*
|
|
310
|
-
* 使用 shallow 比较,避免不必要的重渲染。
|
|
311
|
-
* 返回的方法引用稳定,可以安全地用作依赖项。
|
|
312
|
-
*
|
|
313
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
314
|
-
*
|
|
315
|
-
* @returns 所有操作方法
|
|
316
|
-
*
|
|
317
|
-
* @example
|
|
318
|
-
* ```tsx
|
|
319
|
-
* const { play, stop, next, prev, toggleMute, onEnded } = usePlaybackActions()
|
|
320
|
-
*
|
|
321
|
-
* // 在视频组件中
|
|
322
|
-
* <video
|
|
323
|
-
* onEnded={onEnded}
|
|
324
|
-
* onClick={() => play('home', item.id)}
|
|
325
|
-
* />
|
|
326
|
-
*
|
|
327
|
-
* // 控制按钮
|
|
328
|
-
* <button onClick={prev}>上一个</button>
|
|
329
|
-
* <button onClick={next}>下一个</button>
|
|
330
|
-
* <button onClick={toggleMute}>静音</button>
|
|
331
|
-
* ```
|
|
332
|
-
*/
|
|
333
|
-
export function usePlaybackActions() {
|
|
334
|
-
return usePlaybackQueueStore(useShallow(selectActions));
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* 判断指定项目是否正在播放
|
|
338
|
-
*
|
|
339
|
-
* 选择性订阅,只有当该项目的播放状态变化时才会重渲染。
|
|
340
|
-
* 这是性能最优的播放状态判断方式。
|
|
341
|
-
*
|
|
342
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
343
|
-
*
|
|
344
|
-
* @param id - 项目 ID
|
|
345
|
-
* @returns 是否正在播放
|
|
346
|
-
*
|
|
347
|
-
* @example
|
|
348
|
-
* ```tsx
|
|
349
|
-
* const VideoCard = ({ item }) => {
|
|
350
|
-
* const isPlaying = usePlaybackIsPlaying(item.id)
|
|
351
|
-
*
|
|
352
|
-
* return (
|
|
353
|
-
* <video autoPlay={isPlaying} muted />
|
|
354
|
-
* )
|
|
355
|
-
* }
|
|
356
|
-
* ```
|
|
357
|
-
*/
|
|
358
|
-
export function usePlaybackIsPlaying(id) {
|
|
359
|
-
return usePlaybackQueueStore(state => state.currentId === id);
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* 获取静音状态
|
|
363
|
-
*
|
|
364
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
365
|
-
*
|
|
366
|
-
* @returns 是否静音
|
|
367
|
-
*
|
|
368
|
-
* @example
|
|
369
|
-
* ```tsx
|
|
370
|
-
* const muted = usePlaybackMuted()
|
|
371
|
-
*
|
|
372
|
-
* <video muted={muted} />
|
|
373
|
-
* ```
|
|
374
|
-
*/
|
|
375
|
-
export function usePlaybackMuted() {
|
|
376
|
-
return usePlaybackQueueStore(selectMuted);
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* 获取当前播放的项目 ID
|
|
380
|
-
*
|
|
381
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
382
|
-
*
|
|
383
|
-
* @returns 当前播放的 ID,没有播放时为 null
|
|
384
|
-
*
|
|
385
|
-
* @example
|
|
386
|
-
* ```tsx
|
|
387
|
-
* const currentId = usePlaybackCurrentId()
|
|
388
|
-
*
|
|
389
|
-
* if (currentId) {
|
|
390
|
-
* console.log('正在播放:', currentId)
|
|
391
|
-
* }
|
|
392
|
-
* ```
|
|
393
|
-
*/
|
|
394
|
-
export function usePlaybackCurrentId() {
|
|
395
|
-
return usePlaybackQueueStore(selectCurrentId);
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* 获取当前激活的 source 名称
|
|
399
|
-
*
|
|
400
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
401
|
-
*
|
|
402
|
-
* @returns source 名称,没有激活时为 null
|
|
403
|
-
*
|
|
404
|
-
* @example
|
|
405
|
-
* ```tsx
|
|
406
|
-
* const activeSource = usePlaybackActiveSource()
|
|
407
|
-
*
|
|
408
|
-
* // 高亮当前激活的 Tab
|
|
409
|
-
* <Tab active={activeSource === 'home'}>首页</Tab>
|
|
410
|
-
* ```
|
|
411
|
-
*/
|
|
412
|
-
export function usePlaybackActiveSource() {
|
|
413
|
-
return usePlaybackQueueStore(selectActiveSource);
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* 获取循环播放状态
|
|
417
|
-
*
|
|
418
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
419
|
-
*
|
|
420
|
-
* @returns 是否循环播放
|
|
421
|
-
*
|
|
422
|
-
* @example
|
|
423
|
-
* ```tsx
|
|
424
|
-
* const loop = usePlaybackLoop()
|
|
425
|
-
* const { setLoop } = usePlaybackActions()
|
|
426
|
-
*
|
|
427
|
-
* <button onClick={() => setLoop(!loop)}>
|
|
428
|
-
* {loop ? '循环开' : '循环关'}
|
|
429
|
-
* </button>
|
|
430
|
-
* ```
|
|
431
|
-
*/
|
|
432
|
-
export function usePlaybackLoop() {
|
|
433
|
-
return usePlaybackQueueStore(selectLoop);
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* 获取指定 source 的项目 ID 列表
|
|
437
|
-
*
|
|
438
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
439
|
-
*
|
|
440
|
-
* @param source - source 名称
|
|
441
|
-
* @returns 项目 ID 列表,source 不存在时返回空数组
|
|
442
|
-
*
|
|
443
|
-
* @example
|
|
444
|
-
* ```tsx
|
|
445
|
-
* const homeItems = usePlaybackSourceItems('home')
|
|
446
|
-
*
|
|
447
|
-
* console.log('首页有', homeItems.length, '个视频')
|
|
448
|
-
* ```
|
|
449
|
-
*/
|
|
450
|
-
export function usePlaybackSourceItems(source) {
|
|
451
|
-
return usePlaybackQueueStore(state => { var _a, _b; return (_b = (_a = state.sources[source]) === null || _a === void 0 ? void 0 : _a.itemIds) !== null && _b !== void 0 ? _b : []; });
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* 获取单个 item 的播放状态和静音状态(常用组合)
|
|
455
|
-
*
|
|
456
|
-
* 使用 shallow 比较,仅当 isPlaying 或 muted 变化时重渲染。
|
|
457
|
-
*
|
|
458
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
459
|
-
*
|
|
460
|
-
* @param id - 项目 ID
|
|
461
|
-
* @returns { isPlaying: boolean, muted: boolean }
|
|
462
|
-
*
|
|
463
|
-
* @example
|
|
464
|
-
* ```tsx
|
|
465
|
-
* const VideoCard = ({ item }) => {
|
|
466
|
-
* const { isPlaying, muted } = usePlaybackItemState(item.id)
|
|
467
|
-
* const { onEnded } = usePlaybackActions()
|
|
468
|
-
*
|
|
469
|
-
* return (
|
|
470
|
-
* <video
|
|
471
|
-
* autoPlay={isPlaying}
|
|
472
|
-
* muted={muted}
|
|
473
|
-
* onEnded={onEnded}
|
|
474
|
-
* />
|
|
475
|
-
* )
|
|
476
|
-
* }
|
|
477
|
-
* ```
|
|
478
|
-
*/
|
|
479
|
-
export function usePlaybackItemState(id) {
|
|
480
|
-
return usePlaybackQueueStore(useShallow(state => ({
|
|
481
|
-
isPlaying: state.currentId === id,
|
|
482
|
-
muted: state.muted,
|
|
483
|
-
})));
|
|
484
|
-
}
|
|
485
|
-
// ============================================================================
|
|
486
|
-
// Non-Hook API - 非 Hook API(用于组件外部或副作用)
|
|
487
|
-
// ============================================================================
|
|
488
|
-
/**
|
|
489
|
-
* 播放队列命名空间
|
|
490
|
-
*
|
|
491
|
-
* 非 Hook 版本的 API,用于:
|
|
492
|
-
* - 组件外部调用(如事件回调、工具函数)
|
|
493
|
-
* - 不在 React 组件中的场景
|
|
494
|
-
* - 需要命令式调用的场景
|
|
495
|
-
*
|
|
496
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
497
|
-
*
|
|
498
|
-
* @example
|
|
499
|
-
* ```tsx
|
|
500
|
-
* // 在事件回调中使用
|
|
501
|
-
* const handleClick = () => {
|
|
502
|
-
* PlaybackQueue.play('home', 'item-1')
|
|
503
|
-
* }
|
|
504
|
-
*
|
|
505
|
-
* // 在非组件代码中使用
|
|
506
|
-
* PlaybackQueue.toggleMute()
|
|
507
|
-
*
|
|
508
|
-
* // 获取当前状态快照
|
|
509
|
-
* const state = PlaybackQueue.getState()
|
|
510
|
-
* console.log('当前播放:', state.currentId)
|
|
511
|
-
*
|
|
512
|
-
* // 订阅状态变化
|
|
513
|
-
* const unsubscribe = PlaybackQueue.subscribeCurrentId((currentId, prevId) => {
|
|
514
|
-
* console.log('播放变化:', prevId, '->', currentId)
|
|
515
|
-
* })
|
|
516
|
-
* // 不再需要时取消订阅
|
|
517
|
-
* unsubscribe()
|
|
518
|
-
* ```
|
|
519
|
-
*/
|
|
520
|
-
export const PlaybackQueue = {
|
|
521
|
-
/**
|
|
522
|
-
* 获取当前状态快照(非响应式)
|
|
523
|
-
*
|
|
524
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
525
|
-
*
|
|
526
|
-
* @returns 当前完整状态
|
|
527
|
-
*/
|
|
528
|
-
getState: () => usePlaybackQueueStore.getState(),
|
|
529
|
-
/**
|
|
530
|
-
* 设置某个 source 的播放列表
|
|
531
|
-
*
|
|
532
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
533
|
-
*
|
|
534
|
-
* @see {@link PlaybackQueueActions.setSource}
|
|
535
|
-
*/
|
|
536
|
-
setSource: (...args) => usePlaybackQueueStore.getState().setSource(...args),
|
|
537
|
-
/**
|
|
538
|
-
* 向某个 source 追加项目
|
|
539
|
-
*
|
|
540
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
541
|
-
*
|
|
542
|
-
* @see {@link PlaybackQueueActions.appendToSource}
|
|
543
|
-
*/
|
|
544
|
-
appendToSource: (...args) => usePlaybackQueueStore.getState().appendToSource(...args),
|
|
545
|
-
/**
|
|
546
|
-
* 移除某个 source
|
|
547
|
-
*
|
|
548
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
549
|
-
*
|
|
550
|
-
* @see {@link PlaybackQueueActions.removeSource}
|
|
551
|
-
*/
|
|
552
|
-
removeSource: (...args) => usePlaybackQueueStore.getState().removeSource(...args),
|
|
553
|
-
/**
|
|
554
|
-
* 播放指定项目
|
|
555
|
-
*
|
|
556
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
557
|
-
*
|
|
558
|
-
* @see {@link PlaybackQueueActions.play}
|
|
559
|
-
*/
|
|
560
|
-
play: (...args) => usePlaybackQueueStore.getState().play(...args),
|
|
561
|
-
/**
|
|
562
|
-
* 播放指定项目(自动查找 source)
|
|
563
|
-
*
|
|
564
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
565
|
-
*
|
|
566
|
-
* @see {@link PlaybackQueueActions.playById}
|
|
567
|
-
*/
|
|
568
|
-
playById: (...args) => usePlaybackQueueStore.getState().playById(...args),
|
|
569
|
-
/**
|
|
570
|
-
* 播放下一个
|
|
571
|
-
*
|
|
572
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
573
|
-
*
|
|
574
|
-
* @see {@link PlaybackQueueActions.next}
|
|
575
|
-
*/
|
|
576
|
-
next: () => usePlaybackQueueStore.getState().next(),
|
|
577
|
-
/**
|
|
578
|
-
* 播放上一个
|
|
579
|
-
*
|
|
580
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
581
|
-
*
|
|
582
|
-
* @see {@link PlaybackQueueActions.prev}
|
|
583
|
-
*/
|
|
584
|
-
prev: () => usePlaybackQueueStore.getState().prev(),
|
|
585
|
-
/**
|
|
586
|
-
* 停止播放
|
|
587
|
-
*
|
|
588
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
589
|
-
*
|
|
590
|
-
* @see {@link PlaybackQueueActions.stop}
|
|
591
|
-
*/
|
|
592
|
-
stop: () => usePlaybackQueueStore.getState().stop(),
|
|
593
|
-
/**
|
|
594
|
-
* 播放完成回调
|
|
595
|
-
*
|
|
596
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
597
|
-
*
|
|
598
|
-
* @see {@link PlaybackQueueActions.onEnded}
|
|
599
|
-
*/
|
|
600
|
-
onEnded: () => usePlaybackQueueStore.getState().onEnded(),
|
|
601
|
-
/**
|
|
602
|
-
* 设置静音状态
|
|
603
|
-
*
|
|
604
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
605
|
-
*
|
|
606
|
-
* @see {@link PlaybackQueueActions.setMuted}
|
|
607
|
-
*/
|
|
608
|
-
setMuted: (...args) => usePlaybackQueueStore.getState().setMuted(...args),
|
|
609
|
-
/**
|
|
610
|
-
* 切换静音状态
|
|
611
|
-
*
|
|
612
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
613
|
-
*
|
|
614
|
-
* @see {@link PlaybackQueueActions.toggleMute}
|
|
615
|
-
*/
|
|
616
|
-
toggleMute: () => usePlaybackQueueStore.getState().toggleMute(),
|
|
617
|
-
/**
|
|
618
|
-
* 设置循环播放
|
|
619
|
-
*
|
|
620
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
621
|
-
*
|
|
622
|
-
* @see {@link PlaybackQueueActions.setLoop}
|
|
623
|
-
*/
|
|
624
|
-
setLoop: (...args) => usePlaybackQueueStore.getState().setLoop(...args),
|
|
625
|
-
/**
|
|
626
|
-
* 重置所有状态
|
|
627
|
-
*
|
|
628
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
629
|
-
*
|
|
630
|
-
* @see {@link PlaybackQueueActions.reset}
|
|
631
|
-
*/
|
|
632
|
-
reset: () => usePlaybackQueueStore.getState().reset(),
|
|
633
|
-
/**
|
|
634
|
-
* 订阅当前播放 ID 变化
|
|
635
|
-
*
|
|
636
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
637
|
-
*
|
|
638
|
-
* @param callback - 回调函数,参数为 (新值, 旧值)
|
|
639
|
-
* @returns 取消订阅函数
|
|
640
|
-
*
|
|
641
|
-
* @example
|
|
642
|
-
* ```ts
|
|
643
|
-
* const unsubscribe = PlaybackQueue.subscribeCurrentId((currentId, prevId) => {
|
|
644
|
-
* console.log('播放变化:', prevId, '->', currentId)
|
|
645
|
-
* })
|
|
646
|
-
*
|
|
647
|
-
* // 清理时取消订阅
|
|
648
|
-
* unsubscribe()
|
|
649
|
-
* ```
|
|
650
|
-
*/
|
|
651
|
-
subscribeCurrentId: (callback) => usePlaybackQueueStore.subscribe(state => state.currentId, callback),
|
|
652
|
-
/**
|
|
653
|
-
* 订阅 activeSource 变化
|
|
654
|
-
*
|
|
655
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
656
|
-
*
|
|
657
|
-
* @param callback - 回调函数,参数为 (新值, 旧值)
|
|
658
|
-
* @returns 取消订阅函数
|
|
659
|
-
*/
|
|
660
|
-
subscribeActiveSource: (callback) => usePlaybackQueueStore.subscribe(state => state.activeSource, callback),
|
|
661
|
-
/**
|
|
662
|
-
* 订阅静音状态变化
|
|
663
|
-
*
|
|
664
|
-
* 查看更多,请访问 https://github.com/NBXXF/xxf_react/blob/main/src/media/playback-queue-store.md
|
|
665
|
-
*
|
|
666
|
-
* @param callback - 回调函数,参数为 (新值, 旧值)
|
|
667
|
-
* @returns 取消订阅函数
|
|
668
|
-
*/
|
|
669
|
-
subscribeMuted: (callback) => usePlaybackQueueStore.subscribe(state => state.muted, callback),
|
|
670
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Video 安全播放扩展
|
|
3
|
-
* 处理移动端自动播放限制,自动降级为静音播放
|
|
4
|
-
*/
|
|
5
|
-
export interface PlaySafeOptions {
|
|
6
|
-
/** 是否在非静音播放失败时降级为静音重试,默认 true */
|
|
7
|
-
mutedRetry?: boolean;
|
|
8
|
-
/** 从有声降级为静音时回调 */
|
|
9
|
-
onMutedChange?: () => void;
|
|
10
|
-
}
|
|
11
|
-
declare global {
|
|
12
|
-
interface HTMLVideoElement {
|
|
13
|
-
playSafe(options?: PlaySafeOptions): Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* 安全播放视频
|
|
18
|
-
* 1. 按当前 video.muted 状态尝试播放
|
|
19
|
-
* 2. 如果非静音播放失败,降级为静音再试
|
|
20
|
-
*/
|
|
21
|
-
export declare function playSafe(video: HTMLVideoElement, options?: PlaySafeOptions): Promise<void>;
|
|
22
|
-
/**
|
|
23
|
-
* 扩展 HTMLVideoElement 原型
|
|
24
|
-
*/
|
|
25
|
-
export declare function extendVideoElement(): void;
|
|
26
|
-
//# sourceMappingURL=video-play-safe.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-play-safe.d.ts","sourceRoot":"","sources":["../../src/media/video-play-safe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC5B,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB;IAClB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAGD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,gBAAgB;QACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtD;CACJ;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC1B,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,eAAoB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAYzC"}
|