|
@@ -0,0 +1,145 @@
|
|
|
+import cookies from 'js-cookie'
|
|
|
+import { COOKIE_ROOT_DOMAIN, COOKIE_APP_KEY, COOKIE_ACCESS_TOKEN_KEY, MSG_REQUIRE_LOGIN } from './constant'
|
|
|
+import { Notifier } from '../types/global'
|
|
|
+
|
|
|
+const parseJWT = (token: string): any => {
|
|
|
+ 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 {
|
|
|
+ // @ts-ignore
|
|
|
+ root = window.app_event
|
|
|
+ isAndroid = /Android/.test(window.navigator.userAgent)
|
|
|
+
|
|
|
+ private notifier?: Notifier
|
|
|
+
|
|
|
+ constructor(opts?: {
|
|
|
+ notifier?: Notifier
|
|
|
+ }) {
|
|
|
+ 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(): string | null {
|
|
|
+ const token = cookies.get(COOKIE_ACCESS_TOKEN_KEY)
|
|
|
+ const payload = token && parseJWT(token)
|
|
|
+
|
|
|
+ return payload?.uid
|
|
|
+ }
|
|
|
+
|
|
|
+ injectJSObject(name: string, cb: () => void) {
|
|
|
+ // @ts-ignore
|
|
|
+ window.Jishuin = window.Jishuin || {}
|
|
|
+ // @ts-ignore
|
|
|
+ window.Jishuin[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: string, payload?: any) {
|
|
|
+ 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: string) {
|
|
|
+ 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)
|
|
|
+ this.login()
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ userLoad(userInfo: any) {
|
|
|
+ this.invoke('user_load', this.isAndroid ? userInfo : {
|
|
|
+ userInfo
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ topicLoad(id: string, data: {
|
|
|
+ topic_id: string
|
|
|
+ user_id: string
|
|
|
+ share_content: any
|
|
|
+ topics: any[]
|
|
|
+ }) {
|
|
|
+ this.invoke('topic_load', this.isAndroid ? id : data)
|
|
|
+ }
|
|
|
+
|
|
|
+ setNavigationBarTitle(title: string) {
|
|
|
+ this.invoke('setNavigationBarTitle', title)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export default ProginnBridge
|