@sunggang/ui-lib 0.4.51 → 0.4.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -460,10 +460,13 @@ var LiffProvider = function(param) {
460
460
  var _useState2 = _sliced_to_array(React.useState(null), 2), liffError = _useState2[0], setLiffError = _useState2[1];
461
461
  var _useState3 = _sliced_to_array(React.useState(null), 2), loginData = _useState3[0], setLoginData = _useState3[1];
462
462
  var _useState4 = _sliced_to_array(React.useState(null), 2), userInfo = _useState4[0], setUserInfo = _useState4[1];
463
- var _useState5 = _sliced_to_array(React.useState(null), 2), isFriendship = _useState5[0], setFriendship = _useState5[1];
464
- var _useState6 = _sliced_to_array(React.useState(null), 2), loginType = _useState6[0], setLoginType = _useState6[1];
463
+ var _useState5 = _sliced_to_array(React.useState(null), 2), liffProfile = _useState5[0], setLiffProfile = _useState5[1];
464
+ var _useState6 = _sliced_to_array(React.useState(null), 2), isFriendship = _useState6[0], setFriendship = _useState6[1];
465
+ var _useState7 = _sliced_to_array(React.useState(null), 2), loginType = _useState7[0], setLoginType = _useState7[1];
465
466
  // userInfo 的 localStorage key
466
467
  var userInfoStorageKey = "".concat(localStorageKey, "-userInfo");
468
+ // liff profile 的 localStorage key
469
+ var liffUserInfoStorageKey = "".concat(localStorageKey, "-liffUserInfo");
467
470
  // 從 localStorage 載入 userInfo
468
471
  var loadUserInfoFromStorage = function() {
469
472
  try {
@@ -486,6 +489,55 @@ var LiffProvider = function(param) {
486
489
  console.error("儲存 userInfo 失敗:", err);
487
490
  }
488
491
  };
492
+ // 從 localStorage 載入 LIFF profile
493
+ var loadLiffUserInfoFromStorage = function() {
494
+ try {
495
+ var stored = window.localStorage.getItem(liffUserInfoStorageKey);
496
+ if (stored) {
497
+ var parsed = JSON.parse(stored);
498
+ setLiffProfile(parsed);
499
+ return parsed;
500
+ }
501
+ } catch (err) {
502
+ console.error("載入 liffUserInfo 失敗:", err);
503
+ }
504
+ return null;
505
+ };
506
+ // 儲存 LIFF profile 到 localStorage
507
+ var saveLiffUserInfoToStorage = function(info) {
508
+ try {
509
+ window.localStorage.setItem(liffUserInfoStorageKey, JSON.stringify(info));
510
+ } catch (err) {
511
+ console.error("儲存 liffUserInfo 失敗:", err);
512
+ }
513
+ };
514
+ // 移除 LIFF profile 的 localStorage
515
+ var removeLiffUserInfoFromStorage = function() {
516
+ try {
517
+ window.localStorage.removeItem(liffUserInfoStorageKey);
518
+ } catch (err) {
519
+ // ignore
520
+ }
521
+ };
522
+ // 移除 LIFF initialized flag
523
+ var removeLiffInitializedFromStorage = function() {
524
+ try {
525
+ window.localStorage.removeItem("".concat(localStorageKey, "-liffInitialized"));
526
+ } catch (err) {
527
+ // ignore
528
+ }
529
+ };
530
+ // 清除 LIFF 相關快取與狀態(暴露給外部 as needed)
531
+ var clearLiffData = function() {
532
+ try {
533
+ removeLiffUserInfoFromStorage();
534
+ removeLiffInitializedFromStorage();
535
+ } catch (e) {
536
+ // ignore
537
+ }
538
+ setLiffProfile(null);
539
+ setLiffObject(null);
540
+ };
489
541
  var fetchMemberInfo = function() {
490
542
  var _ref = _async_to_generator(function(token) {
491
543
  var response, err;
@@ -594,6 +646,12 @@ var LiffProvider = function(param) {
594
646
  // token 無效時清除 userInfo
595
647
  setUserInfo(null);
596
648
  window.localStorage.removeItem(userInfoStorageKey);
649
+ // 使用統一清理方法清除 LIFF 快取與初始化標記
650
+ try {
651
+ clearLiffData();
652
+ } catch (e) {
653
+ // ignore
654
+ }
597
655
  return [
598
656
  3,
599
657
  7
@@ -673,8 +731,14 @@ var LiffProvider = function(param) {
673
731
  6
674
732
  ];
675
733
  case 5:
734
+ // 登入沒有回傳 token,視為登入失敗 — 清除 LIFF 快取
676
735
  setUserInfo(response);
677
736
  saveUserInfoToStorage(response);
737
+ try {
738
+ clearLiffData();
739
+ } catch (e) {
740
+ // ignore
741
+ }
678
742
  if (handleLoginError) handleLoginError();
679
743
  _state.label = 6;
680
744
  case 6:
@@ -703,15 +767,15 @@ var LiffProvider = function(param) {
703
767
  // 初始化 LIFF
704
768
  var initializeLiff = function() {
705
769
  var _ref = _async_to_generator(function(isValid) {
706
- var customFetch, liff, originalFetch, lineToken, redirectUri, tempFriendship, friendship, friendFlag, error, err;
770
+ var customFetch, liff, originalFetch, storedProfileExists, profile, profileErr, lineToken, redirectUri, tempFriendship, friendship, friendFlag, error, err;
707
771
  return _ts_generator(this, function(_state) {
708
772
  switch(_state.label){
709
773
  case 0:
710
774
  _state.trys.push([
711
775
  0,
712
- 9,
776
+ 15,
713
777
  ,
714
- 10
778
+ 16
715
779
  ]);
716
780
  customFetch = // 自訂 fetch 函數,避免每次請求都改變 URL
717
781
  // eslint-disable-next-line no-inner-declarations
@@ -741,6 +805,54 @@ var LiffProvider = function(param) {
741
805
  _state.sent();
742
806
  console.log("LIFF init succeeded.");
743
807
  setLiffObject(liff);
808
+ // 如果 localStorage 或 state 已有 profile,就跳過重複呼叫
809
+ storedProfileExists = false;
810
+ try {
811
+ storedProfileExists = !!window.localStorage.getItem(liffUserInfoStorageKey);
812
+ } catch (e) {
813
+ storedProfileExists = false;
814
+ }
815
+ if (!(!storedProfileExists && !liffProfile)) return [
816
+ 3,
817
+ 7
818
+ ];
819
+ _state.label = 3;
820
+ case 3:
821
+ _state.trys.push([
822
+ 3,
823
+ 5,
824
+ ,
825
+ 6
826
+ ]);
827
+ return [
828
+ 4,
829
+ liff.getProfile()
830
+ ];
831
+ case 4:
832
+ profile = _state.sent();
833
+ setLiffProfile(profile);
834
+ saveLiffUserInfoToStorage(profile);
835
+ return [
836
+ 3,
837
+ 6
838
+ ];
839
+ case 5:
840
+ profileErr = _state.sent();
841
+ console.warn("取得 LIFF profile 失敗(非致命):", profileErr);
842
+ return [
843
+ 3,
844
+ 6
845
+ ];
846
+ case 6:
847
+ return [
848
+ 3,
849
+ 8
850
+ ];
851
+ case 7:
852
+ // 已有快取,跳過呼叫
853
+ console.log("跳過 liff.getProfile():已由 localStorage 或 state 取得 profile");
854
+ _state.label = 8;
855
+ case 8:
744
856
  lineToken = liff === null || liff === void 0 ? void 0 : liff.getAccessToken();
745
857
  // 未登入先進行登入
746
858
  if (!liff.isLoggedIn()) {
@@ -763,21 +875,21 @@ var LiffProvider = function(param) {
763
875
  tempFriendship = null;
764
876
  if (!lineToken) return [
765
877
  3,
766
- 8
878
+ 14
767
879
  ];
768
- _state.label = 3;
769
- case 3:
880
+ _state.label = 9;
881
+ case 9:
770
882
  _state.trys.push([
771
- 3,
772
- 5,
883
+ 9,
884
+ 11,
773
885
  ,
774
- 6
886
+ 12
775
887
  ]);
776
888
  return [
777
889
  4,
778
890
  liff.getFriendship()
779
891
  ];
780
- case 4:
892
+ case 10:
781
893
  friendship = _state.sent();
782
894
  friendFlag = friendship === null || friendship === void 0 ? void 0 : friendship.friendFlag;
783
895
  setFriendship(friendFlag);
@@ -785,16 +897,16 @@ var LiffProvider = function(param) {
785
897
  console.log("isFriendship", friendFlag);
786
898
  return [
787
899
  3,
788
- 6
900
+ 12
789
901
  ];
790
- case 5:
902
+ case 11:
791
903
  error = _state.sent();
792
904
  console.error("Error in liff.getFriendship():", error);
793
905
  return [
794
906
  3,
795
- 6
907
+ 12
796
908
  ];
797
- case 6:
909
+ case 12:
798
910
  console.log("isValid", isValid);
799
911
  if (tempFriendship && isValid) return [
800
912
  2
@@ -803,23 +915,23 @@ var LiffProvider = function(param) {
803
915
  4,
804
916
  loginInit(lineToken)
805
917
  ];
806
- case 7:
918
+ case 13:
807
919
  _state.sent();
808
- _state.label = 8;
809
- case 8:
920
+ _state.label = 14;
921
+ case 14:
810
922
  return [
811
923
  3,
812
- 10
924
+ 16
813
925
  ];
814
- case 9:
926
+ case 15:
815
927
  err = _state.sent();
816
928
  setLiffError(err.toString());
817
929
  console.log("LIFF init failed.", err);
818
930
  return [
819
931
  3,
820
- 10
932
+ 16
821
933
  ];
822
- case 10:
934
+ case 16:
823
935
  return [
824
936
  2
825
937
  ];
@@ -976,6 +1088,12 @@ var LiffProvider = function(param) {
976
1088
  setLoginType(null);
977
1089
  setUserInfo(null);
978
1090
  window.localStorage.removeItem(userInfoStorageKey);
1091
+ // 使用統一清理方法
1092
+ try {
1093
+ clearLiffData();
1094
+ } catch (e) {
1095
+ // ignore
1096
+ }
979
1097
  console.warn("LIFF token 驗證失敗,需重新登入", err);
980
1098
  return [
981
1099
  2,
@@ -996,9 +1114,10 @@ var LiffProvider = function(param) {
996
1114
  return trimmed.toLowerCase().startsWith("bearer ") ? trimmed : "Bearer ".concat(trimmed);
997
1115
  };
998
1116
  var searchParams = typeof window !== "undefined" ? new URLSearchParams(window.location.search) : null;
999
- // 初始載入時從 localStorage 載入 userInfo
1117
+ // 初始載入時從 localStorage 載入
1000
1118
  React.useEffect(function() {
1001
1119
  loadUserInfoFromStorage();
1120
+ loadLiffUserInfoFromStorage();
1002
1121
  }, []);
1003
1122
  // 客戶端初始化 LIFF
1004
1123
  React.useEffect(function() {
@@ -1083,13 +1202,12 @@ var LiffProvider = function(param) {
1083
1202
  userInfo: userInfo,
1084
1203
  accessToken: accessToken,
1085
1204
  liffError: liffError,
1086
- initializeLiff: function() {
1087
- return initializeLiff(false);
1088
- },
1089
1205
  isFriendship: isFriendship,
1090
1206
  ensureLiffTokenValid: ensureLiffTokenValid,
1091
1207
  accountLogin: accountLogin,
1092
- loginType: loginType
1208
+ loginType: loginType,
1209
+ liffProfile: liffProfile,
1210
+ clearLiffData: clearLiffData
1093
1211
  };
1094
1212
  }, [
1095
1213
  liffObject,
@@ -1100,7 +1218,9 @@ var LiffProvider = function(param) {
1100
1218
  isFriendship,
1101
1219
  ensureLiffTokenValid,
1102
1220
  accountLogin,
1103
- loginType
1221
+ loginType,
1222
+ liffProfile,
1223
+ clearLiffData
1104
1224
  ]);
1105
1225
  return /*#__PURE__*/ jsxRuntime.jsx(LiffContext.Provider, {
1106
1226
  value: contextValue,
@@ -456,10 +456,13 @@ var LiffProvider = function(param) {
456
456
  var _useState2 = _sliced_to_array(useState(null), 2), liffError = _useState2[0], setLiffError = _useState2[1];
457
457
  var _useState3 = _sliced_to_array(useState(null), 2), loginData = _useState3[0], setLoginData = _useState3[1];
458
458
  var _useState4 = _sliced_to_array(useState(null), 2), userInfo = _useState4[0], setUserInfo = _useState4[1];
459
- var _useState5 = _sliced_to_array(useState(null), 2), isFriendship = _useState5[0], setFriendship = _useState5[1];
460
- var _useState6 = _sliced_to_array(useState(null), 2), loginType = _useState6[0], setLoginType = _useState6[1];
459
+ var _useState5 = _sliced_to_array(useState(null), 2), liffProfile = _useState5[0], setLiffProfile = _useState5[1];
460
+ var _useState6 = _sliced_to_array(useState(null), 2), isFriendship = _useState6[0], setFriendship = _useState6[1];
461
+ var _useState7 = _sliced_to_array(useState(null), 2), loginType = _useState7[0], setLoginType = _useState7[1];
461
462
  // userInfo 的 localStorage key
462
463
  var userInfoStorageKey = "".concat(localStorageKey, "-userInfo");
464
+ // liff profile 的 localStorage key
465
+ var liffUserInfoStorageKey = "".concat(localStorageKey, "-liffUserInfo");
463
466
  // 從 localStorage 載入 userInfo
464
467
  var loadUserInfoFromStorage = function() {
465
468
  try {
@@ -482,6 +485,55 @@ var LiffProvider = function(param) {
482
485
  console.error("儲存 userInfo 失敗:", err);
483
486
  }
484
487
  };
488
+ // 從 localStorage 載入 LIFF profile
489
+ var loadLiffUserInfoFromStorage = function() {
490
+ try {
491
+ var stored = window.localStorage.getItem(liffUserInfoStorageKey);
492
+ if (stored) {
493
+ var parsed = JSON.parse(stored);
494
+ setLiffProfile(parsed);
495
+ return parsed;
496
+ }
497
+ } catch (err) {
498
+ console.error("載入 liffUserInfo 失敗:", err);
499
+ }
500
+ return null;
501
+ };
502
+ // 儲存 LIFF profile 到 localStorage
503
+ var saveLiffUserInfoToStorage = function(info) {
504
+ try {
505
+ window.localStorage.setItem(liffUserInfoStorageKey, JSON.stringify(info));
506
+ } catch (err) {
507
+ console.error("儲存 liffUserInfo 失敗:", err);
508
+ }
509
+ };
510
+ // 移除 LIFF profile 的 localStorage
511
+ var removeLiffUserInfoFromStorage = function() {
512
+ try {
513
+ window.localStorage.removeItem(liffUserInfoStorageKey);
514
+ } catch (err) {
515
+ // ignore
516
+ }
517
+ };
518
+ // 移除 LIFF initialized flag
519
+ var removeLiffInitializedFromStorage = function() {
520
+ try {
521
+ window.localStorage.removeItem("".concat(localStorageKey, "-liffInitialized"));
522
+ } catch (err) {
523
+ // ignore
524
+ }
525
+ };
526
+ // 清除 LIFF 相關快取與狀態(暴露給外部 as needed)
527
+ var clearLiffData = function() {
528
+ try {
529
+ removeLiffUserInfoFromStorage();
530
+ removeLiffInitializedFromStorage();
531
+ } catch (e) {
532
+ // ignore
533
+ }
534
+ setLiffProfile(null);
535
+ setLiffObject(null);
536
+ };
485
537
  var fetchMemberInfo = function() {
486
538
  var _ref = _async_to_generator(function(token) {
487
539
  var response, err;
@@ -590,6 +642,12 @@ var LiffProvider = function(param) {
590
642
  // token 無效時清除 userInfo
591
643
  setUserInfo(null);
592
644
  window.localStorage.removeItem(userInfoStorageKey);
645
+ // 使用統一清理方法清除 LIFF 快取與初始化標記
646
+ try {
647
+ clearLiffData();
648
+ } catch (e) {
649
+ // ignore
650
+ }
593
651
  return [
594
652
  3,
595
653
  7
@@ -669,8 +727,14 @@ var LiffProvider = function(param) {
669
727
  6
670
728
  ];
671
729
  case 5:
730
+ // 登入沒有回傳 token,視為登入失敗 — 清除 LIFF 快取
672
731
  setUserInfo(response);
673
732
  saveUserInfoToStorage(response);
733
+ try {
734
+ clearLiffData();
735
+ } catch (e) {
736
+ // ignore
737
+ }
674
738
  if (handleLoginError) handleLoginError();
675
739
  _state.label = 6;
676
740
  case 6:
@@ -699,15 +763,15 @@ var LiffProvider = function(param) {
699
763
  // 初始化 LIFF
700
764
  var initializeLiff = function() {
701
765
  var _ref = _async_to_generator(function(isValid) {
702
- var customFetch, liff, originalFetch, lineToken, redirectUri, tempFriendship, friendship, friendFlag, error, err;
766
+ var customFetch, liff, originalFetch, storedProfileExists, profile, profileErr, lineToken, redirectUri, tempFriendship, friendship, friendFlag, error, err;
703
767
  return _ts_generator(this, function(_state) {
704
768
  switch(_state.label){
705
769
  case 0:
706
770
  _state.trys.push([
707
771
  0,
708
- 9,
772
+ 15,
709
773
  ,
710
- 10
774
+ 16
711
775
  ]);
712
776
  customFetch = // 自訂 fetch 函數,避免每次請求都改變 URL
713
777
  // eslint-disable-next-line no-inner-declarations
@@ -737,6 +801,54 @@ var LiffProvider = function(param) {
737
801
  _state.sent();
738
802
  console.log("LIFF init succeeded.");
739
803
  setLiffObject(liff);
804
+ // 如果 localStorage 或 state 已有 profile,就跳過重複呼叫
805
+ storedProfileExists = false;
806
+ try {
807
+ storedProfileExists = !!window.localStorage.getItem(liffUserInfoStorageKey);
808
+ } catch (e) {
809
+ storedProfileExists = false;
810
+ }
811
+ if (!(!storedProfileExists && !liffProfile)) return [
812
+ 3,
813
+ 7
814
+ ];
815
+ _state.label = 3;
816
+ case 3:
817
+ _state.trys.push([
818
+ 3,
819
+ 5,
820
+ ,
821
+ 6
822
+ ]);
823
+ return [
824
+ 4,
825
+ liff.getProfile()
826
+ ];
827
+ case 4:
828
+ profile = _state.sent();
829
+ setLiffProfile(profile);
830
+ saveLiffUserInfoToStorage(profile);
831
+ return [
832
+ 3,
833
+ 6
834
+ ];
835
+ case 5:
836
+ profileErr = _state.sent();
837
+ console.warn("取得 LIFF profile 失敗(非致命):", profileErr);
838
+ return [
839
+ 3,
840
+ 6
841
+ ];
842
+ case 6:
843
+ return [
844
+ 3,
845
+ 8
846
+ ];
847
+ case 7:
848
+ // 已有快取,跳過呼叫
849
+ console.log("跳過 liff.getProfile():已由 localStorage 或 state 取得 profile");
850
+ _state.label = 8;
851
+ case 8:
740
852
  lineToken = liff === null || liff === void 0 ? void 0 : liff.getAccessToken();
741
853
  // 未登入先進行登入
742
854
  if (!liff.isLoggedIn()) {
@@ -759,21 +871,21 @@ var LiffProvider = function(param) {
759
871
  tempFriendship = null;
760
872
  if (!lineToken) return [
761
873
  3,
762
- 8
874
+ 14
763
875
  ];
764
- _state.label = 3;
765
- case 3:
876
+ _state.label = 9;
877
+ case 9:
766
878
  _state.trys.push([
767
- 3,
768
- 5,
879
+ 9,
880
+ 11,
769
881
  ,
770
- 6
882
+ 12
771
883
  ]);
772
884
  return [
773
885
  4,
774
886
  liff.getFriendship()
775
887
  ];
776
- case 4:
888
+ case 10:
777
889
  friendship = _state.sent();
778
890
  friendFlag = friendship === null || friendship === void 0 ? void 0 : friendship.friendFlag;
779
891
  setFriendship(friendFlag);
@@ -781,16 +893,16 @@ var LiffProvider = function(param) {
781
893
  console.log("isFriendship", friendFlag);
782
894
  return [
783
895
  3,
784
- 6
896
+ 12
785
897
  ];
786
- case 5:
898
+ case 11:
787
899
  error = _state.sent();
788
900
  console.error("Error in liff.getFriendship():", error);
789
901
  return [
790
902
  3,
791
- 6
903
+ 12
792
904
  ];
793
- case 6:
905
+ case 12:
794
906
  console.log("isValid", isValid);
795
907
  if (tempFriendship && isValid) return [
796
908
  2
@@ -799,23 +911,23 @@ var LiffProvider = function(param) {
799
911
  4,
800
912
  loginInit(lineToken)
801
913
  ];
802
- case 7:
914
+ case 13:
803
915
  _state.sent();
804
- _state.label = 8;
805
- case 8:
916
+ _state.label = 14;
917
+ case 14:
806
918
  return [
807
919
  3,
808
- 10
920
+ 16
809
921
  ];
810
- case 9:
922
+ case 15:
811
923
  err = _state.sent();
812
924
  setLiffError(err.toString());
813
925
  console.log("LIFF init failed.", err);
814
926
  return [
815
927
  3,
816
- 10
928
+ 16
817
929
  ];
818
- case 10:
930
+ case 16:
819
931
  return [
820
932
  2
821
933
  ];
@@ -972,6 +1084,12 @@ var LiffProvider = function(param) {
972
1084
  setLoginType(null);
973
1085
  setUserInfo(null);
974
1086
  window.localStorage.removeItem(userInfoStorageKey);
1087
+ // 使用統一清理方法
1088
+ try {
1089
+ clearLiffData();
1090
+ } catch (e) {
1091
+ // ignore
1092
+ }
975
1093
  console.warn("LIFF token 驗證失敗,需重新登入", err);
976
1094
  return [
977
1095
  2,
@@ -992,9 +1110,10 @@ var LiffProvider = function(param) {
992
1110
  return trimmed.toLowerCase().startsWith("bearer ") ? trimmed : "Bearer ".concat(trimmed);
993
1111
  };
994
1112
  var searchParams = typeof window !== "undefined" ? new URLSearchParams(window.location.search) : null;
995
- // 初始載入時從 localStorage 載入 userInfo
1113
+ // 初始載入時從 localStorage 載入
996
1114
  useEffect(function() {
997
1115
  loadUserInfoFromStorage();
1116
+ loadLiffUserInfoFromStorage();
998
1117
  }, []);
999
1118
  // 客戶端初始化 LIFF
1000
1119
  useEffect(function() {
@@ -1079,13 +1198,12 @@ var LiffProvider = function(param) {
1079
1198
  userInfo: userInfo,
1080
1199
  accessToken: accessToken,
1081
1200
  liffError: liffError,
1082
- initializeLiff: function() {
1083
- return initializeLiff(false);
1084
- },
1085
1201
  isFriendship: isFriendship,
1086
1202
  ensureLiffTokenValid: ensureLiffTokenValid,
1087
1203
  accountLogin: accountLogin,
1088
- loginType: loginType
1204
+ loginType: loginType,
1205
+ liffProfile: liffProfile,
1206
+ clearLiffData: clearLiffData
1089
1207
  };
1090
1208
  }, [
1091
1209
  liffObject,
@@ -1096,7 +1214,9 @@ var LiffProvider = function(param) {
1096
1214
  isFriendship,
1097
1215
  ensureLiffTokenValid,
1098
1216
  accountLogin,
1099
- loginType
1217
+ loginType,
1218
+ liffProfile,
1219
+ clearLiffData
1100
1220
  ]);
1101
1221
  return /*#__PURE__*/ jsx(LiffContext.Provider, {
1102
1222
  value: contextValue,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunggang/ui-lib",
3
- "version": "0.4.51",
3
+ "version": "0.4.53",
4
4
  "sideEffects": [
5
5
  "*.css",
6
6
  "./src/style.css",
@@ -3,11 +3,12 @@ type LiffContextType = {
3
3
  liffObject: any;
4
4
  loginData: any;
5
5
  userInfo?: any;
6
+ liffProfile?: any;
6
7
  accessToken: string;
7
8
  liffError: string | null;
8
- initializeLiff: () => Promise<void>;
9
9
  isFriendship: boolean | null;
10
10
  ensureLiffTokenValid: () => Promise<boolean>;
11
+ clearLiffData: () => void;
11
12
  loginType: string | null;
12
13
  accountLogin: (username: string, password: string) => Promise<void>;
13
14
  };