Refactor: refactor jsbridge lib makes it easily use

This commit is contained in:
jas0ncn 2018-09-02 16:22:39 +08:00
parent acaee8c63a
commit d64d1786e8

View File

@ -15,7 +15,7 @@
/** /**
* declare javascript bridge API * declare javascript bridge API
*/ */
export interface JsBridge { export interface JsBridgeAPI {
/** /**
* Register a javascript bridge event handle * Register a javascript bridge event handle
@ -41,7 +41,7 @@ declare global {
/** /**
* Global jsbridge instance * Global jsbridge instance
*/ */
WebViewJavascriptBridge?: JsBridge | null WebViewJavascriptBridge?: JsBridgeAPI | null
/** /**
* Global jsbridge init callback * Global jsbridge init callback
@ -52,12 +52,44 @@ declare global {
} }
/**
* Check if perched in ClashX Runtime
*/
export function isClashX () {
return navigator.userAgent === 'ClashX Runtime'
}
/**
* Closure save jsbridge instance
*/
export let jsBridge: JsBridge = null
/**
* JsBridge class
*/
export class JsBridge {
instance: JsBridgeAPI = null
constructor (callback = jsbridge => {}) {
if (window.WebViewJavascriptBridge) {
this.instance = window.WebViewJavascriptBridge
callback(this.instance)
}
// init jsbridge
this.initBridge(jsBridge => {
this.instance = jsBridge
callback(jsBridge)
})
}
/** /**
* setup a jsbridge before app render * setup a jsbridge before app render
* @param {Function} cb callback when jsbridge initialized * @param {Function} cb callback when jsbridge initialized
* @see https://github.com/marcuswestin/WebViewJavascriptBridge * @see https://github.com/marcuswestin/WebViewJavascriptBridge
*/ */
export function setupJsBridge (callback = jsBridge => {}) { private initBridge (callback) {
/** /**
* You need check if inClashX first * You need check if inClashX first
*/ */
@ -82,10 +114,12 @@ export function setupJsBridge (callback = jsBridge => {}) {
document.documentElement.appendChild(WVJBIframe) document.documentElement.appendChild(WVJBIframe)
setTimeout(() => document.documentElement.removeChild(WVJBIframe), 0) setTimeout(() => document.documentElement.removeChild(WVJBIframe), 0)
} }
}
/**
* Check if perched in ClashX Runtime export function setupJsBridge (callback) {
*/ if (jsBridge) {
export function isClashX () { return callback(jsBridge)
return navigator.userAgent === 'ClashX Runtime' }
jsBridge = new JsBridge(callback)
} }