Files
2026-01-12 17:52:15 +08:00

281 lines
9.4 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @module LiveListState
* @module_description
* 直播列表状态管理模块
* 核心功能:管理直播间的完整生命周期,包括创建、加入、离开、结束等核心业务流程。
* 技术特点支持分页加载、实时状态同步、直播信息动态更新采用响应式数据管理确保UI与数据状态实时同步。
* 业务价值:为直播平台提供核心的直播间管理能力,支持大规模并发直播场景,是直播业务的基础设施。
* 应用场景:直播列表展示、直播间创建、直播状态管理、直播数据统计等核心业务场景。
*/
import { ref } from "vue";
import {
LiveInfoParam, FetchLiveListOptions, CreateLiveOptions, JoinLiveOptions, LeaveLiveOptions, EndLiveOptions, UpdateLiveInfoOptions, UpdateLiveMetaDataOptions, CallExperimentalAPIOptions, ILiveListener,
} from "@/uni_modules/tuikit-atomic-x";
import { getRTCRoomEngineManager } from "./rtcRoomEngine";
import { callUTSFunction, safeJsonParse } from "../utils/utsUtils";
/**
* 直播列表数据
* @type {Ref<LiveInfoParam[]>}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { liveList } = useLiveListState();
*
* // 监听直播列表变化
* watch(liveList, (newList) => {
* if (newList && newList.length > 0) {
* console.log('直播列表更新:', newList);
* newList.forEach(live => {
* console.log('直播ID:', live.liveID);
* console.log('直播标题:', live.title);
* });
* }
* });
*
* // 获取当前直播列表
* const currentList = liveList.value;
* console.log('当前直播数量:', currentList.length);
*/
const liveList = ref<LiveInfoParam[]>([]);
/**
* 直播列表游标,用于分页加载
* @type {Ref<string>}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { liveListCursor } = useLiveListState();
*
* // 监听游标变化用于分页加载
* watch(liveListCursor, (newCursor) => {
* console.log('直播列表游标更新:', newCursor);
* // 当游标更新时,可以获取下一页数据
* if (newCursor) {
* console.log('加载下一页直播列表');
* }
* });
*
* // 获取当前游标
* const cursor = liveListCursor.value;
* if (cursor) {
* console.log('当前分页游标:', cursor);
* }
*/
const liveListCursor = ref<string>("");
/**
* 当前直播信息
* @type {Ref<LiveInfoParam | null>}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { currentLive } = useLiveListState();
*
* // 监听当前直播信息变化
* watch(currentLive, (newLive) => {
* if (newLive) {
* console.log('当前直播信息更新:', newLive);
* console.log('直播ID:', newLive.liveID);
* console.log('直播标题:', newLive.title);
* console.log('观看人数:', newLive.viewerCount);
* }
* });
*
* // 获取当前直播信息
* const live = currentLive.value;
* if (live) {
* console.log('当前进入的直播:', live.title);
* }
*/
const currentLive = ref<LiveInfoParam | null>(null);
/**
* 获取直播列表
* @param {FetchLiveListOptions} params - 获取参数
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { fetchLiveList } = useLiveListState();
* fetchLiveList({ cursor: "", count: 20 });
*/
function fetchLiveList(params : FetchLiveListOptions) : void {
callUTSFunction("fetchLiveList", params);
}
/**
* 创建直播间
* @param {CreateLiveOptions} params - 创建参数
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { createLive } = useLiveListState();
* createLive({ title: 'my live', coverUrl: 'https://example.com/cover.jpg'});
*/
function createLive(params : CreateLiveOptions) : void {
callUTSFunction("createLive", params);
}
/**
* 加入直播间
* @param {JoinLiveOptions} params - 加入参数
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { joinLive } = useLiveListState();
* joinLive({ liveID: 'host_live_id' });
*/
function joinLive(params : JoinLiveOptions) : void {
callUTSFunction("joinLive", params);
}
/**
* 离开直播间
* @param {LeaveLiveOptions} [params] - 离开参数(可选)
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { leaveLive } = useLiveListState();
* leaveLive();
*/
function leaveLive(params ?: LeaveLiveOptions) : void {
callUTSFunction("leaveLive", params || {});
}
/**
* 结束直播
* @param {EndLiveOptions} [params] - 结束参数(可选)
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { endLive } = useLiveListState();
* endLive();
*/
function endLive(params ?: EndLiveOptions) : void {
callUTSFunction("endLive", params || {});
}
/**
* 更新直播信息
* @param {UpdateLiveInfoOptions} params - 更新参数
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { updateLiveInfo } = useLiveListState();
* updateLiveInfo({ liveID: 'your_live_id', title: 'new title' });
*/
function updateLiveInfo(params : UpdateLiveInfoOptions) : void {
callUTSFunction("updateLiveInfo", params);
}
/**
* 更新直播元数据
* @param {UpdateLiveMetaDataOptions} params - 更新直播元数据, 监听 currentLive 获取更新结果
* @returns {void}
* @memberof module:LiveListState
* @example
* import { updateLiveMetaData } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { updateLiveMetaData } = useLiveListState();
* updateLiveMetaData({metaData: '['key': 'value']' });
*/
function updateLiveMetaData(params : UpdateLiveMetaDataOptions) : void {
callUTSFunction("updateLiveMetaData", params);
}
function callExperimentalAPI(params : CallExperimentalAPIOptions) : void {
const defaultCallback = {
onResponse: (res ?: string) => {
console.log("onExperimentalAPIResponse: ", res);
},
};
const finalParams = {
...params,
onResponse: params.onResponse || defaultCallback.onResponse,
};
console.log("callExperimentalAPI", finalParams);
getRTCRoomEngineManager().callExperimentalAPI(finalParams);
}
/**
* 添加直播列表事件监听
* @param {string} eventName - 事件名称,可选值: 'onLiveEnded'(直播结束)<br>'onKickedOutOfLive'(被踢出直播间)
* @param {ILiveListener} listener - 事件回调函数
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { addLiveListListener } = useLiveListState();
* addLiveListListener('onLiveEnded', {
* callback: (params) => {
* console.log('result:', params);
* }
* });
*/
function addLiveListListener(eventName : string, listener : ILiveListener) : void {
getRTCRoomEngineManager().addLiveListListener(eventName, listener);
}
/**
* 移除直播列表事件监听
* @param {string} eventName - 事件名称,可选值: 'onLiveEnded'(直播结束)<br>'onKickedOutOfLive'(被踢出直播间)
* @param {ILiveListener} listener - 事件回调函数
* @returns {void}
* @memberof module:LiveListState
* @example
* import { useLiveListState } from '@/uni_modules/tuikit-atomic-x/state/LiveListState';
* const { removeLiveListListener } = useLiveListState();
* removeLiveListListener('onLiveEnded', liveEndedListener);
*/
function removeLiveListListener(eventName : string, listener : ILiveListener) : void {
getRTCRoomEngineManager().removeLiveListListener(eventName, listener);
}
const onLiveStoreChanged = (eventName : string, res : string) : void => {
try {
if (eventName === "liveList") {
const data = safeJsonParse<LiveInfoParam[]>(res, []);
liveList.value = data;
} else if (eventName === "liveListCursor") {
const data = safeJsonParse<string>(res, "");
liveListCursor.value = data;
} else if (eventName === "currentLive") {
const data = safeJsonParse<LiveInfoParam | null>(res, null);
currentLive.value = data;
}
} catch (error) {
console.error("onLiveStoreChanged error:", error);
}
};
function bindEvent() : void {
getRTCRoomEngineManager().on("liveStoreChanged", onLiveStoreChanged, "");
}
export function useLiveListState() {
bindEvent();
return {
liveList, // 直播列表数据
liveListCursor, // 直播列表分页游标
currentLive, // 当前直播信息
fetchLiveList, // 获取直播列表
createLive, // 创建直播
joinLive, // 加入直播
leaveLive, // 离开直播
endLive, // 结束直播
updateLiveInfo, // 更新直播信息
updateLiveMetaData, // 更新直播元数据
callExperimentalAPI,
addLiveListListener, // 添加事件监听
removeLiveListListener, // 移除事件监听
};
}
export default useLiveListState;