import { ReporterOptions, ReportItemType, Reporter, Context } from '@tencent/merlin-core'; import { BehaviorReportItemData, CustomReportItemData, ElementHoverReportItemData, ElementClickReportItemData, ElementExposeReportItemData, ElementConcealReportItemData, PageEnterReportItemData, PageLeaveReportItemData, VideoPlayStartReportItemData, VideoPlayWaitingReportItemData, VideoPlayPauseReportItemData, VideoPlaySeekReportItemData, VideoPlayFinishReportItemData, } from './types'; import { PageManager } from './PageManager'; import { BehaviorType } from './common'; export interface BehaviorReporterOptions, R extends Reporter> extends ReporterOptions { /** localStorage 中存储的页面栈个数上线 */ pageStackStorageLimit?: number; } /** 行为上报器 */ export class BehaviorReporter extends Reporter { pageStackStorageLimit = 20; protected pageManager: PageManager = new PageManager(this); setOptions(options: BehaviorReporterOptions) { if (options.pageStackStorageLimit !== undefined) { this.pageStackStorageLimit = options.pageStackStorageLimit; } super.setOptions(options); } init(options: BehaviorReporterOptions) { try { this.setOptions(options); this.pageManager.init(); super.init(options); } catch (e) { this.errorHandler(e as Error); } } get serializeLinkedData(): string { return ( this.adapter?.serializeLinkedData({ fromAccessId: this.pageManager.currentPage?.accessId, }) || '' ); } /** 读取页面栈(前一页面) */ loadPage() { return this.pageManager.load(); } /** 推页面栈 */ pushPage(...params: Parameters) { this.pageManager.push(...params); } /** 更新当前页面上下文数据 */ updatePage(...params: Parameters) { this.pageManager.updatePageInfo(...params); // 若当前处于 buffering 状态,更新所有 buffer 项的 pageInfo if (this.buffering) { this.buffer = this.buffer.map((buf) => ({ ...buf, context: { ...buf.context, scope: { ...buf.context.scope, ...this.pageManager.getPageInfo(), }, }, })); } } reportCustom(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.CUSTOM, }, }); } reportElementHover(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.ELEMENT_HOVER, }, }); } reportElementClick(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.ELEMENT_CLICK, }, }); } reportElementExpose(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.ELEMENT_EXPOSE, }, }); } reportElementConceal(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.ELEMENT_CONCEAL, }, }); } reportPageEnter(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.PAGE_ENTER, }, }); } reportPageLeave(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.PAGE_LEAVE, }, }); } reportVideoPlayStart(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.VIDEO_PLAY_START, }, }); } reportVideoPlayWaiting(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.VIDEO_PLAY_WAITING, }, }); } reportVideoPlayPause(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.VIDEO_PLAY_PAUSE, }, }); } reportVideoPlaySeek(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.VIDEO_PLAY_SEEK, }, }); } reportVideoPlayFinish(data: Omit) { this.report({ type: ReportItemType.BEHAVIOR, data: { ...data, behaviorType: BehaviorType.VIDEO_PLAY_FINISH, }, }); } protected getContext(): Context { return { base: this.baseContext, env: this.adapter?.envInfo || {}, scope: { ...this.scopeContext, ...this.pageManager.getPageInfo() }, }; } } export const behaviorReporter = new BehaviorReporter();