UNPKG

@tsdanci/wx-share

Version:

WeChat Share SDK utility for web applications

271 lines (269 loc) 9.22 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { createWxShare: () => createWxShare }); module.exports = __toCommonJS(index_exports); // src/wxShare.ts var import_weixin_js_sdk = __toESM(require("weixin-js-sdk")); var WxShareUtil = class _WxShareUtil { constructor() { this.isInit = false; this.isDebug = false; this.signConfig = null; this.defaultConfig = { title: document.title, desc: document.title, link: this.getCurrentUrl(), imgUrl: "", success: () => console.log("\u5206\u4EAB\u6210\u529F"), fail: (err) => console.error("\u5206\u4EAB\u5931\u8D25:", err), cancel: () => console.log("\u53D6\u6D88\u5206\u4EAB") }; this.defaultApiUrl = "/api/v2/wx-share"; this.shareOptions = null; } static getInstance() { if (!_WxShareUtil.instance) { _WxShareUtil.instance = new _WxShareUtil(); } return _WxShareUtil.instance; } /** * 设置调试模式 * @param debug 是否开启调试模式 * @returns 当前实例,支持链式调用 */ setDebug(debug) { this.isDebug = debug; return this; } /** * 获取当前页面URL(包含hash) */ getCurrentUrl() { return window.location.href; } isWeixinBrowser() { return /micromessenger/i.test(navigator.userAgent); } /** * 设置分享信息 * @param config 分享配置 * @param useDefault 是否使用默认配置合并(默认false) * @returns 当前实例,支持链式调用 */ setShareInfo(config, useDefault = false) { if (!this.isInit) { console.warn("\u8BF7\u5148\u521D\u59CB\u5316\u5FAE\u4FE1\u5206\u4EAB\u914D\u7F6E"); return this; } const shareConfig = useDefault ? { ...this.defaultConfig, ...config, link: config.link || this.getCurrentUrl() } : { ...this.defaultConfig, // 仍然需要默认配置来确保必需字段存在 ...config, link: config.link || this.getCurrentUrl() }; if (!shareConfig.title || !shareConfig.desc || !shareConfig.link) { console.warn("\u5206\u4EAB\u53C2\u6570\u4E0D\u5B8C\u6574\uFF0C\u53EF\u80FD\u5BFC\u81F4\u5206\u4EAB\u5931\u8D25"); return this; } const shareLink = shareConfig.link.includes("#") ? shareConfig.link : `${shareConfig.link}${window.location.hash}`; const baseShareConfig = { title: shareConfig.title, desc: shareConfig.desc, link: shareLink, imgUrl: shareConfig.imgUrl, success: () => { console.log("\u5206\u4EAB\u914D\u7F6E\u6210\u529F"); shareConfig.success?.(); }, fail: (err) => { console.error("\u5206\u4EAB\u914D\u7F6E\u5931\u8D25:", err); shareConfig.fail?.(err); }, cancel: () => { console.log("\u53D6\u6D88\u5206\u4EAB"); shareConfig.cancel?.(); } }; import_weixin_js_sdk.default.updateAppMessageShareData(baseShareConfig); import_weixin_js_sdk.default.updateTimelineShareData(baseShareConfig); if (typeof import_weixin_js_sdk.default.onMenuShareWeibo === "function") { import_weixin_js_sdk.default.onMenuShareWeibo(baseShareConfig); } if (typeof import_weixin_js_sdk.default.onMenuShareQZone === "function") { import_weixin_js_sdk.default.onMenuShareQZone(baseShareConfig); } return this; } /** * 快速分享(自动初始化并设置分享信息) * @param signConfig 签名配置 * @param config 分享配置 * @param useDefault 是否使用默认配置合并(默认false) * @returns Promise<boolean> */ async share(signConfig, config, useDefault = false) { try { if (!this.isInit) { const initResult = await this.initWithConfig(signConfig); if (!initResult) { return false; } } this.setShareInfo(config, useDefault); return true; } catch (error) { console.error("\u5206\u4EAB\u8BBE\u7F6E\u5931\u8D25:", error); return false; } } /** * 初始化微信分享配置 * @param signConfig 签名配置 * @returns Promise<boolean> 初始化是否成功 */ async initWithConfig(signConfig) { if (this.isInit) { console.log("\u5FAE\u4FE1\u5206\u4EAB\u5DF2\u7ECF\u521D\u59CB\u5316"); return true; } if (!this.isWeixinBrowser()) { console.log("\u975E\u5FAE\u4FE1\u6D4F\u89C8\u5668\u73AF\u5883"); return false; } try { if (!signConfig.appId || !signConfig.timestamp || !signConfig.nonceStr || !signConfig.signature) { throw new Error("\u7B7E\u540D\u914D\u7F6E\u53C2\u6570\u4E0D\u5B8C\u6574"); } return new Promise((resolve) => { import_weixin_js_sdk.default.config({ debug: this.isDebug, // 使用实例的调试模式设置 appId: signConfig.appId, timestamp: parseInt(signConfig.timestamp, 10), nonceStr: signConfig.nonceStr, signature: signConfig.signature, jsApiList: [ "updateAppMessageShareData", "updateTimelineShareData", "onMenuShareTimeline", "onMenuShareAppMessage" ] }); import_weixin_js_sdk.default.ready(() => { console.log("\u5FAE\u4FE1JS-SDK\u521D\u59CB\u5316\u6210\u529F"); this.isInit = true; resolve(true); }); import_weixin_js_sdk.default.error((res) => { console.error("\u5FAE\u4FE1JS-SDK\u521D\u59CB\u5316\u5931\u8D25:", res); this.isInit = false; resolve(false); }); }); } catch (error) { console.error("\u521D\u59CB\u5316\u5931\u8D25:", error); this.isInit = false; return false; } } /** * 设置分享配置 * @param options 分享配置 * @returns 当前实例,支持链式调用 */ setShareOptions(options) { this.shareOptions = options; return this; } /** * 从API获取签名配置并初始化分享 * @param options 配置选项 * @returns Promise<WxShareUtil> */ async fetchSignConfigAndShare(options = {}) { try { if (!this.isWeixinBrowser()) { console.log("\u975E\u5FAE\u4FE1\u6D4F\u89C8\u5668\u73AF\u5883\uFF0C\u8DF3\u8FC7\u7B7E\u540D\u83B7\u53D6"); return this; } const currentUrl = this.getCurrentUrl(); const apiUrl = options.url || this.defaultApiUrl; let response; if (this.customFetch) { response = await this.customFetch(apiUrl); } else { const res = await fetch(apiUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ url: currentUrl }) }); response = await res.json(); } if (!response.data) { throw new Error("\u83B7\u53D6\u7B7E\u540D\u914D\u7F6E\u5931\u8D25: \u54CD\u5E94\u6570\u636E\u4E3A\u7A7A"); } this.signConfig = response.data; if (!this.shareOptions) { throw new Error("\u8BF7\u5148\u8BBE\u7F6E\u5206\u4EAB\u914D\u7F6E"); } const success = await this.share(this.signConfig, this.shareOptions); if (!success) { throw new Error("\u5FAE\u4FE1\u5206\u4EAB\u521D\u59CB\u5316\u5931\u8D25"); } return this; } catch (error) { console.error("\u5206\u4EAB\u8BBE\u7F6E\u5931\u8D25:", error); throw error; } } /** * 设置自定义的签名配置获取方法 * @param customFetch 自定义的fetch方法 * @returns 当前实例,支持链式调用 */ setCustomFetch(customFetch) { this.customFetch = customFetch; return this; } }; var createWxShare = () => WxShareUtil.getInstance(); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createWxShare }); //# sourceMappingURL=index.js.map