useEventTracking.js 2.98 KB
/**
 * 事件埋点 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
  }
}