@sunggang/ui-lib 0.4.57 → 0.4.59

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.
@@ -453,6 +453,115 @@ function _ts_generator(thisArg, body) {
453
453
  }
454
454
  }
455
455
  var LiffContext = /*#__PURE__*/ React.createContext(undefined);
456
+ // 外部可直接 import 的 helper:嘗試由 getLiff helper 或 dynamic import 取得 SDK,並在必要時啟動 init
457
+ function fetchLiffSdk(liffId) {
458
+ return _fetchLiffSdk.apply(this, arguments);
459
+ }
460
+ function _fetchLiffSdk() {
461
+ _fetchLiffSdk = _async_to_generator(function(liffId) {
462
+ var sdk, mod, e, e1, e2;
463
+ return _ts_generator(this, function(_state) {
464
+ switch(_state.label){
465
+ case 0:
466
+ if (typeof window === "undefined") return [
467
+ 2,
468
+ null
469
+ ];
470
+ _state.label = 1;
471
+ case 1:
472
+ _state.trys.push([
473
+ 1,
474
+ 10,
475
+ ,
476
+ 11
477
+ ]);
478
+ sdk = null;
479
+ _state.label = 2;
480
+ case 2:
481
+ _state.trys.push([
482
+ 2,
483
+ 4,
484
+ ,
485
+ 5
486
+ ]);
487
+ return [
488
+ 4,
489
+ Promise.resolve().then(function () { return require('./index.cjs3.js'); })
490
+ ];
491
+ case 3:
492
+ mod = _state.sent();
493
+ sdk = mod && (mod.default || mod.liff) ? mod.default || mod.liff : mod;
494
+ return [
495
+ 3,
496
+ 5
497
+ ];
498
+ case 4:
499
+ e = _state.sent();
500
+ console.warn("dynamic import @line/liff failed", e);
501
+ sdk = null;
502
+ return [
503
+ 3,
504
+ 5
505
+ ];
506
+ case 5:
507
+ if (!sdk) return [
508
+ 2,
509
+ null
510
+ ];
511
+ if (!(typeof sdk.init === "function" && !sdk._initialized && liffId)) return [
512
+ 3,
513
+ 9
514
+ ];
515
+ _state.label = 6;
516
+ case 6:
517
+ _state.trys.push([
518
+ 6,
519
+ 8,
520
+ ,
521
+ 9
522
+ ]);
523
+ return [
524
+ 4,
525
+ sdk.init({
526
+ liffId: liffId,
527
+ withLoginOnExternalBrowser: false
528
+ })
529
+ ];
530
+ case 7:
531
+ _state.sent();
532
+ sdk._initialized = true;
533
+ return [
534
+ 3,
535
+ 9
536
+ ];
537
+ case 8:
538
+ e1 = _state.sent();
539
+ console.warn("liff.init failed or already initialized", e1);
540
+ return [
541
+ 3,
542
+ 9
543
+ ];
544
+ case 9:
545
+ return [
546
+ 2,
547
+ sdk
548
+ ];
549
+ case 10:
550
+ e2 = _state.sent();
551
+ console.warn("fetchLiffSdk error", e2);
552
+ return [
553
+ 2,
554
+ null
555
+ ];
556
+ case 11:
557
+ return [
558
+ 2
559
+ ];
560
+ }
561
+ });
562
+ });
563
+ return _fetchLiffSdk.apply(this, arguments);
564
+ }
456
565
  var LiffProvider = function(param) {
457
566
  var children = param.children, liffId = param.liffId, _param_localStorageKey = param.localStorageKey, localStorageKey = _param_localStorageKey === void 0 ? "one-gobo-global-login" : _param_localStorageKey, checkTokenUrl = param.checkTokenUrl, loginUrl = param.loginUrl, accountLoginUrl = param.accountLoginUrl, memberInfoUrl = param.memberInfoUrl, _param_openInApp = param.openInApp, openInApp = _param_openInApp === void 0 ? false : _param_openInApp, _param_ignoreCheckAddFriend = param.ignoreCheckAddFriend, ignoreCheckAddFriend = _param_ignoreCheckAddFriend === void 0 ? false : _param_ignoreCheckAddFriend, _param_ignoreRoute = param.ignoreRoute, ignoreRoute = _param_ignoreRoute === void 0 ? false : _param_ignoreRoute, _param_loginByUser = param.loginByUser, loginByUser = _param_loginByUser === void 0 ? false : _param_loginByUser, _param_liffLogin = param.liffLogin, liffLogin = _param_liffLogin === void 0 ? false : _param_liffLogin, customerRedirectUrl = param.customerRedirectUrl, inviteCode = param.inviteCode, handleLoginError = param.handleLoginError;
458
567
  var _useState = _sliced_to_array(React.useState(null), 2), liffObject = _useState[0], setLiffObject = _useState[1];
@@ -767,15 +876,15 @@ var LiffProvider = function(param) {
767
876
  // 初始化 LIFF
768
877
  var initializeLiff = function() {
769
878
  var _ref = _async_to_generator(function(isValid) {
770
- var customFetch, liff, originalFetch, storedProfileExists, profile, profileErr, lineToken, redirectUri, tempFriendship, friendship, friendFlag, error, err;
879
+ var customFetch, liff, originalFetch, redirectUri, tempFriendship, lineToken, profile, profileErr, friendship, friendFlag, error, err;
771
880
  return _ts_generator(this, function(_state) {
772
881
  switch(_state.label){
773
882
  case 0:
774
883
  _state.trys.push([
775
884
  0,
776
- 15,
885
+ 13,
777
886
  ,
778
- 16
887
+ 14
779
888
  ]);
780
889
  customFetch = // 自訂 fetch 函數,避免每次請求都改變 URL
781
890
  // eslint-disable-next-line no-inner-declarations
@@ -794,6 +903,9 @@ var LiffProvider = function(param) {
794
903
  originalFetch = window.fetch;
795
904
  window.fetch = customFetch;
796
905
  if (openInApp && !(liff === null || liff === void 0 ? void 0 : liff.isInClient()) && (liff === null || liff === void 0 ? void 0 : liff.getOS()) !== "web") window.location.href = "line://app/".concat(liffId);
906
+ if (isValid) return [
907
+ 2
908
+ ];
797
909
  return [
798
910
  4,
799
911
  liff.init({
@@ -805,17 +917,26 @@ var LiffProvider = function(param) {
805
917
  _state.sent();
806
918
  console.log("LIFF init succeeded.");
807
919
  setLiffObject(liff);
808
- // 如果 localStorage 或 state 已有 profile,就跳過重複呼叫
809
- storedProfileExists = false;
810
- try {
811
- storedProfileExists = !!window.localStorage.getItem(liffUserInfoStorageKey);
812
- } catch (e) {
813
- storedProfileExists = false;
920
+ // 未登入先進行登入
921
+ if (!liff.isLoggedIn()) {
922
+ redirectUri = customerRedirectUrl || "".concat(window.location.href);
923
+ if (liffLogin) {
924
+ liff.login({
925
+ redirectUri: redirectUri
926
+ });
927
+ return [
928
+ 2
929
+ ];
930
+ }
931
+ if (loginByUser || ignoreRoute) return [
932
+ 2
933
+ ];
934
+ liff.login({
935
+ redirectUri: redirectUri
936
+ });
814
937
  }
815
- if (!(!storedProfileExists && !liffProfile)) return [
816
- 3,
817
- 7
818
- ];
938
+ tempFriendship = null;
939
+ lineToken = liff === null || liff === void 0 ? void 0 : liff.getAccessToken();
819
940
  _state.label = 3;
820
941
  case 3:
821
942
  _state.trys.push([
@@ -838,58 +959,29 @@ var LiffProvider = function(param) {
838
959
  ];
839
960
  case 5:
840
961
  profileErr = _state.sent();
841
- console.warn("取得 LIFF profile 失敗(非致命):", profileErr);
962
+ console.warn("取得 LIFF profile 失敗:", profileErr);
842
963
  return [
843
964
  3,
844
965
  6
845
966
  ];
846
967
  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:
856
- lineToken = liff === null || liff === void 0 ? void 0 : liff.getAccessToken();
857
- // 未登入先進行登入
858
- if (!liff.isLoggedIn()) {
859
- redirectUri = customerRedirectUrl || "".concat(window.location.href);
860
- if (liffLogin) {
861
- liff.login({
862
- redirectUri: redirectUri
863
- });
864
- return [
865
- 2
866
- ];
867
- }
868
- if (loginByUser || ignoreRoute) return [
869
- 2
870
- ];
871
- liff.login({
872
- redirectUri: redirectUri
873
- });
874
- }
875
- tempFriendship = null;
876
968
  if (!lineToken) return [
877
969
  3,
878
- 14
970
+ 12
879
971
  ];
880
- _state.label = 9;
881
- case 9:
972
+ _state.label = 7;
973
+ case 7:
882
974
  _state.trys.push([
975
+ 7,
883
976
  9,
884
- 11,
885
977
  ,
886
- 12
978
+ 10
887
979
  ]);
888
980
  return [
889
981
  4,
890
982
  liff.getFriendship()
891
983
  ];
892
- case 10:
984
+ case 8:
893
985
  friendship = _state.sent();
894
986
  friendFlag = friendship === null || friendship === void 0 ? void 0 : friendship.friendFlag;
895
987
  setFriendship(friendFlag);
@@ -897,16 +989,16 @@ var LiffProvider = function(param) {
897
989
  console.log("isFriendship", friendFlag);
898
990
  return [
899
991
  3,
900
- 12
992
+ 10
901
993
  ];
902
- case 11:
994
+ case 9:
903
995
  error = _state.sent();
904
996
  console.error("Error in liff.getFriendship():", error);
905
997
  return [
906
998
  3,
907
- 12
999
+ 10
908
1000
  ];
909
- case 12:
1001
+ case 10:
910
1002
  console.log("isValid", isValid);
911
1003
  if (tempFriendship && isValid) return [
912
1004
  2
@@ -915,23 +1007,23 @@ var LiffProvider = function(param) {
915
1007
  4,
916
1008
  loginInit(lineToken)
917
1009
  ];
918
- case 13:
1010
+ case 11:
919
1011
  _state.sent();
920
- _state.label = 14;
921
- case 14:
1012
+ _state.label = 12;
1013
+ case 12:
922
1014
  return [
923
1015
  3,
924
- 16
1016
+ 14
925
1017
  ];
926
- case 15:
1018
+ case 13:
927
1019
  err = _state.sent();
928
1020
  setLiffError(err.toString());
929
1021
  console.log("LIFF init failed.", err);
930
1022
  return [
931
1023
  3,
932
- 16
1024
+ 14
933
1025
  ];
934
- case 16:
1026
+ case 14:
935
1027
  return [
936
1028
  2
937
1029
  ];
@@ -1113,6 +1205,56 @@ var LiffProvider = function(param) {
1113
1205
  var trimmed = token.trim();
1114
1206
  return trimmed.toLowerCase().startsWith("bearer ") ? trimmed : "Bearer ".concat(trimmed);
1115
1207
  };
1208
+ // 提供給 context 的 lazy-load 函式(會嘗試回傳已存在的 liffObject,否則 dynamic import)
1209
+ var getLiff = React.useCallback(/*#__PURE__*/ _async_to_generator(function() {
1210
+ var mod, sdk, e;
1211
+ return _ts_generator(this, function(_state) {
1212
+ switch(_state.label){
1213
+ case 0:
1214
+ if (liffObject) return [
1215
+ 2,
1216
+ liffObject
1217
+ ];
1218
+ if (typeof window === "undefined") return [
1219
+ 2,
1220
+ null
1221
+ ];
1222
+ _state.label = 1;
1223
+ case 1:
1224
+ _state.trys.push([
1225
+ 1,
1226
+ 3,
1227
+ ,
1228
+ 4
1229
+ ]);
1230
+ return [
1231
+ 4,
1232
+ Promise.resolve().then(function () { return require('./index.cjs3.js'); })
1233
+ ];
1234
+ case 2:
1235
+ mod = _state.sent();
1236
+ sdk = mod && (mod.default || mod.liff) ? mod.default || mod.liff : mod;
1237
+ if (sdk) setLiffObject(sdk);
1238
+ return [
1239
+ 2,
1240
+ sdk || null
1241
+ ];
1242
+ case 3:
1243
+ e = _state.sent();
1244
+ console.error("lazy import @line/liff failed", e);
1245
+ return [
1246
+ 2,
1247
+ null
1248
+ ];
1249
+ case 4:
1250
+ return [
1251
+ 2
1252
+ ];
1253
+ }
1254
+ });
1255
+ }), [
1256
+ liffObject
1257
+ ]);
1116
1258
  var searchParams = typeof window !== "undefined" ? new URLSearchParams(window.location.search) : null;
1117
1259
  // 初始載入時從 localStorage 載入
1118
1260
  React.useEffect(function() {
@@ -1198,6 +1340,12 @@ var LiffProvider = function(param) {
1198
1340
  var contextValue = React.useMemo(function() {
1199
1341
  return {
1200
1342
  liffObject: liffObject,
1343
+ // 非同步取得 LIFF SDK 的 helper(lazy-load),使用時可以呼叫 `await getLiff()`
1344
+ getLiff: getLiff,
1345
+ // helper:透過 fetchLiffSdk 執行更完整的 fetch + optional init
1346
+ fetchLiffSdk: function(liffId) {
1347
+ return fetchLiffSdk(liffId);
1348
+ },
1201
1349
  loginData: loginData,
1202
1350
  userInfo: userInfo,
1203
1351
  accessToken: accessToken,
@@ -1237,4 +1385,5 @@ var useLiffContext = function() {
1237
1385
 
1238
1386
  exports.LiffContext = LiffContext;
1239
1387
  exports.LiffProvider = LiffProvider;
1388
+ exports.fetchLiffSdk = fetchLiffSdk;
1240
1389
  exports.useLiffContext = useLiffContext;
@@ -449,6 +449,115 @@ function _ts_generator(thisArg, body) {
449
449
  }
450
450
  }
451
451
  var LiffContext = /*#__PURE__*/ createContext(undefined);
452
+ // 外部可直接 import 的 helper:嘗試由 getLiff helper 或 dynamic import 取得 SDK,並在必要時啟動 init
453
+ function fetchLiffSdk(liffId) {
454
+ return _fetchLiffSdk.apply(this, arguments);
455
+ }
456
+ function _fetchLiffSdk() {
457
+ _fetchLiffSdk = _async_to_generator(function(liffId) {
458
+ var sdk, mod, e, e1, e2;
459
+ return _ts_generator(this, function(_state) {
460
+ switch(_state.label){
461
+ case 0:
462
+ if (typeof window === "undefined") return [
463
+ 2,
464
+ null
465
+ ];
466
+ _state.label = 1;
467
+ case 1:
468
+ _state.trys.push([
469
+ 1,
470
+ 10,
471
+ ,
472
+ 11
473
+ ]);
474
+ sdk = null;
475
+ _state.label = 2;
476
+ case 2:
477
+ _state.trys.push([
478
+ 2,
479
+ 4,
480
+ ,
481
+ 5
482
+ ]);
483
+ return [
484
+ 4,
485
+ import('./index.esm3.js')
486
+ ];
487
+ case 3:
488
+ mod = _state.sent();
489
+ sdk = mod && (mod.default || mod.liff) ? mod.default || mod.liff : mod;
490
+ return [
491
+ 3,
492
+ 5
493
+ ];
494
+ case 4:
495
+ e = _state.sent();
496
+ console.warn("dynamic import @line/liff failed", e);
497
+ sdk = null;
498
+ return [
499
+ 3,
500
+ 5
501
+ ];
502
+ case 5:
503
+ if (!sdk) return [
504
+ 2,
505
+ null
506
+ ];
507
+ if (!(typeof sdk.init === "function" && !sdk._initialized && liffId)) return [
508
+ 3,
509
+ 9
510
+ ];
511
+ _state.label = 6;
512
+ case 6:
513
+ _state.trys.push([
514
+ 6,
515
+ 8,
516
+ ,
517
+ 9
518
+ ]);
519
+ return [
520
+ 4,
521
+ sdk.init({
522
+ liffId: liffId,
523
+ withLoginOnExternalBrowser: false
524
+ })
525
+ ];
526
+ case 7:
527
+ _state.sent();
528
+ sdk._initialized = true;
529
+ return [
530
+ 3,
531
+ 9
532
+ ];
533
+ case 8:
534
+ e1 = _state.sent();
535
+ console.warn("liff.init failed or already initialized", e1);
536
+ return [
537
+ 3,
538
+ 9
539
+ ];
540
+ case 9:
541
+ return [
542
+ 2,
543
+ sdk
544
+ ];
545
+ case 10:
546
+ e2 = _state.sent();
547
+ console.warn("fetchLiffSdk error", e2);
548
+ return [
549
+ 2,
550
+ null
551
+ ];
552
+ case 11:
553
+ return [
554
+ 2
555
+ ];
556
+ }
557
+ });
558
+ });
559
+ return _fetchLiffSdk.apply(this, arguments);
560
+ }
452
561
  var LiffProvider = function(param) {
453
562
  var children = param.children, liffId = param.liffId, _param_localStorageKey = param.localStorageKey, localStorageKey = _param_localStorageKey === void 0 ? "one-gobo-global-login" : _param_localStorageKey, checkTokenUrl = param.checkTokenUrl, loginUrl = param.loginUrl, accountLoginUrl = param.accountLoginUrl, memberInfoUrl = param.memberInfoUrl, _param_openInApp = param.openInApp, openInApp = _param_openInApp === void 0 ? false : _param_openInApp, _param_ignoreCheckAddFriend = param.ignoreCheckAddFriend, ignoreCheckAddFriend = _param_ignoreCheckAddFriend === void 0 ? false : _param_ignoreCheckAddFriend, _param_ignoreRoute = param.ignoreRoute, ignoreRoute = _param_ignoreRoute === void 0 ? false : _param_ignoreRoute, _param_loginByUser = param.loginByUser, loginByUser = _param_loginByUser === void 0 ? false : _param_loginByUser, _param_liffLogin = param.liffLogin, liffLogin = _param_liffLogin === void 0 ? false : _param_liffLogin, customerRedirectUrl = param.customerRedirectUrl, inviteCode = param.inviteCode, handleLoginError = param.handleLoginError;
454
563
  var _useState = _sliced_to_array(useState(null), 2), liffObject = _useState[0], setLiffObject = _useState[1];
@@ -763,15 +872,15 @@ var LiffProvider = function(param) {
763
872
  // 初始化 LIFF
764
873
  var initializeLiff = function() {
765
874
  var _ref = _async_to_generator(function(isValid) {
766
- var customFetch, liff, originalFetch, storedProfileExists, profile, profileErr, lineToken, redirectUri, tempFriendship, friendship, friendFlag, error, err;
875
+ var customFetch, liff, originalFetch, redirectUri, tempFriendship, lineToken, profile, profileErr, friendship, friendFlag, error, err;
767
876
  return _ts_generator(this, function(_state) {
768
877
  switch(_state.label){
769
878
  case 0:
770
879
  _state.trys.push([
771
880
  0,
772
- 15,
881
+ 13,
773
882
  ,
774
- 16
883
+ 14
775
884
  ]);
776
885
  customFetch = // 自訂 fetch 函數,避免每次請求都改變 URL
777
886
  // eslint-disable-next-line no-inner-declarations
@@ -790,6 +899,9 @@ var LiffProvider = function(param) {
790
899
  originalFetch = window.fetch;
791
900
  window.fetch = customFetch;
792
901
  if (openInApp && !(liff === null || liff === void 0 ? void 0 : liff.isInClient()) && (liff === null || liff === void 0 ? void 0 : liff.getOS()) !== "web") window.location.href = "line://app/".concat(liffId);
902
+ if (isValid) return [
903
+ 2
904
+ ];
793
905
  return [
794
906
  4,
795
907
  liff.init({
@@ -801,17 +913,26 @@ var LiffProvider = function(param) {
801
913
  _state.sent();
802
914
  console.log("LIFF init succeeded.");
803
915
  setLiffObject(liff);
804
- // 如果 localStorage 或 state 已有 profile,就跳過重複呼叫
805
- storedProfileExists = false;
806
- try {
807
- storedProfileExists = !!window.localStorage.getItem(liffUserInfoStorageKey);
808
- } catch (e) {
809
- storedProfileExists = false;
916
+ // 未登入先進行登入
917
+ if (!liff.isLoggedIn()) {
918
+ redirectUri = customerRedirectUrl || "".concat(window.location.href);
919
+ if (liffLogin) {
920
+ liff.login({
921
+ redirectUri: redirectUri
922
+ });
923
+ return [
924
+ 2
925
+ ];
926
+ }
927
+ if (loginByUser || ignoreRoute) return [
928
+ 2
929
+ ];
930
+ liff.login({
931
+ redirectUri: redirectUri
932
+ });
810
933
  }
811
- if (!(!storedProfileExists && !liffProfile)) return [
812
- 3,
813
- 7
814
- ];
934
+ tempFriendship = null;
935
+ lineToken = liff === null || liff === void 0 ? void 0 : liff.getAccessToken();
815
936
  _state.label = 3;
816
937
  case 3:
817
938
  _state.trys.push([
@@ -834,58 +955,29 @@ var LiffProvider = function(param) {
834
955
  ];
835
956
  case 5:
836
957
  profileErr = _state.sent();
837
- console.warn("取得 LIFF profile 失敗(非致命):", profileErr);
958
+ console.warn("取得 LIFF profile 失敗:", profileErr);
838
959
  return [
839
960
  3,
840
961
  6
841
962
  ];
842
963
  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:
852
- lineToken = liff === null || liff === void 0 ? void 0 : liff.getAccessToken();
853
- // 未登入先進行登入
854
- if (!liff.isLoggedIn()) {
855
- redirectUri = customerRedirectUrl || "".concat(window.location.href);
856
- if (liffLogin) {
857
- liff.login({
858
- redirectUri: redirectUri
859
- });
860
- return [
861
- 2
862
- ];
863
- }
864
- if (loginByUser || ignoreRoute) return [
865
- 2
866
- ];
867
- liff.login({
868
- redirectUri: redirectUri
869
- });
870
- }
871
- tempFriendship = null;
872
964
  if (!lineToken) return [
873
965
  3,
874
- 14
966
+ 12
875
967
  ];
876
- _state.label = 9;
877
- case 9:
968
+ _state.label = 7;
969
+ case 7:
878
970
  _state.trys.push([
971
+ 7,
879
972
  9,
880
- 11,
881
973
  ,
882
- 12
974
+ 10
883
975
  ]);
884
976
  return [
885
977
  4,
886
978
  liff.getFriendship()
887
979
  ];
888
- case 10:
980
+ case 8:
889
981
  friendship = _state.sent();
890
982
  friendFlag = friendship === null || friendship === void 0 ? void 0 : friendship.friendFlag;
891
983
  setFriendship(friendFlag);
@@ -893,16 +985,16 @@ var LiffProvider = function(param) {
893
985
  console.log("isFriendship", friendFlag);
894
986
  return [
895
987
  3,
896
- 12
988
+ 10
897
989
  ];
898
- case 11:
990
+ case 9:
899
991
  error = _state.sent();
900
992
  console.error("Error in liff.getFriendship():", error);
901
993
  return [
902
994
  3,
903
- 12
995
+ 10
904
996
  ];
905
- case 12:
997
+ case 10:
906
998
  console.log("isValid", isValid);
907
999
  if (tempFriendship && isValid) return [
908
1000
  2
@@ -911,23 +1003,23 @@ var LiffProvider = function(param) {
911
1003
  4,
912
1004
  loginInit(lineToken)
913
1005
  ];
914
- case 13:
1006
+ case 11:
915
1007
  _state.sent();
916
- _state.label = 14;
917
- case 14:
1008
+ _state.label = 12;
1009
+ case 12:
918
1010
  return [
919
1011
  3,
920
- 16
1012
+ 14
921
1013
  ];
922
- case 15:
1014
+ case 13:
923
1015
  err = _state.sent();
924
1016
  setLiffError(err.toString());
925
1017
  console.log("LIFF init failed.", err);
926
1018
  return [
927
1019
  3,
928
- 16
1020
+ 14
929
1021
  ];
930
- case 16:
1022
+ case 14:
931
1023
  return [
932
1024
  2
933
1025
  ];
@@ -1109,6 +1201,56 @@ var LiffProvider = function(param) {
1109
1201
  var trimmed = token.trim();
1110
1202
  return trimmed.toLowerCase().startsWith("bearer ") ? trimmed : "Bearer ".concat(trimmed);
1111
1203
  };
1204
+ // 提供給 context 的 lazy-load 函式(會嘗試回傳已存在的 liffObject,否則 dynamic import)
1205
+ var getLiff = useCallback(/*#__PURE__*/ _async_to_generator(function() {
1206
+ var mod, sdk, e;
1207
+ return _ts_generator(this, function(_state) {
1208
+ switch(_state.label){
1209
+ case 0:
1210
+ if (liffObject) return [
1211
+ 2,
1212
+ liffObject
1213
+ ];
1214
+ if (typeof window === "undefined") return [
1215
+ 2,
1216
+ null
1217
+ ];
1218
+ _state.label = 1;
1219
+ case 1:
1220
+ _state.trys.push([
1221
+ 1,
1222
+ 3,
1223
+ ,
1224
+ 4
1225
+ ]);
1226
+ return [
1227
+ 4,
1228
+ import('./index.esm3.js')
1229
+ ];
1230
+ case 2:
1231
+ mod = _state.sent();
1232
+ sdk = mod && (mod.default || mod.liff) ? mod.default || mod.liff : mod;
1233
+ if (sdk) setLiffObject(sdk);
1234
+ return [
1235
+ 2,
1236
+ sdk || null
1237
+ ];
1238
+ case 3:
1239
+ e = _state.sent();
1240
+ console.error("lazy import @line/liff failed", e);
1241
+ return [
1242
+ 2,
1243
+ null
1244
+ ];
1245
+ case 4:
1246
+ return [
1247
+ 2
1248
+ ];
1249
+ }
1250
+ });
1251
+ }), [
1252
+ liffObject
1253
+ ]);
1112
1254
  var searchParams = typeof window !== "undefined" ? new URLSearchParams(window.location.search) : null;
1113
1255
  // 初始載入時從 localStorage 載入
1114
1256
  useEffect(function() {
@@ -1194,6 +1336,12 @@ var LiffProvider = function(param) {
1194
1336
  var contextValue = useMemo(function() {
1195
1337
  return {
1196
1338
  liffObject: liffObject,
1339
+ // 非同步取得 LIFF SDK 的 helper(lazy-load),使用時可以呼叫 `await getLiff()`
1340
+ getLiff: getLiff,
1341
+ // helper:透過 fetchLiffSdk 執行更完整的 fetch + optional init
1342
+ fetchLiffSdk: function(liffId) {
1343
+ return fetchLiffSdk(liffId);
1344
+ },
1197
1345
  loginData: loginData,
1198
1346
  userInfo: userInfo,
1199
1347
  accessToken: accessToken,
@@ -1231,4 +1379,4 @@ var useLiffContext = function() {
1231
1379
  return context;
1232
1380
  };
1233
1381
 
1234
- export { LiffContext, LiffProvider, useLiffContext };
1382
+ export { LiffContext, LiffProvider, fetchLiffSdk, useLiffContext };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunggang/ui-lib",
3
- "version": "0.4.57",
3
+ "version": "0.4.59",
4
4
  "sideEffects": [
5
5
  "*.css",
6
6
  "./src/style.css",
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
2
  type LiffContextType = {
3
+ getLiff: () => Promise<any>;
4
+ fetchLiffSdk?: (liffId: string) => Promise<any>;
3
5
  liffObject: any;
4
6
  loginData: any;
5
7
  userInfo?: any;
@@ -13,6 +15,7 @@ type LiffContextType = {
13
15
  accountLogin: (username: string, password: string) => Promise<void>;
14
16
  };
15
17
  export declare const LiffContext: React.Context<LiffContextType | undefined>;
18
+ export declare function fetchLiffSdk(liffId?: string): Promise<any>;
16
19
  export declare const LiffProvider: ({ children, liffId, localStorageKey, checkTokenUrl, loginUrl, accountLoginUrl, memberInfoUrl, openInApp, ignoreCheckAddFriend, ignoreRoute, loginByUser, liffLogin, customerRedirectUrl, inviteCode, handleLoginError, }: {
17
20
  children: React.ReactNode;
18
21
  liffId: string;