mtl-js-sdk
Version:
ynf-fw-mtl-api
158 lines (150 loc) • 6.01 kB
JavaScript
/*
* @Author: liucongw
* @Date: 2023-12-13 09:44:26
* @LastEditors: wangyingliang wangyingliang@yonyou.com
* @LastEditTime: 2024-10-31 09:42:58
* @FilePath: /mtl-api-project/src/platforms/dingtalk/platform.js
* @Description: 钉钉平台入口
*/
import methods from './methods.js'
import builder from '../../common/builder'
import proxy from './dd.proxy.js'
let isReady = false
let callbacks = []
const SUCCESS_CODE = 200
const FAIL_CODE = -1004
const { configPermission } = proxy
function recurseDelegate(module) {
let delegate = {}
for (const key in module) {
if (Object.prototype.hasOwnProperty.call(module, key)) {
const element = module[key]
if (typeof element === "function") {
delegate[key] = (...args) => {
console.log("exec api method :", key)
console.log("exec api args :", args)
if (isReady) {
// 统计函数
if (window?.AnalysysAgent) {
const obj = {
"service_code": window.location.origin + window.location?.pathname,
"fun_name": key,
"useragent_name": window.navigator.userAgent,
"origin_name": window.location.origin,
"version_name": window?.mtl?.version,
"platform_name": window?.mtl?.platform,
}
console.log("mtl AnalysysAgent obj: ", obj);
window?.AnalysysAgent?.track("function_call", obj);
}
builder.assignGetter(window.mtl, key, element)
element(...args)
} else {
callbacks.push(() => {
// 统计函数
if (window?.AnalysysAgent) {
const obj = {
"service_code": window.location.origin + window.location?.pathname,
"fun_name": key,
"useragent_name": window.navigator.userAgent,
"origin_name": window.location.origin,
"version_name": window?.mtl?.version,
"platform_name": window?.mtl?.platform,
}
console.log("mtl AnalysysAgent obj: ", obj);
window?.AnalysysAgent?.track("function_call", obj);
}
builder.assignGetter(window.mtl, key, element)
element(...args)
})
}
}
} else if (typeof element === "object") {
delegate[key] = recurseDelegate(element)
} else {
delegate[key] = element
}
}
}
return delegate
}
/**
* @description: 钉钉平台 JSSDK 鉴权入口
* @param {String} authSdkUrl JSSDK url
* @param {String} url - getTicket 接口地址
* @param {String} pageUrl - 待授权网页 url
* @param {String} agentId - 企业内部应用 AgentId 必传
* @param {String} corpId - 企业 ID 必传
* @param {String} appId - 企业内部应用的 Client ID 必传
* @param {String} secret - 企业内部应用的 Client Secret 必传
* @param {String []} apiList - 待授权 api 列表
* @param {Function} success 成功回调
* @param {Function} fail 失败回调
* @param {Function} complete 完成回调
* @param {Boolean} onlyLoadJS 仅加载 JSSDK 无需授权
*/
function initConfig(params) {
let jsSdkPath = params?.jsSdkPath || params?.authSdkUrl || "https://g.alicdn.com/dingding/dingtalk-jsapi/3.0.25/dingtalk.open.js"
loadScript(jsSdkPath, function (res) {
configPermission({
...params,
success: (res) => {
console.log("dingtalk authorization successful")
const backRes = {
code: SUCCESS_CODE,
data: res,
}
params?.success && params?.success(res)
params?.complete && params?.complete(backRes)
},
fail: (err) => {
let newErr = err || {}
console.log("dingtalk authorization fail:" + JSON.stringify(newErr))
const res = {
code: FAIL_CODE,
message: "dingtalk authorization fail",
...newErr,
}
params?.fail && params?.fail(err)
params?.complete && params?.complete(res)
},
})
}, function (err) {
console.log("dingtalk-jsapi load fail")
}
)
}
/**
* @description: 加载远程js文件
* @param {String} url 远程地址
* @param {Function} callback 加载成功的回调函数
* @param {Function} errorCallback 加载失败的回调函数
*/
function loadScript(url = "", callback = "", errorCallback = "", defer) {
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)
}
}
const platform = {
id: "dingtalk",
bootstrap(onready) {
isReady = true
callbacks.forEach((cb) => cb())
callbacks = null
// 自动鉴权逻辑, 全部走缓存或URL数据
initConfig()
onready()
},
}
platform.exports = { ...recurseDelegate(methods), initConfig }
export default platform