From dc94341324bd0c9dc95f57ec5136c6683034b501 Mon Sep 17 00:00:00 2001 From: 13121765685 Date: Fri, 9 Jan 2026 13:44:05 +0800 Subject: [PATCH] 22 --- package-lock.json | 4 +- packages/utils/src/utils/wechaBus.js | 409 +++++++++++++++++++++++++++ 2 files changed, 412 insertions(+), 1 deletion(-) create mode 100644 packages/utils/src/utils/wechaBus.js diff --git a/package-lock.json b/package-lock.json index dc1e8cc..f2c252e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,9 @@ "prettier": "^3.0.0", "rimraf": "^5.0.0", "turbo": "^1.10.0", - "vite": "^7.2.2" + "vite": "^7.2.2", + "@element-plus/icons-vue": "^2.3.2", + "element-plus": "^2.11.7" }, "engines": { "node": ">=16.0.0", diff --git a/packages/utils/src/utils/wechaBus.js b/packages/utils/src/utils/wechaBus.js new file mode 100644 index 0000000..0dd8da7 --- /dev/null +++ b/packages/utils/src/utils/wechaBus.js @@ -0,0 +1,409 @@ +const wx = window.wx || window.jWeixin + +class WechatBus { + constructor() { + this.isReady = false + this.messageHandlers = new Map() + this.eventListeners = new Map() + this.init() + } + + init() { + if (wx) { + this.isReady = true + console.log('WechatBus initialized successfully') + } else { + console.warn('Wechat JSSDK not loaded') + } + } + + checkReady() { + if (!this.isReady) { + throw new Error('Wechat JSSDK is not ready') + } + } + + config(config) { + this.checkReady() + return new Promise((resolve, reject) => { + wx.config({ + debug: config.debug || false, + appId: config.appId, + timestamp: config.timestamp, + nonceStr: config.nonceStr, + signature: config.signature, + jsApiList: config.jsApiList || [] + }) + + wx.ready(() => { + this.isReady = true + console.log('Wechat JSSDK config ready') + resolve(true) + }) + + wx.error((res) => { + console.error('Wechat JSSDK config error:', res) + reject(res) + }) + }) + } + + postMessage(data) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.postMessage({ + data + }) + resolve(true) + } catch (error) { + console.error('Post message error:', error) + reject(error) + } + }) + } + + navigateTo(url) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.navigateTo({ + url, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + } catch (error) { + console.error('Navigate to error:', error) + reject(error) + } + }) + } + + navigateBack(delta = 1) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.navigateBack({ + delta, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + } catch (error) { + console.error('Navigate back error:', error) + reject(error) + } + }) + } + + redirectTo(url) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.redirectTo({ + url, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + } catch (error) { + console.error('Redirect to error:', error) + reject(error) + } + }) + } + + switchTab(url) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.switchTab({ + url, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + } catch (error) { + console.error('Switch tab error:', error) + reject(error) + } + }) + } + + reLaunch(url) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.reLaunch({ + url, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + } catch (error) { + console.error('ReLaunch error:', error) + reject(error) + } + }) + } + + getEnv() { + this.checkReady() + return wx.miniProgram.getEnv() + } + + getAccountInfoSync() { + this.checkReady() + return wx.getAccountInfoSync() + } + + on(event, handler) { + if (!this.eventListeners.has(event)) { + this.eventListeners.set(event, new Set()) + } + this.eventListeners.get(event).add(handler) + } + + off(event, handler) { + if (this.eventListeners.has(event)) { + if (handler) { + this.eventListeners.get(event).delete(handler) + } else { + this.eventListeners.delete(event) + } + } + } + + emit(event, data) { + if (this.eventListeners.has(event)) { + this.eventListeners.get(event).forEach(handler => { + try { + handler(data) + } catch (error) { + console.error(`Event handler error for ${event}:`, error) + } + }) + } + } + + setStorageSync(key, data) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.setStorageSync({ + key, + data + }) + resolve(true) + } catch (error) { + console.error('Set storage error:', error) + reject(error) + } + }) + } + + getStorageSync(key) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + const data = wx.miniProgram.getStorageSync({ + key + }) + resolve(data) + } catch (error) { + console.error('Get storage error:', error) + reject(error) + } + }) + } + + removeStorageSync(key) { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.removeStorageSync({ + key + }) + resolve(true) + } catch (error) { + console.error('Remove storage error:', error) + reject(error) + } + }) + } + + clearStorageSync() { + this.checkReady() + return new Promise((resolve, reject) => { + try { + wx.miniProgram.clearStorageSync() + resolve(true) + } catch (error) { + console.error('Clear storage error:', error) + reject(error) + } + }) + } + + chooseImage(options = {}) { + this.checkReady() + return new Promise((resolve, reject) => { + const defaultOptions = { + count: 1, + sizeType: ['original', 'compressed'], + sourceType: ['album', 'camera'], + ...options + } + + wx.chooseImage({ + ...defaultOptions, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + previewImage(options) { + this.checkReady() + return new Promise((resolve, reject) => { + wx.previewImage({ + ...options, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + uploadImage(localId, isShowProgressTips = 1) { + this.checkReady() + return new Promise((resolve, reject) => { + wx.uploadImage({ + localId, + isShowProgressTips, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + getLocation(options = {}) { + this.checkReady() + return new Promise((resolve, reject) => { + const defaultOptions = { + type: 'wgs84', + ...options + } + + wx.getLocation({ + ...defaultOptions, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + openLocation(options) { + this.checkReady() + return new Promise((resolve, reject) => { + wx.openLocation({ + ...options, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + scanQRCode(options = {}) { + this.checkReady() + return new Promise((resolve, reject) => { + const defaultOptions = { + needResult: 1, + scanType: ['qrCode', 'barCode'], + ...options + } + + wx.scanQRCode({ + ...defaultOptions, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + chooseWXPay(options) { + this.checkReady() + return new Promise((resolve, reject) => { + wx.chooseWXPay({ + ...options, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + onMenuShareAppMessage(options) { + this.checkReady() + wx.onMenuShareAppMessage({ + ...options + }) + } + + onMenuShareTimeline(options) { + this.checkReady() + wx.onMenuShareTimeline({ + ...options + }) + } + + updateAppMessageShareData(options) { + this.checkReady() + return new Promise((resolve, reject) => { + wx.updateAppMessageShareData({ + ...options, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + updateTimelineShareData(options) { + this.checkReady() + return new Promise((resolve, reject) => { + wx.updateTimelineShareData({ + ...options, + success: (res) => resolve(res), + fail: (error) => reject(error) + }) + }) + } + + closeWindow() { + this.checkReady() + wx.closeWindow() + } + + hideMenuItems(menuList = []) { + this.checkReady() + wx.hideMenuItems({ + menuList + }) + } + + showMenuItems(menuList = []) { + this.checkReady() + wx.showMenuItems({ + menuList + }) + } + + hideAllNonBaseMenuItem() { + this.checkReady() + wx.hideAllNonBaseMenuItem() + } + + showAllNonBaseMenuItem() { + this.checkReady() + wx.showAllNonBaseMenuItem() + } +} + +const wechatBus = new WechatBus() + +export default wechatBus +export { WechatBus }