mtl-js-sdk
Version:
ynf-fw-mtl-api
451 lines (430 loc) • 18.9 kB
JavaScript
/*
* @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
})
// 替换到MTL上
Object.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