@tsdanci/wx-share
Version:
WeChat Share SDK utility for web applications
271 lines (269 loc) • 9.22 kB
JavaScript
;
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