{"version":3,"sources":["../src/wxShare.ts"],"sourcesContent":["import wx from \"weixin-js-sdk\";\r\n\r\nexport interface ShareConfig {\r\n  title?: string;\r\n  desc?: string;\r\n  link?: string;\r\n  imgUrl?: string;\r\n  success?: () => void;\r\n  fail?: (err: any) => void;\r\n  cancel?: () => void;\r\n}\r\n\r\nexport interface SignConfig {\r\n  appId: string;\r\n  timestamp: string;\r\n  nonceStr: string;\r\n  signature: string;\r\n}\r\n\r\nexport interface SignConfigResponse {\r\n  data: SignConfig;\r\n}\r\n\r\nexport interface SignConfigOptions {\r\n  url?: string;\r\n  customFetch?: (url: string) => Promise<SignConfigResponse>;\r\n}\r\n\r\ninterface WxError {\r\n  errMsg: string;\r\n}\r\n\r\nclass WxShareUtil {\r\n  private static instance: WxShareUtil;\r\n  private isInit = false;\r\n  private isDebug = false;\r\n  private signConfig: SignConfig | null = null;\r\n  private defaultConfig: Required<ShareConfig> = {\r\n    title: document.title,\r\n    desc: document.title,\r\n    link: this.getCurrentUrl(),\r\n    imgUrl: \"\",\r\n    success: () => console.log(\"分享成功\"),\r\n    fail: (err) => console.error(\"分享失败:\", err),\r\n    cancel: () => console.log(\"取消分享\"),\r\n  };\r\n  private defaultApiUrl = \"/api/v2/wx-share\";\r\n  private customFetch?: (url: string) => Promise<SignConfigResponse>;\r\n  private shareOptions: ShareConfig | null = null;\r\n\r\n  private constructor() {}\r\n\r\n  public static getInstance(): WxShareUtil {\r\n    if (!WxShareUtil.instance) {\r\n      WxShareUtil.instance = new WxShareUtil();\r\n    }\r\n    return WxShareUtil.instance;\r\n  }\r\n\r\n  /**\r\n   * 设置调试模式\r\n   * @param debug 是否开启调试模式\r\n   * @returns 当前实例，支持链式调用\r\n   */\r\n  public setDebug(debug: boolean): WxShareUtil {\r\n    this.isDebug = debug;\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 获取当前页面URL（不包含hash）\r\n   */\r\n  public getCurrentUrl(): string {\r\n    return window.location.href.split(\"#\")[0];\r\n  }\r\n\r\n  private isWeixinBrowser(): boolean {\r\n    return /micromessenger/i.test(navigator.userAgent);\r\n  }\r\n\r\n  /**\r\n   * 设置分享信息\r\n   * @param config 分享配置\r\n   * @param useDefault 是否使用默认配置合并（默认false）\r\n   * @returns 当前实例，支持链式调用\r\n   */\r\n  public setShareInfo(\r\n    config: ShareConfig,\r\n    useDefault: boolean = false\r\n  ): WxShareUtil {\r\n    if (!this.isInit) {\r\n      console.warn(\"请先初始化微信分享配置\");\r\n      return this;\r\n    }\r\n\r\n    // 根据useDefault参数决定是否合并默认配置\r\n    const shareConfig = useDefault\r\n      ? {\r\n          ...this.defaultConfig,\r\n          ...config,\r\n          link: config.link || this.getCurrentUrl(),\r\n        }\r\n      : {\r\n          ...this.defaultConfig, // 仍然需要默认配置来确保必需字段存在\r\n          ...config,\r\n          link: config.link || this.getCurrentUrl(),\r\n        };\r\n\r\n    // 确保所有必需的分享参数都存在\r\n    if (!shareConfig.title || !shareConfig.desc || !shareConfig.link) {\r\n      console.warn(\"分享参数不完整，可能导致分享失败\");\r\n      return this; // 如果参数不完整，直接返回\r\n    }\r\n\r\n    // 基础分享配置\r\n    const baseShareConfig = {\r\n      title: shareConfig.title,\r\n      desc: shareConfig.desc,\r\n      link: shareConfig.link,\r\n      imgUrl: shareConfig.imgUrl,\r\n      success: () => {\r\n        console.log(\"分享配置成功\");\r\n        shareConfig.success?.();\r\n      },\r\n      fail: (err: any) => {\r\n        console.error(\"分享配置失败:\", err);\r\n        shareConfig.fail?.(err);\r\n      },\r\n      cancel: () => {\r\n        console.log(\"取消分享\");\r\n        shareConfig.cancel?.();\r\n      },\r\n    };\r\n\r\n    // 分享给朋友\r\n    wx.updateAppMessageShareData(baseShareConfig);\r\n\r\n    // 分享到朋友圈\r\n    wx.updateTimelineShareData(baseShareConfig);\r\n\r\n    // 分享到腾讯微博\r\n    if (typeof wx.onMenuShareWeibo === \"function\") {\r\n      wx.onMenuShareWeibo(baseShareConfig);\r\n    }\r\n\r\n    // 分享到QQ空间\r\n    if (typeof wx.onMenuShareQZone === \"function\") {\r\n      wx.onMenuShareQZone(baseShareConfig);\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 快速分享（自动初始化并设置分享信息）\r\n   * @param signConfig 签名配置\r\n   * @param config 分享配置\r\n   * @param useDefault 是否使用默认配置合并（默认false）\r\n   * @returns Promise<boolean>\r\n   */\r\n  public async share(\r\n    signConfig: SignConfig,\r\n    config: ShareConfig,\r\n    useDefault: boolean = false\r\n  ): Promise<boolean> {\r\n    try {\r\n      if (!this.isInit) {\r\n        // 先进行初始化\r\n        const initResult = await this.initWithConfig(signConfig);\r\n        if (!initResult) {\r\n          return false;\r\n        }\r\n      }\r\n\r\n      // 初始化成功后，设置分享信息\r\n      this.setShareInfo(config, useDefault);\r\n      return true;\r\n    } catch (error) {\r\n      console.error(\"分享设置失败:\", error);\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 初始化微信分享配置\r\n   * @param signConfig 签名配置\r\n   * @returns Promise<boolean> 初始化是否成功\r\n   */\r\n  public async initWithConfig(signConfig: SignConfig): Promise<boolean> {\r\n    if (this.isInit) {\r\n      console.log(\"微信分享已经初始化\");\r\n      return true;\r\n    }\r\n\r\n    if (!this.isWeixinBrowser()) {\r\n      console.log(\"非微信浏览器环境\");\r\n      return false;\r\n    }\r\n\r\n    try {\r\n      // 确保所有必需的参数都存在\r\n      if (\r\n        !signConfig.appId ||\r\n        !signConfig.timestamp ||\r\n        !signConfig.nonceStr ||\r\n        !signConfig.signature\r\n      ) {\r\n        throw new Error(\"签名配置参数不完整\");\r\n      }\r\n\r\n      return new Promise((resolve) => {\r\n        wx.config({\r\n          debug: this.isDebug, // 使用实例的调试模式设置\r\n          appId: signConfig.appId,\r\n          timestamp: parseInt(signConfig.timestamp, 10),\r\n          nonceStr: signConfig.nonceStr,\r\n          signature: signConfig.signature,\r\n          jsApiList: [\r\n            \"updateAppMessageShareData\",\r\n            \"updateTimelineShareData\",\r\n            \"onMenuShareTimeline\",\r\n            \"onMenuShareAppMessage\",\r\n          ],\r\n        });\r\n\r\n        wx.ready(() => {\r\n          console.log(\"微信JS-SDK初始化成功\");\r\n          this.isInit = true;\r\n          resolve(true);\r\n        });\r\n\r\n        wx.error((res: WxError) => {\r\n          console.error(\"微信JS-SDK初始化失败:\", res);\r\n          this.isInit = false;\r\n          resolve(false);\r\n        });\r\n      });\r\n    } catch (error) {\r\n      console.error(\"初始化失败:\", error);\r\n      this.isInit = false;\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 设置分享配置\r\n   * @param options 分享配置\r\n   * @returns 当前实例，支持链式调用\r\n   */\r\n  public setShareOptions(options: ShareConfig): WxShareUtil {\r\n    this.shareOptions = options;\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 从API获取签名配置并初始化分享\r\n   * @param options 配置选项\r\n   * @returns Promise<WxShareUtil>\r\n   */\r\n  public async fetchSignConfigAndShare(\r\n    options: SignConfigOptions = {}\r\n  ): Promise<WxShareUtil> {\r\n    try {\r\n      const currentUrl = this.getCurrentUrl();\r\n      const apiUrl = options.url || this.defaultApiUrl;\r\n\r\n      let response: SignConfigResponse;\r\n      if (this.customFetch) {\r\n        response = await this.customFetch(apiUrl);\r\n      } else {\r\n        const res = await fetch(apiUrl, {\r\n          method: \"POST\",\r\n          headers: { \"Content-Type\": \"application/json\" },\r\n          body: JSON.stringify({ url: currentUrl }),\r\n        });\r\n        response = await res.json();\r\n      }\r\n\r\n      if (!response.data) {\r\n        throw new Error(\"获取签名配置失败: 响应数据为空\");\r\n      }\r\n\r\n      this.signConfig = response.data;\r\n\r\n      if (!this.shareOptions) {\r\n        throw new Error(\"请先设置分享配置\");\r\n      }\r\n\r\n      const success = await this.share(this.signConfig, this.shareOptions);\r\n      if (!success) {\r\n        throw new Error(\"微信分享初始化失败\");\r\n      }\r\n\r\n      return this;\r\n    } catch (error) {\r\n      console.error(\"分享设置失败:\", error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 设置自定义的签名配置获取方法\r\n   * @param customFetch 自定义的fetch方法\r\n   * @returns 当前实例，支持链式调用\r\n   */\r\n  public setCustomFetch(\r\n    customFetch: (url: string) => Promise<SignConfigResponse>\r\n  ): WxShareUtil {\r\n    this.customFetch = customFetch;\r\n    return this;\r\n  }\r\n}\r\n\r\n// 创建工具实例\r\nexport const createWxShare = () => WxShareUtil.getInstance(); "],"mappings":"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","names":[]}