import cookies from 'js-cookie'; import { COOKIE_ROOT_DOMAIN, COOKIE_APP_KEY, COOKIE_ACCESS_TOKEN_KEY, MSG_REQUIRE_LOGIN } from './constant'; const parseJWT = (token) => { const payloadStr = token.split('.')[1]; if (!payloadStr) { return null; } try { return JSON.parse(atob(payloadStr)); } catch (e) { // tslint:disable-next-line console.error('[parseJWT]', e); } return null; }; class ProginnBridge { constructor(opts) { // @ts-ignore this.root = window.app_event; this.isAndroid = /Android/.test(window.navigator.userAgent); const { notifier } = opts || {}; this.notifier = notifier; } get cookie() { return cookies.get(); } get isInApp() { // @ts-ignore return !!(cookies.get(COOKIE_APP_KEY) || this.root || window.appBridge); } get isLogined() { return !!cookies.get(COOKIE_ACCESS_TOKEN_KEY); } get uid() { const token = cookies.get(COOKIE_ACCESS_TOKEN_KEY); const payload = token && parseJWT(token); return payload === null || payload === void 0 ? void 0 : payload.uid; } inject(name, cb, root = 'Proginn') { window[root] = window[root] || {}; window[root][name] = cb; } syncCookies() { const app = cookies.get(COOKIE_APP_KEY); const token = cookies.get(COOKIE_ACCESS_TOKEN_KEY); const opts = { domain: COOKIE_ROOT_DOMAIN, expires: 7200 }; if (app) { cookies.set(COOKIE_APP_KEY, app, opts); } if (token) { cookies.set(COOKIE_ACCESS_TOKEN_KEY, token, opts); } } invoke(fn, payload) { if (!this.root) { // tslint:disable-next-line console.warn(`Bridge invoke ${fn} skipped.`); return; } if (this.isAndroid) { return this.root[fn] && this.root[fn](payload); } else { return this.root(fn, payload); } } back() { if (!this.isInApp) { window.history.back(); } else { this.invoke('back_page'); } } load(url) { window.location.href = url; } login() { if (!this.isInApp) { return; } this.load('proginn://login?backToPage=true'); } checkLogin(force = false) { if (force || !this.isLogined) { this.notifier && this.notifier(MSG_REQUIRE_LOGIN, -99); this.login(); return false; } return true; } userLoad(userInfo) { this.invoke('user_load', this.isAndroid ? userInfo : { userInfo }); } topicLoad(id, data) { this.invoke('topic_load', this.isAndroid ? id : data); } setNavigationBarTitle(title) { this.invoke('setNavigationBarTitle', title); } } export default ProginnBridge;