index.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import cookies from 'js-cookie';
  2. import { COOKIE_ROOT_DOMAIN, COOKIE_APP_KEY, COOKIE_ACCESS_TOKEN_KEY, MSG_REQUIRE_LOGIN } from './constant';
  3. const parseJWT = (token) => {
  4. const payloadStr = token.split('.')[1];
  5. if (!payloadStr) {
  6. return null;
  7. }
  8. try {
  9. return JSON.parse(atob(payloadStr));
  10. }
  11. catch (e) {
  12. // tslint:disable-next-line
  13. console.error('[parseJWT]', e);
  14. }
  15. return null;
  16. };
  17. class ProginnBridge {
  18. constructor(opts) {
  19. // @ts-ignore
  20. this.root = window.app_event;
  21. this.isAndroid = /Android/.test(window.navigator.userAgent);
  22. const { notifier } = opts || {};
  23. this.notifier = notifier;
  24. }
  25. get cookie() {
  26. return cookies.get();
  27. }
  28. get isInApp() {
  29. // @ts-ignore
  30. return !!(cookies.get(COOKIE_APP_KEY) || this.root || window.appBridge);
  31. }
  32. get isLogined() {
  33. return !!cookies.get(COOKIE_ACCESS_TOKEN_KEY);
  34. }
  35. get uid() {
  36. const token = cookies.get(COOKIE_ACCESS_TOKEN_KEY);
  37. const payload = token && parseJWT(token);
  38. return payload === null || payload === void 0 ? void 0 : payload.uid;
  39. }
  40. inject(name, cb, root = 'Proginn') {
  41. window[root] = window[root] || {};
  42. window[root][name] = cb;
  43. }
  44. syncCookies() {
  45. const app = cookies.get(COOKIE_APP_KEY);
  46. const token = cookies.get(COOKIE_ACCESS_TOKEN_KEY);
  47. const opts = {
  48. domain: COOKIE_ROOT_DOMAIN,
  49. expires: 7200
  50. };
  51. if (app) {
  52. cookies.set(COOKIE_APP_KEY, app, opts);
  53. }
  54. if (token) {
  55. cookies.set(COOKIE_ACCESS_TOKEN_KEY, token, opts);
  56. }
  57. }
  58. invoke(fn, payload) {
  59. if (!this.root) {
  60. // tslint:disable-next-line
  61. console.warn(`Bridge invoke ${fn} skipped.`);
  62. return;
  63. }
  64. if (this.isAndroid) {
  65. return this.root[fn] && this.root[fn](payload);
  66. }
  67. else {
  68. return this.root(fn, payload);
  69. }
  70. }
  71. back() {
  72. if (!this.isInApp) {
  73. window.history.back();
  74. }
  75. else {
  76. this.invoke('back_page');
  77. }
  78. }
  79. load(url) {
  80. window.location.href = url;
  81. }
  82. login() {
  83. if (!this.isInApp) {
  84. return;
  85. }
  86. this.load('proginn://login?backToPage=true');
  87. }
  88. checkLogin(force = false) {
  89. if (force || !this.isLogined) {
  90. this.notifier && this.notifier(MSG_REQUIRE_LOGIN);
  91. this.login();
  92. return false;
  93. }
  94. return true;
  95. }
  96. userLoad(userInfo) {
  97. this.invoke('user_load', this.isAndroid ? userInfo : {
  98. userInfo
  99. });
  100. }
  101. topicLoad(id, data) {
  102. this.invoke('topic_load', this.isAndroid ? id : data);
  103. }
  104. setNavigationBarTitle(title) {
  105. this.invoke('setNavigationBarTitle', title);
  106. }
  107. }
  108. export default ProginnBridge;