UNPKG

mtl-js-sdk

Version:

ynf-fw-mtl-api

451 lines (430 loc) 18.9 kB
/* * @Author: wangyingliang@yonyou.com * @Date: 2024-10-31 09:34:14 * @LastEditors: wangyingliang wangyingliang@yonyou.com * @LastEditTime: 2025-05-30 15:43:10 * @FilePath: /mtl-api-project/src/platforms/wx/platform.js * @Description: 微信 || 企微函入口文件 * Copyright (c) 2024 by Yonyou, All Rights Reserved. */ import proxy from './wx.proxy' import methods from './methods' import builder from '../../common/builder' import unique from '../../common/unique.js' import h5 from '../h5/methods' const SUCCESS_CODE = 200 const FAIL_CODE = 1 const { configPermission, generateFunc } = proxy const wx_apilist = { base: [ "startRecord", "stopRecord", "onVoiceRecordEnd", "playVoice", "pauseVoice", "stopVoice", "onVoicePlayEnd", "uploadVoice", "downloadVoice", "chooseImage", "previewImage", "uploadImage", "downloadImage", "getLocalImgData", "translateVoice", "getNetworkType", "openLocation", "scanQRCode", "onHistoryBack", ], miniProgram: ["navigateBack", "navigateTo", "redirectTo", "switchTab", "reLaunch", "postMessage", "getEnv"], } let platform = { id: "wx", bootstrap(onready) { onready() initWxConfig() }, } function generateWxFunc(params) { let methods = {} wx_apilist.base.forEach((name) => { let fn = generateFunc(name) const originFn = fn switch (name) { case "previewImage": fn = (object) => { const { urls } = object if (!(urls && urls.length > 0)) { const result = { code: FAIL_CODE, message: "urls is null" } object?.fail && object?.fail(result) object?.complete && object?.complete(result) return } originFn(object) } break case "scanQRCode": fn = (object) => { const originSuccess = object?.success const originComplete = object?.complete const success = originSuccess && ((result) => { let { resultStr } = result // resultStr = resultStr && resultStr.split(",").pop(); originSuccess({ resultStr }) }) // const complete = // originComplete && // ((result) => { // if (result.code === SUCCESS_CODE) { // let { resultStr } = result // // resultStr = resultStr && resultStr.split(",").pop(); // result.data = { resultStr } // } // originComplete(result) // }) originFn({ ...object, success: success }) } break case "chooseImage": fn = (object) => { const originSuccess = object?.success const originComplete = object?.complete var watermark = object?.watermark var returnThumbnail = object?.returnThumbnail || false const success = originSuccess && ((result) => { console.log("chosseImage success, ", result) let { localIds } = result if (localIds instanceof Array && localIds.length > 0) { let localData = localIds if (localData.indexOf("\n") != -1 || localData.indexOf("\r") != -1 || localData.indexOf(" ") != -1) { // 包含\n,可以直接替换, 解决android机器base64编码后带有\n问题 localData = localData.replace(/(\r\n)|(\n)|(\s)/g, "") } if (!!!watermark && !returnThumbnail) { originSuccess(result) } else { unique.selectedImages({ ...object, localData, originLOcalIds: localData }) } } }) const complete = originComplete && ((result) => { if (result.code === SUCCESS_CODE) { let { localIds } = result.data if (!(localIds instanceof Array && localIds.length > 0)) { return } } let localData = localIds if (localData.indexOf("\n") != -1 || localData.indexOf("\r") != -1 || localData.indexOf(" ") != -1) { // 包含\n,可以直接替换, 解决android机器base64编码后带有\n问题 localData = localData.replace(/(\r\n)|(\n)|(\s)/g, "") } result.data = localData if (!!!watermark && !returnThumbnail) { originComplete(result) } }) originFn({ ...object, success: success, complete: complete }) } break case "getLocalImgData": fn = (object) => { const originSuccess = object?.success const originComplete = object?.complete const localId = object?.localId if (localId.startsWith("wxLocalResource://") || localId.startsWith("weixin://") || localId.startsWith("img://")) { const success = originSuccess && ((result) => { let { localData } = result if (localData.indexOf("\n") != -1 || localData.indexOf("\r") != -1 || localData.indexOf(" ") != -1) { // 包含\n,可以直接替换, 解决android机器base64编码后带有\n问题 localData = localData.replace(/(\r\n)|(\n)|(\s)/g, "") } if (localData.indexOf("data:image") === -1) { localData = "data:image/png;base64," + localData } originSuccess({ localData }) }) const complete = originComplete && ((result) => { if (result.code === SUCCESS_CODE) { let { localData } = result.data if (localData.indexOf("\n") != -1 || localData.indexOf("\r") != -1 || localData.indexOf(" ") != -1) { // 包含\n,可以直接替换, 解决android机器base64编码后带有\n问题 localData = localData.replace(/(\r\n)|(\n)|(\s)/g, "") } if (localData.indexOf("data:image") === -1) { localData = "data:image/png;base64," + localData } result.data = { localData } } originComplete(result) }) originFn({ ...object, success: success, complete: complete }) } else { let localData = localId if (localData.indexOf("\n") != -1 || localData.indexOf("\r") != -1 || localData.indexOf(" ") != -1) { // 包含\n,可以直接替换, 解决android机器base64编码后带有\n问题 localData = localData.replace(/(\r\n)|(\n)|(\s)/g, "") } originSuccess({ localData: localData }) originComplete({ code: SUCCESS_CODE, data: { localData: localData } }) } } break case "onHistoryBack": fn = (object) => { if (!object?.callback || typeof object?.callback !== "function") { const result = { code: FAIL_CODE, message: "callback function is null" } object?.fail && object?.fail(result) object?.complete && object?.complete(result) return } if (window?.wx?.onHistoryBack) { window?.wx?.onHistoryBack(object.callback) object?.success && object?.success({ code: SUCCESS_CODE, message: "onInterceptBack ok" }) object?.complete && object?.complete({ code: SUCCESS_CODE, message: "onInterceptBack ok" }) } else { object?.fail && object?.fail({ code: FAIL_CODE, message: "The current platform doesn't support" }) object?.complete && object?.complete({ code: FAIL_CODE, message: "The current platform doesn't support" }) } } break default: break } methods[name] = (object) => { // originFunc(...args) builder.assignGetter(window.mtl, name, fn) fn(object) } }) wx_apilist.miniProgram.forEach((name) => { let fn = generateFunc(name) let pageProcess = ["navigateBack", "navigateTo", "redirectTo", "reLaunch"] const originFn = fn let userAgent = window.navigator.userAgent if (userAgent.indexOf("wxwork") !== -1 && pageProcess.includes(name)) { console.log("wxwork change") switch (name) { case "navigateTo": fn = (object) => { const { url } = object if (unique.isEmpty("url", url, object)) { return } window.location.href = url object?.success && object?.success({}) object?.complete && object?.complete({}) } break case "navigateBack": fn = (object) => { if (window.history.length > 1) { window.history.back() } else { window.close() } object?.success && object?.success({}) object?.complete && object?.complete({}) } break case "redirectTo": fn = (object) => { const { url } = object if (unique.isEmpty("url", url, object)) { return } window.location.replace(url) object?.success && object?.success({}) object?.complete && object?.complete({}) } break case "reLaunch": fn = (object) => { const { url } = object if (unique.isEmpty("url", url, object)) { return } window.history.go(1 - history.length) window.history.replaceState({}, null, url) object?.success && object?.success({}) object?.complete && object?.complete({}) } break default: break } } else { switch (name) { case "navigateTo": fn = (object) => { const { url } = object if (unique.isEmpty("url", url, object)) { return } if (url.indexOf("pages/") !== -1) { // 包含 pages/ 走原生 originFn(object) } else { window.location.href = url object?.success && object?.success({}) object?.complete && object?.complete({}) } } break case "navigateBack": fn = (object) => { let h5Back = object?.h5Back if (h5Back) { window.history.back() object?.success && object?.success({}) object?.complete && object?.complete({}) } else { originFn(object) } } break case "redirectTo": fn = (object) => { const { url } = object if (unique.isEmpty("url", url, object)) { return } if (url.indexOf("pages/") !== -1) { // 包含 pages/ 走原生 originFn(object) } else { window.location.replace(url) object?.success && object?.success({}) object?.complete && object?.complete({}) } } break case "reLaunch": fn = (object) => { const { url } = object if (unique.isEmpty("url", url, object)) { return } if (url.indexOf("pages/") !== -1) { // 包含 pages/ 走原生 originFn(object) } else { window.history.go(1 - history.length) window.history.replaceState({}, null, url) object?.success && object?.success({}) object?.complete && object?.complete({}) } } break case "getEnv": fn = (object = {}) => { const { callback } = object // 判空 if (unique.isEmpty("callback", callback, object)) { return } if (window?.wx?.miniProgram && window?.wx?.miniProgram?.getEnv) { // 是否加载微信 jssdk window?.wx?.miniProgram?.getEnv(callback) object?.success && object?.success({ code: SUCCESS_CODE, message: "getEnv success", }) } else { object?.fail && object?.fail({ code: FAIL_CODE, message: "getEnv fail", }) } } break default: break } } methods[name] = fn }) // 替换到MTLObject.keys(methods).forEach(funcName => { if (funcName == 'chooseImage') { mtl["chooseImages"] = h5.chooseImages } mtl[funcName] = methods[funcName] }); } function initConfig(object) { initWxConfig(object) } function initWxConfig(object) { let apiList = object?.apiList || wx_apilist.base let authSdkUrl = object?.authSdkUrl || "https://res.wx.qq.com/open/js/jweixin-1.6.0.js" loadScript(authSdkUrl, function (res) { generateWxFunc() configPermission({ ...object, apiList, success: function (res) { console.log("wx authorization success") const backRes = { code: SUCCESS_CODE, data: res, } object?.success && object?.success(res) object?.complete && object?.complete(backRes) }, fail: function (err) { let newErr = err || {} console.log("wx authorization fail:" + JSON.stringify(err)) const res = { code: FAIL_CODE, message: "wx authorization fail", ...newErr, } object?.fail && object?.fail(err) object?.complete && object?.complete(res) } }) }, function (err) { console.log("wx-sdk load fail") }) } /** * @description: 加载远程js文件 * @param {String} url 远程地址 * @param {Function} callback 加载成功的回调函数 * @param {Function} errorCallback 加载失败的回调函数 */ function loadScript(url = "", callback = "", errorCallback = "", defer) { if (window?.wx) { callback && callback() return } if (url) { let script = document.createElement("script") script.type = "text/javascript" script.src = url script.onload = function (e) { callback && callback() } script.defer = defer script.onerror = function () { errorCallback && errorCallback() } window.document.head.appendChild(script) } } platform.exports = { ...methods, initWxConfig, initConfig, generateWxFunc } export default platform