useEventTracking.js
2.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
* 事件埋点 Composable
*
* @description 提供统一的事件埋点功能,支持多种埋点类型
* @module composables/useEventTracking
*/
import { addAPI } from '@/api/event'
/**
* 埋点事件类型枚举
*
* @enum {string}
*/
export const EventType = {
/** 阅读素材 */
READ_FILE: 'READ_FILE',
// 未来可以添加更多事件类型
// COLLECT_FILE: 'COLLECT_FILE', // 收藏素材
// SHARE_FILE: 'SHARE_FILE', // 分享素材
// DOWNLOAD_FILE: 'DOWNLOAD_FILE', // 下载素材
// VIEW_PRODUCT: 'VIEW_PRODUCT', // 查看产品
}
/**
* 使用事件埋点
*
* @description 提供统一的事件埋点方法,自动处理错误
* @returns {Object} 埋点方法和状态
*
* @example
* // 基础用法
* const { trackEvent } = useEventTracking()
*
* // 追踪阅读素材事件
* trackEvent(EventType.READ_FILE, 'file-id-123')
*
* // 带额外数据的追踪
* trackEvent(EventType.READ_FILE, 'file-id-123', {
* title: '文档标题',
* category: '培训资料'
* })
*/
export function useEventTracking() {
/**
* 追踪事件
*
* @description 发送埋点数据到后端
* @async
* @param {string} type - 事件类型(使用 EventType 枚举)
* @param {string} objectId - 关联的对象 ID(文件 ID、产品 ID 等)
* @param {Object} extraData - 额外的埋点数据(可选)
* @param {string} [extraData.title] - 对象标题
* @param {string} [extraData.category] - 分类
* @param {Record<string, any>} [extraData.*] - 其他自定义字段
* @returns {Promise<void>}
*
* @example
* // 追踪阅读事件
* await trackEvent(EventType.READ_FILE, 'file-id-123')
*
* // 追踪带额外数据的阅读事件
* await trackEvent(EventType.READ_FILE, 'file-id-123', {
* title: '保险产品手册',
* category: '产品资料'
* })
*/
const trackEvent = async (type, objectId, extraData = {}) => {
try {
const params = {
type,
object_id: objectId,
...extraData
}
await addAPI(params)
// 静默处理埋点失败,不影响用户操作
// 仅在开发环境打印日志
if (process.env.NODE_ENV === 'development') {
console.log('[埋点成功]', { type, objectId, extraData })
}
} catch (error) {
// 埋点失败不应影响用户体验,静默处理
if (process.env.NODE_ENV === 'development') {
console.error('[埋点失败]', error)
}
}
}
/**
* 追踪文件阅读事件
*
* @description 便捷方法:追踪文件/素材阅读
* @async
* @param {string} fileId - 文件 ID
* @param {Object} extraData - 额外的埋点数据
* @returns {Promise<void>}
*
* @example
* await trackFileRead('file-id-123', {
* title: '保险产品手册'
* })
*/
const trackFileRead = async (fileId, extraData = {}) => {
await trackEvent(EventType.READ_FILE, fileId, extraData)
}
return {
trackEvent,
trackFileRead
}
}