para-bridge-demo
Version:
a bridge api for js-ios/andriod rest
70 lines (64 loc) • 2.81 kB
text/typescript
import { INtvCallbackResult } from '../types/INtvDtoProtocol';
import { isArray, get, parse, deepParseJson, stringify } from 'para-utils';
import { hasQueryString, getQueryString, modifyQueryString } from 'para-utils';
import { INtvCallbackParam, INtvInvokeParam, IUrlNtvThird } from '../types/INtvDtoProtocol';
/**
* NTV URL封装判断是否存在(ntv_third)参数
* @param url 待拼接的URL地址可选,如果没有则使用当前H5地址
* @returns boolean true:存在, false:不存在
*/
export const hasUrlNtvThird = (url?: string) => {
return hasQueryString('ntv_third', url);
};
/**
* NTV URL封装获取参数对象的值: (ntv_third)参数
* @param url 待拼接的URL地址可选,如果没有则使用当前H5地址
* @returns object as IUrlNtvThird
*/
export const getUrlNtvThird = (url?: string) => {
return parse(getQueryString('ntv_third', url) || {}) as IUrlNtvThird;
};
/**
* NTV URL封装设置参数对象的值: (ntv_third)参数
* @param url 待拼接的URL地址
* @param ntvThird 待拼接URL的NTV参数对象
* @returns string 拼接好的URL
*/
export const setUrlNtvThird = (url: string, ntvThird: IUrlNtvThird) => {
return modifyQueryString(url, {
ntv_third: stringify({ cbPluginName: ntvThird.cbPluginName, cbData: ntvThird.cbData } as IUrlNtvThird),
});
};
/**
* 解析从native端获取的字符串
* @returns result
* @returns {String} tagName 标识字符串,如标识用户点击事件:'click_navbar_left'
* @returns {Object} cbData 数据字符串CBData的结果,解析方法:deepParse(CBData),需注意parse可能导致的报错
*/
export function parseCallBackDataFromNative<K>(args?: string | string[]): INtvCallbackResult<K> {
const result: INtvCallbackResult<K> = { tagName: '', cbData: {} as K };
const arg: string = isArray(args) ? (args as any[])[0] : args;
if (arg) {
console.log('parseCallBackDataFromNative args: ', arg);
const parseCallBackDataResult = parse(decodeURIComponent(arg)) as INtvCallbackParam;
console.log('parsedNativeCallbackResult:', parseCallBackDataResult);
result.tagName = get(parseCallBackDataResult, 'param.tagName', '');
result.cbData = deepParseJson(get(parseCallBackDataResult, 'param.CBData', JSON.stringify({})) || {});
}
return result;
}
/**
* 拼接native端bridge方法的JSON字符串参数
* @param param bridge 调用的方法的参数对象
* @param pluginName 可选参数 回调h5方法名 window.pluginName()
*/
export function buildBridgeParameter(param?: any, pluginName?: string) {
const ntvParam: INtvInvokeParam = {
// ios 解析null时会报错,所以这里默认为空对象
param: param || {}
};
if (pluginName) {
ntvParam.CBPluginName = pluginName;
}
return encodeURIComponent(stringify(ntvParam));
}