yoho-app.js 2.13 KB
/**
 * YOHO-SDK
 *
 * 与原生 APP 交互的代码
 * 所有函数要做降级处理
 * 假如不是 YOHO App,在浏览器实现对应的功能
 * 浏览器不支持的功能,给出提示,控制台不能报错,不影响后续代码执行
 *
 * 希望能与 微信 JS-SDK 一样方便
 */
const cookie = require('yoho-cookie');
const store = require('yoho-store');
const tip = require('common/tip');

/* 空方法 */
const emptyFn = () => {};

/* 提示信息 */
const tipInfo = '暂不支持,请在YOHO!BUY应用中打开';

const yoho = {
    /**
     * 判断是否是 APP
     */
    isApp: /yh_blk/i.test(navigator.userAgent || ''),
    isiOS: /\(i[^;]+;( U;)? CPU.+Mac OS X/i.test(navigator.userAgent || ''),
    isAndroid: /Android/i.test(navigator.userAgent || ''),

    /**
     * store
     */
    store: store,

    /**
     * APP 接口
     */
    interface: window.yohoInterface,

    /**
     * JS 与 APP 共享的对象
     */
    data: window.yohoInterfaceData,

    /**
     * 判断是否是 登录
     */
    isLogin() {
        return cookie.get('_YOHOUID');
    },

    ready(callback) {
        if (this.isApp) {
            document.addEventListener('deviceready', callback);
        } else {
            return callback();
        }
    },

    /**
     * 调用APP原生方法
     * @param method 方法名称
     * @param args 传递给 APP 的参数 {"index":tab_index}
     * @param success 调用成功的回调方法
     * @param fail 调用失败的回调方法
     */
    invokeMethod(method, args, success, fail) {
        if (this.isApp && this.interface) {
            this.interface.triggerEvent(success || emptyFn, fail || emptyFn, {
                method: method,
                arguments: args
            });
        } else {
            tip(tipInfo);
        }
    },

    /**
     * 原生调用 JS 方法
     * @param name 方法名
     * @param callback 回调
     */
    addNativeMethod(name, callback) {
        // 延迟 500ms 注入
        setTimeout(function() {
            if (this.interface) {
                this.interface[name] = callback;
            }
        }, 500);
    }
};

module.exports = yoho;