@conecli/cone-render 0.8.20-beta.0 → 0.8.20-beta.2

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.
Files changed (160) hide show
  1. package/README.md +7 -1
  2. package/dist/api/index.ts +1 -1
  3. package/dist/assets/icon_blue_info.svg +1 -0
  4. package/dist/common/const.ts +1 -1
  5. package/dist/common/environmentType.ts +1 -0
  6. package/dist/common/index.h5.ts +1 -1
  7. package/dist/common/index.jd.ts +1 -1
  8. package/dist/common/index.ts +1 -1
  9. package/dist/common/index.weapp.ts +1 -1
  10. package/dist/common/jdplayerSdk.ts +1 -0
  11. package/dist/common/jssdk.ts +1 -0
  12. package/dist/common/pageType.ts +1 -0
  13. package/dist/common/sgmCustomCode.ts +1 -0
  14. package/dist/common/token/index.h5.ts +1 -1
  15. package/dist/common/token/token.jd.ts +1 -1
  16. package/dist/common/token/token.ts +1 -1
  17. package/dist/common/wxappApi.jd.ts +1 -0
  18. package/dist/common/wxappApi.ts +1 -1
  19. package/dist/components/ErrorBoundary.tsx +1 -1
  20. package/dist/components/base/CommonFloorHead/index.module.scss +126 -111
  21. package/dist/components/base/CommonFloorHead/index.tsx +1 -1
  22. package/dist/components/base/CountDown/index.module.scss +49 -44
  23. package/dist/components/base/CountDown/index.tsx +1 -1
  24. package/dist/components/base/CustomScrollView/index.jd.tsx +1 -0
  25. package/dist/components/base/CustomScrollView/index.module.scss +7 -0
  26. package/dist/components/base/CustomScrollView/index.tsx +1 -1
  27. package/dist/components/base/CustomVideo/common.ts +1 -0
  28. package/dist/components/base/CustomVideo/index.tsx +1 -1
  29. package/dist/components/base/Dialog/index.module.scss +16 -0
  30. package/dist/components/base/Dialog/index.tsx +1 -1
  31. package/dist/components/base/Exposure/index.h5.tsx +1 -1
  32. package/dist/components/base/ExposureSmart/const.ts +1 -0
  33. package/dist/components/base/ExposureSmart/index.h5.module.scss +30 -6
  34. package/dist/components/base/ExposureSmart/index.h5.tsx +1 -1
  35. package/dist/components/base/ExposureSmart/index.module.scss +20 -9
  36. package/dist/components/base/ExposureSmart/index.tsx +1 -1
  37. package/dist/components/base/ExposureSmart/reporter.tsx +1 -1
  38. package/dist/components/base/InOrOutViewObserver/index.tsx +1 -1
  39. package/dist/components/base/InViewRender/index.tsx +1 -1
  40. package/dist/components/base/InViewRender/index.weapp.tsx +1 -1
  41. package/dist/components/base/ItemViewExposureSmart/index.module.scss +8 -0
  42. package/dist/components/base/ItemViewExposureSmart/index.tsx +1 -0
  43. package/dist/components/base/LazyLayoutLoad/index.tsx +1 -1
  44. package/dist/components/base/LazyLayoutLoad/index.weapp.tsx +1 -1
  45. package/dist/components/base/LazyLoadImage/const.ts +1 -1
  46. package/dist/components/base/LazyLoadImage/index.h5.module.scss +24 -20
  47. package/dist/components/base/LazyLoadImage/index.h5.tsx +1 -1
  48. package/dist/components/base/MobileCommonHeader/index.module.scss +17 -0
  49. package/dist/components/base/MobileCommonHeader/index.tsx +1 -0
  50. package/dist/components/base/NetworkDataError/const.ts +1 -1
  51. package/dist/components/base/NetworkDataError/index.module.scss +125 -69
  52. package/dist/components/base/NetworkDataError/index.tsx +1 -1
  53. package/dist/components/base/Price/Base/index.module.scss +12 -0
  54. package/dist/components/base/Price/Base/index.tsx +1 -1
  55. package/dist/components/base/Price/Double/index.module.scss +32 -0
  56. package/dist/components/base/Price/Double/index.tsx +1 -1
  57. package/dist/components/base/Price/index.tsx +1 -1
  58. package/dist/components/base/ShopLeGaoTag/index.h5.module.scss +35 -0
  59. package/dist/components/base/ShopLeGaoTag/index.h5.tsx +1 -0
  60. package/dist/components/base/ShopLeGaoTag/index.module.scss +33 -0
  61. package/dist/components/base/ShopLeGaoTag/index.tsx +1 -0
  62. package/dist/components/base/Skeleton/index.tsx +1 -1
  63. package/dist/components/debug/DebugLayout/index.module.scss +67 -0
  64. package/dist/components/debug/DebugLayout/index.tsx +1 -0
  65. package/dist/components/debug/DebugLayout/utils.ts +1 -0
  66. package/dist/components/decorate/DecorateFloorModule/index.module.scss +32 -2
  67. package/dist/components/decorate/DecorateFloorModule/index.tsx +1 -1
  68. package/dist/components/decorate/EmptyFloorModule/index.tsx +1 -1
  69. package/dist/components/decorate/PlaceHolder/index.tsx +1 -1
  70. package/dist/components/floorItem.jd.tsx +1 -1
  71. package/dist/components/floorItem.tsx +1 -1
  72. package/dist/components/floorItem.weapp.tsx +1 -1
  73. package/dist/components/isv/Floor/index.tsx +1 -1
  74. package/dist/components/remoteFloorItem.tsx +1 -0
  75. package/dist/interface/common.ts +1 -1
  76. package/dist/interface/component.ts +1 -1
  77. package/dist/interface/jumpEventReport.ts +1 -1
  78. package/dist/interface/service.ts +1 -1
  79. package/dist/interface/utils.ts +1 -1
  80. package/dist/jumpEventReport/base.ts +1 -1
  81. package/dist/jumpEventReport/const.ts +1 -1
  82. package/dist/jumpEventReport/createReportFloorData.ts +1 -1
  83. package/dist/jumpEventReport/index.h5.ts +1 -1
  84. package/dist/jumpEventReport/index.jd.ts +1 -1
  85. package/dist/jumpEventReport/index.ts +1 -1
  86. package/dist/jumpEventReport/index.weapp.ts +1 -1
  87. package/dist/jumpEventReport/jdJumpJdApp.ts +1 -1
  88. package/dist/jumpEventReport/jumpUrlConfig/base.ts +1 -1
  89. package/dist/jumpEventReport/logEventConfig.ts +1 -1
  90. package/dist/jumpEventReport/web/report.ts +1 -1
  91. package/dist/jumpEventReport/web.base.ts +1 -1
  92. package/dist/jumpEventReport/web.jd.ts +1 -1
  93. package/dist/jumpEventReport/web.jdb.ts +1 -1
  94. package/dist/jumpEventReport/web.jdjch.ts +1 -0
  95. package/dist/jumpEventReport/web.jxwxapp.ts +1 -0
  96. package/dist/jumpEventReport/web.pc.ts +1 -0
  97. package/dist/jumpEventReport/web.tjapp.ts +1 -0
  98. package/dist/jumpEventReport/web.tjm.ts +1 -0
  99. package/dist/jumpEventReport/web.wxapp.ts +1 -1
  100. package/dist/language/en_US.json +231 -0
  101. package/dist/language/zh_CN.json +231 -0
  102. package/dist/language/zh_HK.json +231 -0
  103. package/dist/libs/taroAppReport.js +2 -2
  104. package/dist/modules/ContainerFloorList/index.h5.module.scss +66 -27
  105. package/dist/modules/ContainerFloorList/index.h5.tsx +1 -1
  106. package/dist/modules/ContainerFloorList/index.tsx +1 -1
  107. package/dist/open/api/device.ts +1 -1
  108. package/dist/open/api/environment.ts +1 -1
  109. package/dist/open/api/index.ts +1 -1
  110. package/dist/open/api/jump copy.ts +1 -1
  111. package/dist/open/api/request.ts +1 -1
  112. package/dist/open/api/shopMember.ts +1 -1
  113. package/dist/open/api/track.ts +1 -1
  114. package/dist/open/api/util.ts +1 -1
  115. package/dist/open/components/index.ts +1 -1
  116. package/dist/sass/app.h5.scss +294 -212
  117. package/dist/sass/base.scss +195 -137
  118. package/dist/service/bMallConst.ts +1 -1
  119. package/dist/service/fetchGateway.ts +1 -1
  120. package/dist/service/fetchGateway.weapp.ts +1 -0
  121. package/dist/service/http/colorSign.ts +1 -1
  122. package/dist/service/http/const.ts +1 -1
  123. package/dist/service/http/h5Http.ts +1 -0
  124. package/dist/service/http/index.h5.ts +1 -0
  125. package/dist/service/requestServer.h5.ts +1 -0
  126. package/dist/service/requestServer.ts +1 -1
  127. package/dist/service/requestServer.weapp.ts +1 -0
  128. package/dist/utils/connectNativeJsBridge.ts +1 -1
  129. package/dist/utils/connectNativeJsBridge.weapp.ts +1 -1
  130. package/dist/utils/draExceptionAndProfile.ts +1 -1
  131. package/dist/utils/h5Utils.ts +1 -1
  132. package/dist/utils/index.h5.ts +1 -1
  133. package/dist/utils/index.ts +1 -1
  134. package/dist/utils/index.weapp.ts +1 -1
  135. package/dist/utils/intersectionObserver.ts +1 -1
  136. package/dist/utils/jm-common.js +1 -1
  137. package/dist/utils/jumpExtMapUtil.h5.ts +1 -0
  138. package/dist/utils/jumpExtMapUtil.ts +1 -0
  139. package/dist/utils/sColor.js +1 -0
  140. package/dist/utils/sgmCodeUtils.ts +1 -0
  141. package/dist/utils/taroRenderUtil.ts +1 -0
  142. package/dist/utils/utils.ts +1 -1
  143. package/dist/wxapp/api/helper.js +1 -0
  144. package/dist/wxapp/common/address_api/address_api_v2.js +1 -0
  145. package/dist/wxapp/common/user_info.js +1 -1
  146. package/dist/wxapp/components/launch-app/index.js +1 -0
  147. package/dist/wxapp/components/launch-app/index.json +5 -0
  148. package/dist/wxapp/components/launch-app/index.wxml +0 -0
  149. package/dist/wxapp/components/launch-app/index.wxss +0 -0
  150. package/dist/wxapp/components/subscribe-guider/helper.js +1 -0
  151. package/dist/wxapp/components/subscribe-guider/index.js +1 -0
  152. package/dist/wxapp/components/subscribe-guider/index.json +5 -0
  153. package/dist/wxapp/components/subscribe-guider/index.wxml +0 -0
  154. package/dist/wxapp/components/subscribe-guider/index.wxss +0 -0
  155. package/package.json +145 -115
  156. package/dist/components/base/Skeleton/old.tsx +0 -1
  157. package/dist/customHooks/useDocumentVisibilitychange.ts +0 -1
  158. package/dist/utils/memberFormatUtils.js +0 -1
  159. /package/dist/service/{bMallConst.wxapp.ts → bMallConst.weapp.ts} +0 -0
  160. /package/dist/service/http/{colorSign.wxapp.ts → colorSign.weapp.ts} +0 -0
@@ -1 +1 @@
1
- import Taro from '@tarojs/taro'
2
1
  urlCookie
3
2
  public config: {
4
3
  [key: string]: any
5
4
  }
6
5
  public lazyContainer: CommonInterFace.lazyContainer
7
6
  this.config = {}
8
7
  pin: cookie.get('pin') || ''
9
8
  })
10
9
  if(!this.checkStatusAndLoginPromise){
11
10
  this.checkStatusAndLoginPromise = new Promise(async (resolve, reject) => {
12
11
  try {
13
12
  const getLoginState = await this.doCheckLoginStateAndForApiCheck()
14
13
  if(getLoginState){
15
14
  resolve(true)
16
15
  }else {
17
16
  this.toLogin(options)
18
17
  reject(false)
19
18
  }
20
19
  }catch (e) {
21
20
  this.toLogin(options)
22
21
  reject(false)
23
22
  }
24
23
  })
25
24
  return this.checkStatusAndLoginPromise
26
25
  }else {
27
26
  return this.checkStatusAndLoginPromise.then(() => {
28
27
  return Promise.resolve(true)
29
28
  }).catch (() => {
30
29
  this.toLogin(options)
31
30
  return Promise.reject(true)
32
31
  })
33
32
  }
34
33
 
35
34
  doCheckLoginStateAndForApiCheck() {
36
35
  if(this.info.loginState){
37
36
  return Promise.resolve(true)
38
37
  }else {
39
38
  return new Promise((resolve, reject) => {
40
39
  Taro.request({
41
40
  url: api.isLogin,
42
41
  jsonp:true,
43
42
  timeout: 3000,
44
43
  success: (res) => {
45
44
  const {statusCode,data} = res
46
45
  if (statusCode === 200 && data?.islogin && Number(data.islogin) === 1) {
47
46
  this.info.loginState = true
48
47
  resolve(true);
49
48
  } else {
50
49
  reject(false)
51
50
  }
52
51
  },
53
52
  fail:(err) => {
54
53
  console.log("登录检查异常", err)
55
54
  reject(false)
56
55
  }
57
56
  })
58
57
  })
59
58
  }
60
59
  }
61
60
  try {
62
61
  const getLoginState = await this.doCheckLoginStateAndForApiCheck()
63
62
  if(getLoginState){
64
63
  const { pin } = await this.getLoginCookie();
65
64
  this.info.userInfo = {
66
65
  pin,
67
66
  encodePin: encodeURIComponent(pin),
68
67
  ptkey: '',
69
68
  }
70
69
  resolve(true)
71
70
  }else {
72
71
  reject(false)
73
72
  }
74
73
  }catch (e) {
75
74
  reject(false)
76
75
  }
77
76
  })
78
77
  if(un_area && un_area.length > 0){
79
78
  this.info.pageInfo.address = un_area
80
79
  this.info.pageInfo.un_area = un_area
81
80
  this.info.pageInfo.addressCommaStr = un_area.replace(/_/g, ',')
82
81
  }
82
+ import Taro from '@tarojs/taro';
83
83
  dealNativePixelToCssPixel,
84
84
  isAndroidDevice,
85
85
  isIosDevice,
86
86
  isJdAndAndroidDevice,
87
87
  isJdAndHarmonyDevice,
88
88
  isObject,
89
89
  isPc,
90
90
  isString,
91
91
  jdAppVersion,
92
92
  jdAppVersionStr,
93
93
  serialize,
94
94
  draBusinessCustomReport,
95
95
  isH5AndJingGouMini,
96
96
  languageNowType,
97
97
  urlCookie,
98
98
  BUSINESS_TYPE,
99
99
  LoadJsInitLoadEnvType,
100
100
  LoadJsInitLoadType,
101
101
  LoadJsInitTriggerType,
102
102
  MPAAS_CONFIG_APP_LOW_VERSION,
103
103
  MPAAS_CONFIG_APP_VERSION,
104
104
  SECTION_HOME_TAB_NAME_TYPE,
105
105
  SECTION_HOME_TAB_TYPE,
106
106
  TaroEventType,
107
107
  WX_BUSINESS_TYPE,
108
108
  WXAPP_BIZ_KEY,
109
109
  WXAPP_BIZ_SHOP_LIGHT_KEY,
110
110
  JSSDK_APP_WEBVIEW_CODE,
111
111
  cacheH5LbsAddressKey,
112
112
  languageTypeList,
113
113
  getSystemInfos,
114
114
  getTaroStorageKeyValue,
115
115
  ipLoc_djd,
116
116
  setTaroStorage,
117
117
  sgmCustomReport,
118
118
  getMPaasConfigByBussinessKey,
119
119
  callRouterAndroid,
120
120
  callRouterIOS,
121
121
  const designWidth = 750;
122
122
  return (
123
123
  Math.ceil((((parseInt(String(size), 10) / 40) * 750) / designWidth) * 10000) / 10000 + 'rem'
124
124
  );
125
125
  abTestLabels: {},
126
126
  nonSellableSkuids: {},
127
127
  loginState: false,
128
128
  cookiesStr: '',
129
129
  userInfo: userPinKey,
130
130
  isImmersive: false,
131
131
  isJingGouMiniViewState: false,
132
132
  isJingxiMiniViewState: false,
133
133
  pageInfo: {
134
134
  wxBusinessType: WX_BUSINESS_TYPE.NO,
135
135
  address: '',
136
136
  addressCommaStr: '',
137
137
  fullAddress: '',
138
138
  un_area: '',
139
139
  userLbsAddress: '',
140
140
  vapptype: '1',
141
141
  pageType: 'home',
142
142
  isExposureState: false,
143
143
  moduleId: '',
144
144
  entrance: '',
145
145
  dataType: BUSINESS_TYPE.ONLINE,
146
146
  floorExposureInfo: {},
147
147
  floorVideInfo: {},
148
148
  productVideInfo: {},
149
149
  tabsLoadAllDataInfo: {
150
150
  [SECTION_HOME_TAB_NAME_TYPE[SECTION_HOME_TAB_TYPE.HOME_WELL_CHOSEN]]: false,
151
151
  },
152
152
  updateShopInfosAllState: false,
153
153
  isVipShop: false,
154
154
  isJdShowNativeImmersivePlayer: false,
155
155
  ...shopConfig,
156
156
  pageScrollTop: 0,
157
157
  pageIdxHeightInfo: {
158
158
  list: [],
159
159
  },
160
160
  shopNavBarHeight: 0,
161
161
  },
162
162
  defaultQueryLogInfo: {
163
163
  sourceType: 'JDshop',
164
164
  sourceValue: '',
165
165
  moduleId: 'none',
166
166
  entrance: 'none',
167
167
  },
168
168
  sysInfo: {
169
169
  windowWidth: isPc ? 375 : 0,
170
170
  containerWidth: isPc ? 375 : 0,
171
171
  windowHeight: 0,
172
172
  netWorkType: '4g',
173
173
  jdBottomBarHeight: 0,
174
174
  jdNativeHeaderHeight: 0,
175
175
  isJdTabletDevice: false,
176
176
  isJdTabletLandscape: false,
177
177
  },
178
178
  queryInfo: {},
179
179
  shopInfo: {},
180
180
  openAppData: {},
181
181
  public info: CommonInterFace.BaseConfigInfo;
182
182
  public config: {
183
183
  [key: string]: any;
184
184
  };
185
185
  public lazyContainer: CommonInterFace.lazyContainer;
186
186
  public renderedIsvComponents: CommonInterFace.renderedIsvComponents;
187
187
  public rootEleNode: HTMLElement | null;
188
188
  public checkStatusAndLoginPromise: object | null;
189
189
  private jmfeRegisterStatePromise: Promise<any> | null;
190
190
  private jdScreenSizeInfoPromise: Promise<any> | null;
191
191
  private rootEleWidthRegisterPromise: Promise<any> | null;
192
192
  private jmfeRegisterState: boolean;
193
193
  public loadJsSdkList: Array<any>;
194
194
  public loadJsSdkListCachePromise: any;
195
195
  public rootEleInitWidth: number;
196
196
  public lbsAddressCachePromise: Promise<any> | null;
197
197
  public languageCacheProimse: Promise<any> | null;
198
198
  public languageJsonData: any | null;
199
199
  constructor(opt) {
200
200
  this.info = this._getConfig(opt);
201
201
  this.config = {};
202
202
  this.loadJsSdkList = [];
203
203
  this.loadJsSdkListCachePromise = {};
204
204
  this.lazyContainer = {
205
205
  [SECTION_HOME_TAB_NAME_TYPE[SECTION_HOME_TAB_TYPE.HOME_WELL_CHOSEN]]: {
206
206
  appLazyContainerList: [],
207
207
  appLazyFinishContainerList: [],
208
208
  },
209
209
  [SECTION_HOME_TAB_NAME_TYPE[SECTION_HOME_TAB_TYPE.HOME_PROMOTION]]: {
210
210
  appLazyContainerList: [],
211
211
  appLazyFinishContainerList: [],
212
212
  },
213
213
  };
214
214
  this.renderedIsvComponents = {};
215
215
  this.rootEleNode = document.querySelector('body');
216
216
  this.checkStatusAndLoginPromise = null;
217
217
  this.jmfeRegisterStatePromise = null;
218
218
  this.jdScreenSizeInfoPromise = null;
219
219
  this.rootEleWidthRegisterPromise = null;
220
220
  this.lbsAddressCachePromise = null;
221
221
  this.languageCacheProimse = null;
222
222
  this.languageJsonData = langeJsonDataForCn;
223
223
  this.rootEleInitWidth = this.getRootEleWindowWidthInfo().getRootEleWidth || -1;
224
224
  this.loadOtherSdk();
225
225
  if (isJdApp) {
226
226
  this.jmfeReayPromise();
227
227
  this._getJdPadMinWidthForListen() && this.getPadWindowRootEleWidthPromise();
228
228
  }
229
229
  }
230
230
  _getConfig(opt) {
231
231
  return Object.assign({}, DefaultConfig, opt);
232
232
  }
233
233
  _getJdPadMinWidthForListen() {
234
234
  return (
235
235
  isJdApp &&
236
236
  Math.min(window.screen.width, window.screen.height) >
237
237
  (window?.shopGlobalSwitch?.checkPadRootEleMinWidth || 600)
238
238
  );
239
239
  }
240
240
 
241
241
  jmfeReayPromise(): Promise<any> {
242
242
  if (isJdApp) {
243
243
  if (this.jmfeRegisterState) {
244
244
  return Promise.resolve(true);
245
245
  } else {
246
246
  !this.jmfeRegisterStatePromise &&
247
247
  (this.jmfeRegisterStatePromise = new Promise((resolve, reject) => {
248
248
  ready('jmfe', 3000)
249
249
  .then(() => {
250
250
  window?.jmfe && window.jmfe.registerCode(JSSDK_APP_WEBVIEW_CODE);
251
251
  this.jmfeRegisterState = true;
252
252
  resolve(true);
253
253
  console.log(
254
254
  '松果app内初始化注册jmfe认证完成',
255
255
  window?.jmfe,
256
256
  '当前版本',
257
257
  window?.jmfe?.VERSION,
258
258
  );
259
259
  })
260
260
  .catch((err) => {
261
261
  console.error('jmfe ready error', err);
262
262
  reject(false);
263
263
  });
264
264
  }));
265
265
  return this.jmfeRegisterStatePromise;
266
266
  }
267
267
  } else {
268
268
  return Promise.reject(false);
269
269
  }
270
270
  }
271
271
 
272
272
  getJdScreenSizeInfoPromise() {
273
273
  !this.jdScreenSizeInfoPromise &&
274
274
  (this.jdScreenSizeInfoPromise = new Promise((resolve) => {
275
275
  const getThisTime = Date.now();
276
276
  this.jmfeReayPromise().then(() => {
277
277
  return Promise.race([
278
278
  window.jmfe.getScreenSize(),
279
279
  this.taskTimeoutPromise(() => {
280
280
  return {
281
281
  status: '-10',
282
282
  msg: '获取大屏信息2s超时',
283
283
  };
284
284
  }),
285
285
  ])
286
286
  .then((res) => {
287
287
  console.warn('===获取app大屏信息====', res);
288
288
  const { status, data } = res;
289
289
  if (status === '0' && data) {
290
290
  const { sizeType, isLandscape, pageHeight, pageWidth } = data;
291
291
  const getPageInfo = dealNativePixelToCssPixel({
292
292
  pageWidth,
293
293
  pageHeight,
294
294
  });
295
295
  this.info.sysInfo.jdScreenSizeType = sizeType;
296
296
  const getUseTime = Date.now() - getThisTime;
297
297
  console.warn(
298
298
  '===计算是否是app大屏信息,需满足宽度最新720===',
299
299
  getPageInfo,
300
300
  '原始数据',
301
301
  data,
302
302
  '是否是横屏isLandscape为1=',
303
303
  isLandscape,
304
304
  '用时',
305
305
  getUseTime,
306
306
  );
307
307
  if (getPageInfo?.pageWidth > 0) {
308
308
  this.rootEleInitWidth = getPageInfo?.pageWidth;
309
309
  draBusinessCustomReport({
310
310
  type: 'rootEle_width_getJdScreenSizeInfo',
311
311
  errMsg: `根元素获取宽度初始化为0,通过getJdScreenSizeInfo获取结果,用时${getUseTime}`,
312
312
  originReqDataStr: JSON.stringify({
313
313
  isJdApp,
314
314
  getPageInfo,
315
315
  originData: res,
316
316
  }),
317
317
  });
318
318
  resolve(getPageInfo);
319
319
  } else {
320
320
  resolve({
321
321
  pageWidth: 0,
322
322
  pageHeight: 0,
323
323
  msg: '转换异常',
324
324
  });
325
325
  }
326
326
  } else {
327
327
  resolve({
328
328
  pageWidth: 0,
329
329
  pageHeight: 0,
330
330
  msg: '获取大屏信息异常或者超时',
331
331
  });
332
332
  }
333
333
  })
334
334
  .catch((err) => {
335
335
  console.log('获取大屏信息异常', err);
336
336
  resolve({
337
337
  pageWidth: 0,
338
338
  pageHeight: 0,
339
339
  msg: '获取大屏信息异常',
340
340
  });
341
341
  });
342
342
  });
343
343
  }));
344
344
  return this.jdScreenSizeInfoPromise;
345
345
  }
346
346
 
347
347
  listenJdTabletScreenChange() {
348
348
  this.jmfeReayPromise().then(() => {
349
349
  try {
350
350
  console.log('初始化监听大屏信息变化', window.jmfe.listenDeviceScreenChange);
351
351
  window.jmfe.listenDeviceScreenChange((event) => {
352
352
  console.log(
353
353
  '监听app大屏信息变化,orientation为landscape表示横屏,multiScreen为1表示android端分屏',
354
354
  event,
355
355
  '通过前端判断是不是横屏',
356
356
  window.matchMedia('(orientation: landscape)')?.matches,
357
357
  );
358
358
  const { orientation } = event?.data;
359
359
  if (orientation) {
360
360
  this.info.sysInfo.isJdTabletLandscape = orientation === 'landscape';
361
361
  Taro.eventCenter.trigger(
362
362
  TaroEventType.TABLE_SCREEN_CHANGE,
363
363
  this.info.sysInfo.isJdTabletLandscape,
364
364
  orientation,
365
365
  );
366
366
  }
367
367
  });
368
368
  } catch (error) {
369
369
  console.log('listenScreenChange的打印error:', error);
370
370
  }
371
371
  });
372
372
  }
373
373
 
374
374
  updateBusinessDomainAndApi(domain, api) {
375
375
  }
376
376
 
377
377
  formatNativeScreenPageData(action) {
378
378
  let getChangePageInfo: any = null;
379
379
  try {
380
380
  const getNativeScreenPageInfoStr = window.XWebView?._callNative(
381
381
  JSON.stringify({
382
382
  plugin: 'JDHybridScreenPlugin',
383
383
  action,
384
384
  sync: '1',
385
385
  }),
386
386
  );
387
387
  const getChangePageInfoData =
388
388
  typeof getNativeScreenPageInfoStr === 'string'
389
389
  ? JSON.parse(getNativeScreenPageInfoStr)
390
390
  : null;
391
391
  if (getChangePageInfoData && typeof getChangePageInfoData === 'object') {
392
392
  const { code, data } = getChangePageInfoData;
393
393
  getChangePageInfo = code && code === '0' ? data : null;
394
394
  }
395
395
  } catch (e) {
396
396
  console.log('JDHybridScreenPlugin转换异常', e);
397
397
  }
398
398
  return getChangePageInfo;
399
399
  }
400
400
 
401
401
  isAndroidFoldScreen() {
402
402
  return this.formatNativeScreenPageData('isFoldScreen') === '1';
403
403
  }
404
404
 
405
405
  getJdAndroidPageChangeScreenInfo() {
406
406
  const getPageScreenInfo = this.formatNativeScreenPageData('getScreenSize');
407
407
  if (getPageScreenInfo && getPageScreenInfo?.pageWidth && getPageScreenInfo?.pageHeight) {
408
408
  const { pageWidth, pageHeight } = dealNativePixelToCssPixel({
409
409
  pageWidth: getPageScreenInfo.pageWidth,
410
410
  pageHeight: getPageScreenInfo.pageHeight,
411
411
  });
412
412
  getPageScreenInfo.pageWidth = pageWidth;
413
413
  getPageScreenInfo.pageHeight = pageHeight;
414
414
  }
415
415
  return getPageScreenInfo;
416
416
  }
417
417
 
418
418
  getRootEleWindowWidthInfo() {
419
419
  const getRootEleWidth = document.documentElement.getBoundingClientRect().width;
420
420
  const getWindowWidth = window.innerWidth;
421
421
  const getScreenWidth = window.screen.width;
422
422
  return {
423
423
  getRootEleWidth,
424
424
  getWindowWidth,
425
425
  getScreenWidth,
426
426
  };
427
427
  }
428
428
 
429
429
  dealRootEleWidthFn(reportParam = {}, timeout = 0) {
430
430
  const { getRootEleWidth, getWindowWidth, getScreenWidth } = this.getRootEleWindowWidthInfo();
431
431
  console.log(
432
432
  '当前获取根元素的宽度',
433
433
  getRootEleWidth,
434
434
  'getWindowWidth',
435
435
  getWindowWidth,
436
436
  'getScreenWidth',
437
437
  getScreenWidth,
438
438
  );
439
439
  const getLastWidth =
440
440
  getRootEleWidth > 0
441
441
  ? Math.round(getRootEleWidth)
442
442
  : Math.round(getWindowWidth > 0 ? getWindowWidth : getScreenWidth);
443
443
  console.warn(
444
444
  `根元素获取宽度初始化为0,通过getJdScreenSizeInfo获取结果超时,超时时间超时时间${timeout}ms,最终兜底再获取一次根元素宽度${getLastWidth}`,
445
445
  );
446
446
  timeout > 0 &&
447
447
  draBusinessCustomReport({
448
448
  type: 'rootEle_width_timeout_getJdScreenSizeInfo',
449
449
  errMsg: `根元素获取宽度初始化为0,通过getJdScreenSizeInfo获取结果超时,超时时间${timeout}ms,最终兜底再获取一次根元素宽度${getLastWidth}`,
450
450
  originReqDataStr: JSON.stringify({
451
451
  isJdApp,
452
452
  getRootEleWidth,
453
453
  getWindowWidth,
454
454
  getScreenWidth,
455
455
  ...reportParam,
456
456
  }),
457
457
  });
458
458
  return getLastWidth;
459
459
  }
460
460
 
461
461
  getPadWindowRootEleWidthPromise() {
462
462
  if (this.rootEleInitWidth > 0) {
463
463
  return Promise.resolve(this.rootEleInitWidth);
464
464
  } else {
465
465
  !this.rootEleWidthRegisterPromise &&
466
466
  (this.rootEleWidthRegisterPromise = new Promise((resolve) => {
467
467
  const getRootEleInitWidth = this.getRootEleWindowWidthInfo().getRootEleWidth;
468
468
  if (getRootEleInitWidth > 0) {
469
469
  console.log('初始化获取根元素宽度正常,为', getRootEleInitWidth);
470
470
  this.rootEleInitWidth = Math.round(getRootEleInitWidth);
471
471
  resolve(this.rootEleInitWidth);
472
472
  } else {
473
473
  const timerPromise = () => {
474
474
  return new Promise((resolve2) => {
475
475
  window.setTimeout(() => {
476
476
  const { getRootEleWidth, getWindowWidth, getScreenWidth } =
477
477
  this.getRootEleWindowWidthInfo();
478
478
  if (getRootEleWidth > 0 || getWindowWidth > 0) {
479
479
  console.warn(
480
480
  `根元素获取宽度初始化为0,200ms后尝试获取最新结果,getRootEleWidth为${getRootEleWidth},getWindowWidth为${getWindowWidth},getScreenWidth为${getScreenWidth}`,
481
481
  );
482
482
  draBusinessCustomReport({
483
483
  type: 'rootEle_width_200_timeout_info',
484
484
  errMsg: `根元素获取宽度初始化为0,200ms后尝试获取最新结果,getRootEleWidth为${getRootEleWidth},getWindowWidth为${getWindowWidth}`,
485
485
  originReqDataStr: JSON.stringify({
486
486
  isJdApp,
487
487
  getRootEleWidth,
488
488
  getWindowWidth,
489
489
  getScreenWidth,
490
490
  }),
491
491
  });
492
492
  const getRes =
493
493
  getRootEleWidth > 0 && getWindowWidth > 0
494
494
  ? Math.min(getRootEleWidth, getWindowWidth)
495
495
  : Math.max(getRootEleWidth, getWindowWidth);
496
496
  resolve2({
497
497
  pageWidth: Math.round(getRes),
498
498
  });
499
499
  }
500
500
  }, 200);
501
501
  });
502
502
  };
503
503
  Promise.race([timerPromise(), this.getJdScreenSizeInfoPromise()]).then((res) => {
504
504
  const { pageWidth } = res;
505
505
  console.log('获取结果Promise.race getJdScreenSizeInfo', res);
506
506
  pageWidth > 0 ? resolve(pageWidth) : resolve(this.dealRootEleWidthFn(res, 2000));
507
507
  });
508
508
  }
509
509
  }));
510
510
  return this.rootEleWidthRegisterPromise;
511
511
  }
512
512
  }
513
513
 
514
514
  async getSystemInfo(params) {
515
515
  const getParams = Object.assign({}, params || {});
516
516
  if (this.rootEleInitWidth > 0) {
517
517
  getParams['rootEleInitWidth'] = this.rootEleInitWidth;
518
518
  console.log('获取当前系统信息的时候已经获取到根元素宽度,值为', this.rootEleInitWidth);
519
519
  } else {
520
520
  if (this._getJdPadMinWidthForListen()) {
521
521
  getParams['rootEleInitWidth'] = await this.getPadWindowRootEleWidthPromise();
522
522
  getParams['replaceSystemWidth'] = true;
523
523
  }
524
524
  }
525
525
  isJdApp && this.createLanguagePromise();
526
526
  let info: UtilsInterFace.taroGetSystemInfoSyncRes | any = getSystemInfos(getParams);
527
527
  if (isJdAndAndroidDevice && info?.initWindowWidth <= 0) {
528
528
  let _isfoldScreen = false;
529
529
  const getStorageData = getTaroStorageKeyValue('jd_shopx_androidIsFoldScreen');
530
530
  console.info(
531
531
  '获取当前本地存储是否有jd_shopx_androidIsFoldScreen',
532
532
  getStorageData,
533
533
  '通过缓存值第一次判断是否是折叠屏',
534
534
  getStorageData === 'true',
535
535
  );
536
536
  if (!getStorageData) {
537
537
  _isfoldScreen = this.isAndroidFoldScreen();
538
538
  setTaroStorage('jd_shopx_androidIsFoldScreen', `${_isfoldScreen}`);
539
539
  } else {
540
540
  _isfoldScreen = getStorageData === 'true';
541
541
  }
542
542
  if (_isfoldScreen) {
543
543
  const getJdAndroidPageInfo = this.getJdAndroidPageChangeScreenInfo();
544
544
  if (getJdAndroidPageInfo) {
545
545
  info = getSystemInfos(getJdAndroidPageInfo);
546
546
  console.warn(
547
547
  '当前为松果安卓折叠屏app,获取折叠屏信息',
548
548
  getJdAndroidPageInfo,
549
549
  '获取转换后的系统信息',
550
550
  info,
551
551
  );
552
552
  sgmCustomReport({
553
553
  type: 2,
554
554
  code: 'android_jdapp_foldScreen_info',
555
555
  msg: {
556
556
  title: `松果安卓app为折叠屏,重置获取的系统宽高信息,因为获取宽高度信息初始化内部可能存在横竖屏差异`,
557
557
  androidPageInfo: getJdAndroidPageInfo,
558
558
  jdAppVersionStr,
559
559
  taroSysInfo: info,
560
560
  },
561
561
  });
562
562
  }
563
563
  }
564
564
  }
565
565
  if (isJdApp) {
566
566
  info?.isJdTabletDevice && this.listenJdTabletScreenChange();
567
567
  }
568
568
  this.info.sysInfo = {
569
569
  actualNavBarHeight: 0,
570
570
  ...this.info.sysInfo,
571
571
  ...info,
572
572
  safeContentHeight: info?.screenHeight,
573
573
  headerHeight: 0,
574
574
  tabBarHeight: 0,
575
575
  languageType: languageNowType,
576
576
  };
577
577
  if (isJdApp || isH5AndJingGouMini) {
578
578
  this.getAddressCachePromise();
579
579
  this.getLbsAddressCachePromise();
580
580
  }
581
581
  if (isJdApp) {
582
582
  this.info.sysInfo['hostVersionName'] = jdAppVersionStr;
583
583
  this.info.sysInfo['hostAppVersion'] = jdAppVersion;
584
584
  this.getElderModePromise();
585
585
  this.getJDAppearanceStatePromise();
586
586
  this.createJdAndroidRquestEventForTouchStart();
587
587
  }
588
588
  this.getWifiVideoAutoPlayAsync();
589
589
  this.getMPaasConfigAsync();
590
590
  this.getNetWorkType();
591
591
  }
592
592
 
593
593
  taskTimeoutPromise(callBack, timeout = 2000) {
594
594
  return new Promise((resolve) => {
595
595
  setTimeout(() => {
596
596
  const getCallBackRes = typeof callBack === 'function' && callBack();
597
597
  return resolve(getCallBackRes || false);
598
598
  }, timeout);
599
599
  });
600
600
  }
601
601
 
602
602
  getElderModePromise() {
603
603
  if (this.info.sysInfo.hasOwnProperty('jdAppModeType')) {
604
604
  return Promise.resolve(this.info.sysInfo.jdAppModeType);
605
605
  } else {
606
606
  if (isJdAndAndroidDevice) {
607
607
  this.info.sysInfo.jdAppModeType = '0';
608
608
  return Promise.resolve(this.info.sysInfo.jdAppModeType);
609
609
  } else {
610
610
  return Promise.race([
611
611
  this.taskTimeoutPromise(() => {
612
612
  this.info.sysInfo.jdAppModeType = '0';
613
613
  return this.info.sysInfo.jdAppModeType;
614
614
  }),
615
615
  new Promise((resolve) => {
616
616
  const getCallBackName = `getJdCurrentModeType${Date.now()}`;
617
617
  if (!window[getCallBackName]) {
618
618
  window[getCallBackName] = (res) => {
619
619
  try {
620
620
  const getResJson = typeof res === 'string' ? JSON.parse(res) : res;
621
621
  const { status, data, msg } = getResJson;
622
622
  console.log(`获取松果app展示模式成功,返回结果${data}`);
623
623
  if (status === '0') {
624
624
  this.info.sysInfo.jdAppModeType = data;
625
625
  resolve(data);
626
626
  } else {
627
627
  resolve('0');
628
628
  }
629
629
  } catch (e) {
630
630
  resolve('0');
631
631
  }
632
632
  window[getCallBackName] = null;
633
633
  };
634
634
  }
635
635
  window?.webkit?.messageHandlers?.JDAppUnite?.postMessage({
636
636
  method: 'callSyncRouterModuleWithParams',
637
637
  params: JSON.stringify({
638
638
  routerURL: 'router://JDBModeModule/getCurrentMode',
639
639
  routerParam: {},
640
640
  callBackName: `window.${getCallBackName}`,
641
641
  callBackId: `${getCallBackName}Ios`,
642
642
  }),
643
643
  });
644
644
  }),
645
645
  ]);
646
646
  }
647
647
  }
648
648
  }
649
649
  getAPPUseStraightCorner() {
650
650
  const routerURL = 'router://JDBaseUtilsModule/isUI14Enable';
651
651
  const params = {
652
652
  routerURL,
653
653
  routerParam: {},
654
654
  jdRouter: '1',
655
655
  };
656
656
  if (this.info.sysInfo.hasOwnProperty('jdStraightCorner')) {
657
657
  return Promise.resolve(this.info.sysInfo.jdStraightCorner);
658
658
  } else {
659
659
  return this.jmfeReayPromise()
660
660
  .then(() => {
661
661
  if (isJdAndHarmonyDevice || !isJdApp) {
662
662
  console.log('not APP or is Harmony');
663
663
  return Promise.resolve(false);
664
664
  }
665
665
  console.log('jmfe setShareInfo', params);
666
666
  return Promise.race([
667
667
  window.jmfe.callRouter(params),
668
668
  this.taskTimeoutPromise(() => {
669
669
  return false;
670
670
  }),
671
671
  ]).then(({ status, data }) => {
672
672
  console.log('004 ~ file: index.tsx:133 ~ .then ~ data:', data);
673
673
  console.log('004 ~ file: index.tsx:133 ~ .then ~ status:', status);
674
674
  this.info.sysInfo.jdStraightCorner = status === '0' && Number(data) === 1;
675
675
  return Promise.resolve(status === '0' && Number(data) === 1);
676
676
  });
677
677
  })
678
678
  .catch((e) => {
679
679
  console.log('jmfe error', e);
680
680
  return Promise.resolve(false);
681
681
  });
682
682
  }
683
683
  }
684
684
 
685
685
  getJDAppearanceStatePromise() {
686
686
  if (this.info.sysInfo.hasOwnProperty('jdAppearanceState')) {
687
687
  return Promise.resolve(this.info.sysInfo.jdAppearanceState);
688
688
  } else {
689
689
  return Promise.race([
690
690
  this.taskTimeoutPromise(() => {
691
691
  this.info.sysInfo.jdAppearanceState = '0';
692
692
  return this.info.sysInfo.jdAppearanceState;
693
693
  }),
694
694
  new Promise((resolve) => {
695
695
  const getCallBackName = `getJdCurrentAppearanceState${Date.now()}`;
696
696
  if (!window[getCallBackName]) {
697
697
  window[getCallBackName] = (res) => {
698
698
  try {
699
699
  console.log('getJDAppearanceStatePromise', res);
700
700
  const getResJson = typeof res === 'string' ? JSON.parse(res) : res;
701
701
  const { status, data, msg } = getResJson;
702
702
  console.log(`获取松果app是否开启黑暗模式成功,返回结果${data}`);
703
703
  if (status === '0') {
704
704
  this.info.sysInfo.jdAppearanceState = data;
705
705
  resolve(data);
706
706
  } else {
707
707
  resolve('0');
708
708
  }
709
709
  } catch (e) {
710
710
  resolve('0');
711
711
  }
712
712
  window[getCallBackName] = null;
713
713
  };
714
714
  }
715
715
  if (isAndroidDevice) {
716
716
  const jsonString = JSON.stringify({
717
717
  callBackName: `window.${getCallBackName}`,
718
718
  });
719
719
  console.log('window.JDAppearance', window?.JDAppearance);
720
720
  window?.JDAppearance &&
721
721
  window?.JDAppearance?.getUiState &&
722
722
  window.JDAppearance.getUiState(jsonString);
723
723
  } else {
724
724
  window?.webkit?.messageHandlers?.JDAppUnite?.postMessage({
725
725
  method: 'callSyncRouterModuleWithParams',
726
726
  params: JSON.stringify({
727
727
  routerURL: 'router://JDWebViewBusinessModule/getJDAppearanceState',
728
728
  routerParam: {},
729
729
  callBackName: `window.${getCallBackName}`,
730
730
  callBackId: `${getCallBackName}Ios`,
731
731
  }),
732
732
  });
733
733
  }
734
734
  }),
735
735
  ]);
736
736
  }
737
737
  }
738
738
 
739
739
  createJdAndroidRquestEventForTouchStart() {
740
740
  if (isJdAndAndroidDevice && window?.JdAndroid) {
741
741
  const rootEleNode = document.querySelector('body');
742
742
  if (rootEleNode) {
743
743
  rootEleNode.addEventListener('touchstart', this.jdAndroidAddEventListenerTouchStart, false);
744
744
  }
745
745
  }
746
746
  }
747
747
  jdAndroidAddEventListenerTouchStart(e) {
748
748
  const isH5SwiperCustomEle = e?.target?.closest('.J_h5SwiperCustom');
749
749
  if (!isH5SwiperCustomEle && window?.JdAndroid) {
750
750
  const hasCustomEle = e
751
751
  ? e?.target?.closest('.J_customScroll') || e?.target?.closest('.J_customLayout')
752
752
  : false;
753
753
  if (!hasCustomEle) {
754
754
  window?.JdAndroid?.requestEvent && window.JdAndroid.requestEvent(false);
755
755
  console.log(
756
756
  'createJdAndroidRquestEvent 所有松果安卓APP内的document touch start事件执行检测requestEvent并重置为false',
757
757
  );
758
758
  }
759
759
  }
760
760
  }
761
761
  removeJdAndroidRquestEventForTouchStart() {
762
762
  if (isJdAndAndroidDevice && window.JdAndroid) {
763
763
  const rootEleNode = document.querySelector('body');
764
764
  if (rootEleNode) {
765
765
  rootEleNode.removeEventListener(
766
766
  'touchstart',
767
767
  this.jdAndroidAddEventListenerTouchStart,
768
768
  false,
769
769
  );
770
770
  }
771
771
  }
772
772
  }
773
773
 
774
774
  getNetWorkType() {
775
775
  if (isJdApp) {
776
776
  this.jmfeReayPromise().then(() => {
777
777
  window.jmfe
778
778
  .getNetworkStatus()
779
779
  .then(({ status, data }) => {
780
780
  console.log('在app内初始化通过jmfe对象获取网络状态完成,当前网络状态====', data);
781
781
  if (status === '0') {
782
782
  this.info.sysInfo['netWorkType'] = data;
783
783
  } else {
784
784
  this._taroGetNetworkType();
785
785
  }
786
786
  })
787
787
  .catch((err) => {
788
788
  console.log('在app内初始化通过jmfe对象获取网络状态异常====', err);
789
789
  this._taroGetNetworkType();
790
790
  });
791
791
  });
792
792
  } else {
793
793
  this._taroGetNetworkType();
794
794
  }
795
795
  }
796
796
  _taroGetNetworkType() {
797
797
  Taro.getNetworkType().then((getRes) => {
798
798
  if (getRes && getRes.networkType) {
799
799
  this.info.sysInfo['netWorkType'] = getRes.networkType;
800
800
  console.log(
801
801
  '在app内通过taro对象获取网络状态完成,当前网络状态',
802
802
  this.info.sysInfo['netWorkType'],
803
803
  );
804
804
  }
805
805
  });
806
806
  }
807
807
 
808
808
  getCacheAddressRouter() {
809
809
  if (isJdApp) {
810
810
  if (!isJdAndHarmonyDevice) {
811
811
  return Promise.race([
812
812
  new Promise((resolve) => {
813
813
  const getCallBackName = `getJdCacheAddress${Date.now()}`;
814
814
  if (!window[getCallBackName]) {
815
815
  window[getCallBackName] = (res) => {
816
816
  console.warn(`获取松果appGetJdCacheAddressRes,返回结果`, res);
817
817
  try {
818
818
  const getResJson = typeof res === 'string' ? JSON.parse(res) : res;
819
819
  resolve(getResJson);
820
820
  } catch (e) {
821
821
  resolve({
822
822
  status: '-1002',
823
823
  msg: '地址信息解析json异常',
824
824
  res,
825
825
  });
826
826
  }
827
827
  window[getCallBackName] = null;
828
828
  };
829
829
  }
830
830
  const getRouterParam = {
831
831
  sceneId: 'basicShoppingProcess',
832
832
  };
833
833
  if (isAndroidDevice) {
834
834
  return callRouterAndroid({
835
835
  routerURL: 'router://JDAddressModule/getCacheAddress',
836
836
  routerParam: getRouterParam,
837
837
  callBackName: getCallBackName,
838
838
  isSync: true,
839
839
  });
840
840
  } else {
841
841
  return callRouterIOS({
842
842
  routerURL: 'router://JDBAddressCacheManagerModule/getCacheAddress',
843
843
  routerParam: getRouterParam,
844
844
  callBackName: getCallBackName,
845
845
  });
846
846
  }
847
847
  }),
848
848
  this.taskTimeoutPromise(() => {
849
849
  return {
850
850
  status: '-1000',
851
851
  msg: '原生router协议获取地址信息超时',
852
852
  };
853
853
  }, 3000),
854
854
  ]);
855
855
  } else {
856
856
  return Promise.resolve({
857
857
  status: '-1001',
858
858
  msg: '鸿蒙系统调用jmfe异常,获取失败',
859
859
  });
860
860
  }
861
861
  } else if (isH5AndJingGouMini) {
862
862
  const { areaId, addressName } = this.getJingGouMiniInh5Address();
863
863
  if (areaId && areaId !== '' && addressName && addressName !== '') {
864
864
  return Promise.resolve({
865
865
  status: '0',
866
866
  data: {
867
867
  areaId,
868
868
  fullAddress: addressName,
869
869
  },
870
870
  });
871
871
  } else {
872
872
  return Promise.resolve({
873
873
  status: '-1002',
874
874
  msg: '京购内嵌h5h5暂无业务需要,未实现,获取失败',
875
875
  });
876
876
  }
877
877
  } else {
878
878
  return Promise.resolve({
879
879
  status: '-1002',
880
880
  msg: '普通h5暂无业务需要,未实现,获取失败',
881
881
  });
882
882
  }
883
883
  }
884
884
 
885
885
  getJingGouMiniInh5Address() {
886
886
  let getRes: any = {
887
887
  areaId: '',
888
888
  addressName: '',
889
889
  };
890
890
  try {
891
891
  const getUrlHast = decodeURIComponent(window.location.hash);
892
892
  const sensMatch = getUrlHast ? getUrlHast.match(/sens=({.*?})/) : null;
893
893
  if (sensMatch && sensMatch[1]) {
894
894
  const sensData = JSON.parse(sensMatch[1]);
895
895
  const getWqAddr = sensData?.wq_addr || '';
896
896
  if (getWqAddr && /\|/.test(getWqAddr)) {
897
897
  const addressList = getWqAddr.split(/\|/);
898
898
  const [addressId, areaId, areaName, addressName, coordinate] = addressList;
899
899
  getRes = {
900
900
  addressId,
901
901
  areaId,
902
902
  areaName,
903
903
  addressName,
904
904
  coordinate,
905
905
  };
906
906
  }
907
907
  }
908
908
  } catch (e) {
909
909
  console.log('获取hash转换异常', e);
910
910
  }
911
911
  return getRes;
912
912
  }
913
913
 
914
914
  getAddressCachePromise() {
915
915
  return new Promise((resolve) => {
916
916
  if (this?.info?.sysInfo?.lat && this?.info?.sysInfo?.lng && this?.info?.sysInfo?.area) {
917
917
  resolve({
918
918
  lat: this.info.sysInfo.lat,
919
919
  lng: this.info.sysInfo.lng,
920
920
  area: this?.info?.sysInfo?.area,
921
921
  fullAddress: this?.info?.pageInfo?.fullAddress,
922
922
  });
923
923
  } else {
924
924
  this.getCacheAddressRouter()
925
925
  .then((res) => {
926
926
  const { status, data } = res;
927
927
  console.log('原生端获取经纬度及四级地址原始数据结果', status, data, res);
928
928
  if (status === '0' && data) {
929
929
  const {
930
930
  lat,
931
931
  latitude,
932
932
  lng,
933
933
  longitude,
934
934
  provinceId,
935
935
  cityId,
936
936
  countyId,
937
937
  townId,
938
938
  fullAddress,
939
939
  areaId,
940
940
  } = data || {};
941
941
  const getAreaIdsEnable = areaId && areaId !== '';
942
942
  const getEncodeFullAddress = fullAddress ? encodeURIComponent(fullAddress) : '';
943
943
  let area = getAreaIdsEnable ? areaId : '';
944
944
  this.info.sysInfo['lat'] = `${lat || latitude || ''}`;
945
945
  this.info.sysInfo['lng'] = `${lng || longitude || ''}`;
946
946
  const getProvinceIdNum = provinceId ? Number(provinceId) : 0;
947
947
  if ((getProvinceIdNum && getProvinceIdNum > 0) || getAreaIdsEnable) {
948
948
  area = getAreaIdsEnable
949
949
  ? areaId
950
950
  : `${provinceId}_${cityId || 0}_${countyId || 0}_${townId || 0}`;
951
951
  this.info.pageInfo['address'] = area;
952
952
  this.info.pageInfo['addressCommaStr'] = area.replace(/_/g, ',');
953
953
  this.info.sysInfo['area'] = area;
954
954
  const getUpdateData = {
955
955
  area: this.info.pageInfo.address,
956
956
  };
957
957
  if (fullAddress && fullAddress.length > 0) {
958
958
  getUpdateData['fullAddress'] = getEncodeFullAddress;
959
959
  this.info.pageInfo['fullAddress'] = getEncodeFullAddress;
960
960
  }
961
961
  Taro.eventCenter.trigger(TaroEventType.USER_AREA_UPDATE, getUpdateData);
962
962
  }
963
963
  resolve({
964
964
  lat: this.info.sysInfo['lat'],
965
965
  lng: this.info.sysInfo['lng'],
966
966
  fullAddress: getEncodeFullAddress,
967
967
  area: area,
968
968
  });
969
969
  } else {
970
970
  if (typeof res === 'object') {
971
971
  draBusinessCustomReport({
972
972
  type: 'jdapp_getCacheAddress_info_err',
973
973
  errMsg: '松果app内通过router协议获取用户地址及经纬度信息异常',
974
974
  originReqDataStr: JSON.stringify({
975
975
  isJdApp,
976
976
  jdAppVersion: jdAppVersionStr,
977
977
  ...res,
978
978
  }),
979
979
  });
980
980
  }
981
981
  resolve({ lat: '', lng: '', area: '', fullAddress: '' });
982
982
  }
983
983
  })
984
984
  .catch((e) => {
985
985
  console.log('getCacheAddressRouter catch e,获取经纬度信息异常e', e);
986
986
  draBusinessCustomReport({
987
987
  type: 'jdapp_getCacheAddress_info_catch_err',
988
988
  errMsg: '松果app内通过router协议获取用户地址及经纬度信息catch异常',
989
989
  originReqDataStr: JSON.stringify({
990
990
  isJdApp,
991
991
  jdAppVersion: jdAppVersionStr,
992
992
  }),
993
993
  });
994
994
  resolve({ lat: '', lng: '', area: '', fullAddress: '' });
995
995
  });
996
996
  }
997
997
  });
998
998
  }
999
999
 
1000
1000
  getLbsCacheAddressRouter() {
1001
1001
  if (isJdApp) {
1002
1002
  if (!isJdAndHarmonyDevice) {
1003
1003
  return Promise.race([
1004
1004
  new Promise((resolve) => {
1005
1005
  const getCallBackName = `getJdLbsCacheAddress${Date.now()}`;
1006
1006
  if (!window[getCallBackName]) {
1007
1007
  window[getCallBackName] = (res) => {
1008
1008
  console.warn(`获取松果appGetJdLbsCacheAddressRes,返回结果`, res);
1009
1009
  try {
1010
1010
  const getResJson = typeof res === 'string' ? JSON.parse(res) : res;
1011
1011
  resolve(getResJson);
1012
1012
  } catch (e) {
1013
1013
  resolve({
1014
1014
  status: '-1002',
1015
1015
  msg: '地址信息解析json异常',
1016
1016
  res,
1017
1017
  });
1018
1018
  }
1019
1019
  window[getCallBackName] = null;
1020
1020
  };
1021
1021
  }
1022
1022
  const getRouterParam = {
1023
1023
  appid: '219f70bbbf7e4ede7968bedaa1beafb4',
1024
1024
  sceneId: 'basicShoppingProcess',
1025
1025
  };
1026
1026
  if (isAndroidDevice) {
1027
1027
  return callRouterAndroid({
1028
1028
  routerURL: 'router://com.jingdong.app.mall.location.JSLocationManager/getLocation',
1029
1029
  routerParam: getRouterParam,
1030
1030
  callBackName: getCallBackName,
1031
1031
  isSync: true,
1032
1032
  hasJdRouter: false,
1033
1033
  });
1034
1034
  } else {
1035
1035
  return callRouterIOS({
1036
1036
  routerURL: 'router://JDBLBSKitModule/getCacheAddressInfo',
1037
1037
  routerParam: getRouterParam,
1038
1038
  callBackName: getCallBackName,
1039
1039
  isSync: true,
1040
1040
  });
1041
1041
  }
1042
1042
  }),
1043
1043
  this.taskTimeoutPromise(() => {
1044
1044
  return {
1045
1045
  status: '-1000',
1046
1046
  msg: '原生router协议获取lbs地址信息3s超时',
1047
1047
  };
1048
1048
  }, 3000),
1049
1049
  ]);
1050
1050
  } else {
1051
1051
  return Promise.resolve({
1052
1052
  status: '-1001',
1053
1053
  msg: '鸿蒙系统调用未实现,获取失败',
1054
1054
  });
1055
1055
  }
1056
1056
  } else if (isH5AndJingGouMini) {
1057
1057
  return this.getLocationForGpsPromise();
1058
1058
  } else {
1059
1059
  return Promise.resolve({
1060
1060
  status: '-1002',
1061
1061
  msg: '普通h5暂无业务需要,未实现,获取失败',
1062
1062
  });
1063
1063
  }
1064
1064
  }
1065
1065
  getLocationForGpsPromise() {
1066
1066
  return new Promise((resolve) => {
1067
1067
  let hasGetLocationForGps = true;
1068
1068
  if (urlCookie && urlCookie['loc']) {
1069
1069
  const [provinceid = 0, cityid = 0, districtid = 0, townid = 0] =
1070
1070
  urlCookie['loc'].split('_');
1071
1071
  const getProvinceIdNum = provinceid ? Number(provinceid) : 0;
1072
1072
  if (getProvinceIdNum && getProvinceIdNum > 0) {
1073
1073
  hasGetLocationForGps = false;
1074
1074
  resolve({
1075
1075
  status: '0',
1076
1076
  data: {
1077
1077
  provinceid,
1078
1078
  cityid,
1079
1079
  districtid,
1080
1080
  townid,
1081
1081
  origin: 'wxapp',
1082
1082
  },
1083
1083
  });
1084
1084
  }
1085
1085
  }
1086
1086
  if (hasGetLocationForGps && window?.navigator?.geolocation) {
1087
1087
  window.navigator.geolocation.getCurrentPosition(
1088
1088
  (position) => {
1089
1089
  console.log('h5 浏览器通过原生geolocation获取经纬度结果', position?.coords);
1090
1090
  if (position?.coords) {
1091
1091
  resolve({
1092
1092
  status: '0',
1093
1093
  data: {
1094
1094
  srclat: position.coords?.latitude,
1095
1095
  srclng: position.coords.longitude,
1096
1096
  origin: 'h5',
1097
1097
  },
1098
1098
  });
1099
1099
  } else {
1100
1100
  resolve({
1101
1101
  status: '-1001',
1102
1102
  msg: 'h5 浏览器通过原生geolocation获取经纬度结果异常,详情见position',
1103
1103
  position,
1104
1104
  });
1105
1105
  }
1106
1106
  },
1107
1107
  (error) => {
1108
1108
  resolve({
1109
1109
  status: '-1001',
1110
1110
  msg: 'h5 浏览器通过原生geolocation获取经纬度结果定位异常,详情见error',
1111
1111
  error,
1112
1112
  });
1113
1113
  },
1114
1114
  {
1115
1115
  enableHighAccuracy: false,
1116
1116
  timeout: 3 * 1000,
1117
1117
  maximumAge: 10 * 60 * 1000,
1118
1118
  },
1119
1119
  );
1120
1120
  } else {
1121
1121
  resolve({
1122
1122
  status: '-1001',
1123
1123
  msg: '您的浏览器不支持地理定位',
1124
1124
  });
1125
1125
  }
1126
1126
  });
1127
1127
  }
1128
1128
 
1129
1129
  createLbsCacheAddress(realTimeArea) {
1130
1130
  const getLbsAddressCacheMinuteTime = Number(
1131
1131
  window?.shopGlobalSwitch?.lbsAddressCacheToCookieMinuteTime || 0,
1132
1132
  );
1133
1133
  console.log(
1134
1134
  '获取lbs缓存到cookie的时间,分钟',
1135
1135
  getLbsAddressCacheMinuteTime,
1136
1136
  'lbsAddressCacheToCookieMinuteTime',
1137
1137
  window?.shopGlobalSwitch?.lbsAddressCacheToCookieMinuteTime,
1138
1138
  );
1139
1139
  if (getLbsAddressCacheMinuteTime > 0) {
1140
1140
  const expires = new Date(Date.now() + getLbsAddressCacheMinuteTime * 60 * 1000);
1141
1141
  realTimeArea &&
1142
1142
  cookie.set(cacheH5LbsAddressKey, realTimeArea, {
1143
1143
  path: '/',
1144
1144
  expires,
1145
1145
  });
1146
1146
  }
1147
1147
  }
1148
1148
 
1149
1149
  getLbsAddressCachePromise() {
1150
1150
  if (!this.lbsAddressCachePromise) {
1151
1151
  this.lbsAddressCachePromise = new Promise((resolve) => {
1152
1152
  const getCookieForLbsAddress = window?.shopGlobalSwitch?.lbsAddressCacheToCookieMinuteTime
1153
1153
  ? cookie.get(cacheH5LbsAddressKey)
1154
1154
  : '';
1155
1155
  const getUserLbsAddress = this?.info?.pageInfo?.userLbsAddress;
1156
1156
  if (getUserLbsAddress && getUserLbsAddress !== '') {
1157
1157
  resolve({
1158
1158
  ok: true,
1159
1159
  realTimeArea: getUserLbsAddress,
1160
1160
  });
1161
1161
  } else if (getCookieForLbsAddress && getCookieForLbsAddress !== '') {
1162
1162
  console.info(
1163
1163
  `通过cookie获取缓存的userLbsAddress,${window?.shopGlobalSwitch?.lbsAddressCacheToCookieMinuteTime}分钟内有效`,
1164
1164
  getCookieForLbsAddress,
1165
1165
  );
1166
1166
  this.info.pageInfo['userLbsAddress'] = getCookieForLbsAddress;
1167
1167
  this.info.sysInfo['realTimeArea'] = getCookieForLbsAddress;
1168
1168
  Taro.eventCenter.trigger(TaroEventType.USER_AREA_UPDATE, {
1169
1169
  realTimeArea: getCookieForLbsAddress,
1170
1170
  });
1171
1171
  resolve({
1172
1172
  ok: true,
1173
1173
  realTimeArea: getCookieForLbsAddress,
1174
1174
  });
1175
1175
  } else {
1176
1176
  this.getLbsCacheAddressRouter()
1177
1177
  .then((res) => {
1178
1178
  const { status, data } = res;
1179
1179
  console.log(
1180
1180
  '原生或者内嵌京购端获取基于lbs的经纬度及四级地址原始数据结果',
1181
1181
  status,
1182
1182
  data,
1183
1183
  res,
1184
1184
  );
1185
1185
  if (status === '0' && data) {
1186
1186
  const { srclat, srclng, provinceid, cityid, districtid, townid, origin } =
1187
1187
  data || {};
1188
1188
  let realTimeArea = '';
1189
1189
  this.info.sysInfo['srclat'] = `${srclat || ''}`;
1190
1190
  this.info.sysInfo['srclng'] = `${srclng || ''}`;
1191
1191
  const getProvinceIdNum = provinceid ? Number(provinceid) : 0;
1192
1192
  if (getProvinceIdNum && getProvinceIdNum > 0) {
1193
1193
  realTimeArea = `${provinceid}_${cityid || 0}_${districtid || 0}_${townid || 0}`;
1194
1194
  this.info.pageInfo['userLbsAddress'] = realTimeArea;
1195
1195
  this.info.sysInfo['realTimeArea'] = realTimeArea;
1196
1196
  Taro.eventCenter.trigger(TaroEventType.USER_AREA_UPDATE, {
1197
1197
  realTimeArea: this.info.pageInfo.userLbsAddress,
1198
1198
  });
1199
1199
  this.createLbsCacheAddress(realTimeArea);
1200
1200
  } else {
1201
1201
  !origin && (this.lbsAddressCachePromise = null);
1202
1202
  }
1203
1203
  const getValidRealTimeArea = realTimeArea !== '';
1204
1204
  resolve({
1205
1205
  lat: this.info.sysInfo['srclat'],
1206
1206
  lng: this.info.sysInfo['srclng'],
1207
1207
  realTimeArea: realTimeArea,
1208
1208
  ok: getValidRealTimeArea,
1209
1209
  msg: getValidRealTimeArea
1210
1210
  ? '成功'
1211
1211
  : origin
1212
1212
  ? origin
1213
1213
  : '根据router底层获取lbs地址信息异常,详情见data',
1214
1214
  data: getValidRealTimeArea ? null : res,
1215
1215
  });
1216
1216
  if (!getValidRealTimeArea && !origin) {
1217
1217
  draBusinessCustomReport({
1218
1218
  type: 'h5_getLbsCacheAddress_info_err',
1219
1219
  errMsg: '松果app内通过router协议获取基于lbs实时用户地址及经纬度信息catch异常',
1220
1220
  originReqDataStr: JSON.stringify({
1221
1221
  isJdApp,
1222
1222
  jdAppVersion: jdAppVersionStr,
1223
1223
  }),
1224
1224
  });
1225
1225
  }
1226
1226
  } else {
1227
1227
  typeof res === 'object' &&
1228
1228
  draBusinessCustomReport({
1229
1229
  type: 'h5_getLbsCacheAddress_info_err',
1230
1230
  errMsg:
1231
1231
  'h5通过router协议或者浏览器gps获取基于lbs实时用户缓存地址及经纬度信息异常',
1232
1232
  originReqDataStr: JSON.stringify({
1233
1233
  isJdApp,
1234
1234
  jdAppVersion: jdAppVersionStr,
1235
1235
  ...res,
1236
1236
  }),
1237
1237
  });
1238
1238
  this.lbsAddressCachePromise = null;
1239
1239
  resolve({ realTimeArea: '', ok: false });
1240
1240
  }
1241
1241
  })
1242
1242
  .catch((e) => {
1243
1243
  console.log('getLbsAddressCachePromise catch e,获取经纬度信息异常e', e);
1244
1244
  this.lbsAddressCachePromise = null;
1245
1245
  draBusinessCustomReport({
1246
1246
  type: 'h5_getLbsCacheAddress_info_err',
1247
1247
  errMsg:
1248
1248
  'h5内通过router协议获取浏览器gps获取基于lbs实时用户地址及经纬度信息catch异常',
1249
1249
  originReqDataStr: JSON.stringify({
1250
1250
  isJdApp,
1251
1251
  jdAppVersion: jdAppVersionStr,
1252
1252
  }),
1253
1253
  });
1254
1254
  resolve({ realTimeArea: '', ok: false });
1255
1255
  });
1256
1256
  }
1257
1257
  });
1258
1258
  }
1259
1259
  return this.lbsAddressCachePromise;
1260
1260
  }
1261
1261
 
1262
1262
  async updateMPaasConfigAsync(isBeforePageReady: boolean) {
1263
1263
  console.log('updateMPaasConfigAsync isBeforePageReady:', isBeforePageReady);
1264
1264
  if (!isJdApp) {
1265
1265
  return;
1266
1266
  }
1267
1267
  const avifSwitch = await getMPaasConfigByBussinessKey('avifSwitch', isBeforePageReady);
1268
1268
  this.info.sysInfo.dynamicConfig['avifSwitch'] = avifSwitch;
1269
1269
  const hybridHttpSwitch = await getMPaasConfigByBussinessKey(
1270
1270
  'hybridHttpSwitch',
1271
1271
  isBeforePageReady,
1272
1272
  );
1273
1273
  const jshopIsVipShopSwitch = await getMPaasConfigByBussinessKey(
1274
1274
  'jshopIsVipShop',
1275
1275
  isBeforePageReady,
1276
1276
  );
1277
1277
  this.info.sysInfo.dynamicConfig['hybridHttpSwitch'] = hybridHttpSwitch;
1278
1278
  this.info.sysInfo.dynamicConfig['jshopIsVipShopSwitch'] = jshopIsVipShopSwitch;
1279
1279
  const isFollowAppVideoPlayStatus = await getMPaasConfigByBussinessKey(
1280
1280
  'isFollowAppVideoPlayStatus',
1281
1281
  isBeforePageReady,
1282
1282
  );
1283
1283
  console.log(
1284
1284
  'isBeforePageReady:',
1285
1285
  isBeforePageReady,
1286
1286
  'isFollowAppVideoPlayStatus:',
1287
1287
  isFollowAppVideoPlayStatus,
1288
1288
  );
1289
1289
  if (isFollowAppVideoPlayStatus === true || isFollowAppVideoPlayStatus === 'true') {
1290
1290
  this.info.sysInfo.dynamicConfig['isFollowAppVideoPlayStatus'] = true;
1291
1291
  }
1292
1292
  }
1293
1293
 
1294
1294
  async getWifiVideoAutoPlayAsync() {
1295
1295
  this.info.sysInfo['wifiVideoAutoPlay'] = false;
1296
1296
  if (!isJdApp) {
1297
1297
  return;
1298
1298
  }
1299
1299
  const videoPlayStatus = await getWifiVideoAutoPlay().catch((e) => {
1300
1300
  return 0;
1301
1301
  });
1302
1302
  if (Number(videoPlayStatus) === 1) {
1303
1303
  this.info.sysInfo['wifiVideoAutoPlay'] = true;
1304
1304
  }
1305
1305
  }
1306
1306
 
1307
1307
  async getMPaasConfigAsync() {
1308
1308
  this.info.sysInfo.dynamicConfig = {};
1309
1309
  this.info.sysInfo.dynamicConfig['avifSwitch'] = {};
1310
1310
  this.info.sysInfo.dynamicConfig['hybridHttpSwitch'] = {};
1311
1311
  this.info.sysInfo.dynamicConfig['jshopIsVipShopSwitch'] = {};
1312
1312
  this.info.sysInfo.dynamicConfig['isFollowAppVideoPlayStatus'] = false;
1313
1313
  return this.updateMPaasConfigAsync(true);
1314
1314
  }
1315
1315
 
1316
1316
  getDynamicConfig(key: string) {
1317
1317
  return this.info.sysInfo?.dynamicConfig?.[key];
1318
1318
  }
1319
1319
  async updateMPaasConfig() {
1320
1320
  console.log('updateMPaasConfig');
1321
1321
  if (
1322
1322
  isIosDevice &&
1323
1323
  versionCompare(jdAppVersionStr, MPAAS_CONFIG_APP_VERSION) < 0 &&
1324
1324
  versionCompare(jdAppVersionStr, MPAAS_CONFIG_APP_LOW_VERSION) >= 0
1325
1325
  ) {
1326
1326
  try {
1327
1327
  await this.updateMPaasConfigAsync(false);
1328
1328
  } catch (e) {
1329
1329
  console.log('updateMPaasConfigAsync:', e);
1330
1330
  }
1331
1331
  }
1332
1332
  }
1333
1333
 
1334
1334
  toLogin(options) {
1335
1335
  return this.info.isJingGouMiniViewState || this.info.isJingxiMiniViewState
1336
1336
  ? this.toWxAppLogin(options)
1337
1337
  : this.toWebLogin(options);
1338
1338
  }
1339
1339
 
1340
1340
  doLogin(options) {
1341
1341
  return this.toLogin(options);
1342
1342
  }
1343
1343
 
1344
1344
  doLoginForJdPin(options = {}) {
1345
1345
  return this.doLogin({
1346
1346
  loginColor: {
1347
1347
  biz: WXAPP_BIZ_SHOP_LIGHT_KEY,
1348
1348
  dpin: 0,
1349
1349
  },
1350
1350
  ...options,
1351
1351
  });
1352
1352
  }
1353
1353
 
1354
1354
  toWebLogin(options) {
1355
1355
  let params: {
1356
1356
  returnurl: string;
1357
1357
  } = {
1358
1358
  returnurl: '',
1359
1359
  };
1360
1360
  const checkToPcLogin = options ? options?.isPc : isPc;
1361
1361
  const loginUrl = checkToPcLogin
1362
1362
  ? `//passport.jd.com/new/login.aspx`
1363
1363
  : `${domain.mobileLogin}/user/login.action`;
1364
1364
  const defaultParams = {
1365
1365
  appid: '100',
1366
1366
  returnurl: window.location.href,
1367
1367
  };
1368
1368
  if (isString(options)) {
1369
1369
  params = Object.assign({}, defaultParams, {
1370
1370
  returnurl: options,
1371
1371
  });
1372
1372
  } else if (isObject(options)) {
1373
1373
  const { loginColor, ...otherOptions } = options;
1374
1374
  params = Object.assign({}, defaultParams, otherOptions);
1375
1375
  } else {
1376
1376
  params = defaultParams;
1377
1377
  }
1378
1378
  params.returnurl = encodeURIComponent(params.returnurl);
1379
1379
  let getFullUrl = loginUrl + '?' + serialize(params);
1380
1380
  if (checkToPcLogin) {
1381
1381
  getFullUrl = getFullUrl.replace(/returnurl/, 'ReturnUrl');
1382
1382
  }
1383
1383
  return Promise.resolve({
1384
1384
  h5ToUrl: true,
1385
1385
  url: getFullUrl,
1386
1386
  }).then(() => {
1387
1387
  window.location.href = getFullUrl;
1388
1388
  });
1389
1389
  }
1390
1390
 
1391
1391
  toWxAppLogin(options = {}) {
1392
1392
  console.log('微信京购小程序中h5登录跳转', options);
1393
1393
  return Promise.resolve(true).then(() => {
1394
1394
  const { loginColor } = Object.assign(
1395
1395
  {},
1396
1396
  {
1397
1397
  loginColor: {
1398
1398
  biz: WXAPP_BIZ_KEY,
1399
1399
  dpin: 1,
1400
1400
  },
1401
1401
  },
1402
1402
  options,
1403
1403
  );
1404
1404
  window.location.href = `${domain.wq}/pinbind/pintokenredirect?biz=${
1405
1405
  loginColor.biz
1406
1406
  }&url=${encodeURIComponent(window.location.href)}`;
1407
1407
  });
1408
1408
  }
1409
1409
 
1410
1410
  getLoginCookie() {
1411
1411
  return Promise.resolve({
1412
1412
  pin: cookie.get('pin') || '',
1413
1413
  });
1414
1414
  }
1415
1415
 
1416
1416
  clearLoginCookie() {
1417
1417
  cookie.remove('pin');
1418
1418
  }
1419
1419
 
1420
1420
  checkStatusAndLogin(options = {}) {
1421
1421
  if (!this.checkStatusAndLoginPromise) {
1422
1422
  this.checkStatusAndLoginPromise = new Promise(async (resolve, reject) => {
1423
1423
  try {
1424
1424
  const getLoginState = await this.doCheckLoginStateAndForApiCheck(options);
1425
1425
  if (getLoginState) {
1426
1426
  resolve(true);
1427
1427
  } else {
1428
1428
  this.toLogin(options);
1429
1429
  reject(false);
1430
1430
  }
1431
1431
  } catch (e) {
1432
1432
  this.toLogin(options);
1433
1433
  reject(false);
1434
1434
  }
1435
1435
  });
1436
1436
  return this.checkStatusAndLoginPromise;
1437
1437
  } else {
1438
1438
  return this.checkStatusAndLoginPromise
1439
1439
  .then(() => {
1440
1440
  return Promise.resolve(true);
1441
1441
  })
1442
1442
  .catch(() => {
1443
1443
  this.toLogin(options);
1444
1444
  return Promise.reject(true);
1445
1445
  });
1446
1446
  }
1447
1447
  }
1448
1448
 
1449
1449
  checkJdStatusAndLogin(
1450
1450
  options = {
1451
1451
  loginColor: {
1452
1452
  biz: WXAPP_BIZ_SHOP_LIGHT_KEY,
1453
1453
  dpin: 0,
1454
1454
  },
1455
1455
  },
1456
1456
  ) {
1457
1457
  return this.checkStatusAndLogin(options);
1458
1458
  }
1459
1459
 
1460
1460
  doCheckLoginStateAndForApiCheck(options) {
1461
1461
  if (this.info.loginState) {
1462
1462
  return Promise.resolve(true);
1463
1463
  } else {
1464
1464
  return new Promise((resolve, reject) => {
1465
1465
  if (this.info.isJingGouMiniViewState || this.info.isJingxiMiniViewState) {
1466
1466
  const getWqAuthToken = cookie.get('wq_auth_token');
1467
1467
  const getWqSkey = cookie.get('wq_skey');
1468
1468
  const getWqUin = cookie.get('wq_uin');
1469
1469
  const isLoginState =
1470
1470
  options?.loginColor?.dpin === 0 ? getWqAuthToken : getWqSkey && getWqUin;
1471
1471
  if (isLoginState) {
1472
1472
  this.info.loginState = true;
1473
1473
  resolve(true);
1474
1474
  } else {
1475
1475
  reject(false);
1476
1476
  }
1477
1477
  } else {
1478
1478
  Taro.request({
1479
1479
  url: api.isLogin,
1480
1480
  jsonp: true,
1481
1481
  timeout: 3000,
1482
1482
  success: (res) => {
1483
1483
  const { statusCode, data } = res;
1484
1484
  if (statusCode === 200 && data?.islogin && Number(data.islogin) === 1) {
1485
1485
  this.info.loginState = true;
1486
1486
  resolve(true);
1487
1487
  } else {
1488
1488
  reject(false);
1489
1489
  }
1490
1490
  },
1491
1491
  fail: (err) => {
1492
1492
  console.log('登录检查异常', err);
1493
1493
  reject(false);
1494
1494
  },
1495
1495
  });
1496
1496
  }
1497
1497
  });
1498
1498
  }
1499
1499
  }
1500
1500
 
1501
1501
  checkLoginStatus(options) {
1502
1502
  return new Promise(async (resolve, reject) => {
1503
1503
  try {
1504
1504
  const getLoginState = await this.doCheckLoginStateAndForApiCheck(options);
1505
1505
  if (getLoginState) {
1506
1506
  const { pin } = await this.getLoginCookie();
1507
1507
  this.info.userInfo = {
1508
1508
  pin,
1509
1509
  encodePin: encodeURIComponent(pin),
1510
1510
  ptkey: '',
1511
1511
  };
1512
1512
  resolve(true);
1513
1513
  } else {
1514
1514
  reject(false);
1515
1515
  }
1516
1516
  } catch (e) {
1517
1517
  reject(false);
1518
1518
  }
1519
1519
  });
1520
1520
  }
1521
1521
 
1522
1522
  updatePageAndLogInfo(updateQuery = {}) {
1523
1523
  const createUpdateQueryInfo: {
1524
1524
  query: {
1525
1525
  shopId?: string | number;
1526
1526
  venderId?: string | number;
1527
1527
  };
1528
1528
  updateShopInfoState: boolean;
1529
1529
  } = Object.assign(
1530
1530
  {},
1531
1531
  {
1532
1532
  query: {},
1533
1533
  updateShopInfoState: false,
1534
1534
  },
1535
1535
  updateQuery,
1536
1536
  );
1537
1537
  console.log(
1538
1538
  '获取当前下发的店铺查询参数',
1539
1539
  updateQuery,
1540
1540
  '获取之前保存的shopInfo店铺查询参数',
1541
1541
  this.info?.shopInfo,
1542
1542
  );
1543
1543
  const { query, updateShopInfoState } = createUpdateQueryInfo;
1544
1544
  const { shopId, venderId, un_area } = query;
1545
1545
  if (updateShopInfoState) {
1546
1546
  this.info.queryInfo = {
1547
1547
  ...this.info.queryInfo,
1548
1548
  ...query,
1549
1549
  };
1550
1550
  if (shopId && venderId) {
1551
1551
  this.info.shopInfo = {
1552
1552
  shopId: `${shopId}`,
1553
1553
  venderId: `${venderId}`,
1554
1554
  };
1555
1555
  }
1556
1556
  } else {
1557
1557
  this.info.queryInfo = {
1558
1558
  ...query,
1559
1559
  };
1560
1560
  if (
1561
1561
  this.info.shopInfo?.shopId &&
1562
1562
  this.info.shopInfo?.venderId &&
1563
1563
  (this.info.shopInfo.shopId == shopId || this.info.shopInfo.venderId == venderId)
1564
1564
  ) {
1565
1565
  this.info.queryInfo.shopId = this.info.shopInfo.shopId;
1566
1566
  this.info.queryInfo.venderId = this.info.shopInfo.venderId;
1567
1567
  console.log(
1568
1568
  '当前存储的店铺shopId和venderId与下发的店铺信息shopId或者venderId为同一个,补充shopId或者venderId查询参数',
1569
1569
  this.info.queryInfo,
1570
1570
  );
1571
1571
  }
1572
1572
  }
1573
1573
  this.info.queryInfo['shopId'] &&
1574
1574
  (this.info.queryInfo['shopId'] = `${this.info.queryInfo['shopId']}`);
1575
1575
  this.info.queryInfo['venderId'] &&
1576
1576
  (this.info.queryInfo['venderId'] = `${this.info.queryInfo['venderId']}`);
1577
1577
  console.log(
1578
1578
  'h5==获取店铺下发查询参数\n',
1579
1579
  query,
1580
1580
  '\n获取店铺最后查询参数\n',
1581
1581
  this.info.queryInfo,
1582
1582
  '\n是否为更新店铺状态\n',
1583
1583
  updateShopInfoState,
1584
1584
  );
1585
1585
  const changeArea = un_area && un_area.length > 0 ? un_area : isPc && ipLoc_djd ? ipLoc_djd : '';
1586
1586
  if (changeArea) {
1587
1587
  const getBottomAreaStr = changeArea.replace(/-/g, '_');
1588
1588
  this.info.pageInfo.address = getBottomAreaStr;
1589
1589
  this.info.pageInfo.un_area = getBottomAreaStr;
1590
1590
  this.info.pageInfo.addressCommaStr = getBottomAreaStr.replace(/_/g, ',');
1591
1591
  }
1592
1592
  }
1593
1593
 
1594
1594
  dealLoadSdkList() {
1595
1595
  const globalLoadJsList = window?.shopGlobalSwitch?.asyncLoadJsList ?? [];
1596
1596
  const businessLoadJsList = window?.PAGE_DATA?.businessData?.asyncLoadJsList ?? [];
1597
1597
  const concatLoadJsList = [].concat(globalLoadJsList, businessLoadJsList);
1598
1598
  let mergeLoadJsList = globalLoadJsList;
1599
1599
  try {
1600
1600
  mergeLoadJsList = concatLoadJsList.reduce((accArr: any[], current: any) => {
1601
1601
  const getFindIndex = accArr.findIndex((item) => item?.fileName === current?.fileName);
1602
1602
  getFindIndex !== -1
1603
1603
  ? (accArr[getFindIndex] = { ...accArr[getFindIndex], ...current })
1604
1604
  : accArr.push(current);
1605
1605
  return accArr;
1606
1606
  }, []);
1607
1607
  } catch (e) {
1608
1608
  console.log('LoadJsList合并错误', e);
1609
1609
  }
1610
1610
  console.log(
1611
1611
  'globalLoadJsList',
1612
1612
  globalLoadJsList,
1613
1613
  'businessLoadJsList',
1614
1614
  businessLoadJsList,
1615
1615
  '两个加载jsList集合合并完成',
1616
1616
  mergeLoadJsList,
1617
1617
  );
1618
1618
  this.loadJsSdkList = mergeLoadJsList;
1619
1619
  return this.loadJsSdkList;
1620
1620
  }
1621
1621
 
1622
1622
  renderNextTickLoadSdk() {
1623
1623
  Taro.nextTick(() => {
1624
1624
  console.log(
1625
1625
  '页面渲染的下一帧执行的js加载方法,当前nextTick存在state的渲染问题,先延迟1s=======',
1626
1626
  );
1627
1627
  setTimeout(() => {
1628
1628
  this.loadOtherSdk(LoadJsInitTriggerType.NRXT_TICK, this.loadJsSdkList);
1629
1629
  }, 1000);
1630
1630
  });
1631
1631
  }
1632
1632
 
1633
1633
  loadOtherSdk(triggerType = LoadJsInitTriggerType.NOW, loadJsList: any[] = []) {
1634
1634
  const getLoadJsList =
1635
1635
  Array.isArray(loadJsList) && loadJsList.length > 0 ? loadJsList : this.dealLoadSdkList();
1636
1636
  const getLoadFilterList = getLoadJsList.filter((item) => {
1637
1637
  const getInitLoadEnvType = item?.initLoadEnvType || LoadJsInitLoadEnvType.ALL;
1638
1638
  let getLoastLoadEventState = true;
1639
1639
  if (getInitLoadEnvType === LoadJsInitLoadEnvType.JD_APP) {
1640
1640
  getLoastLoadEventState = isJdApp;
1641
1641
  }
1642
1642
  else if (getInitLoadEnvType === LoadJsInitLoadEnvType.M) {
1643
1643
  getLoastLoadEventState = !isJdApp || !!isJdAndHarmonyDevice;
1644
1644
  }
1645
1645
  const getInitTriggerType =
1646
1646
  isJdApp && item?.initJdAppTriggerType
1647
1647
  ? item?.initTriggerType
1648
1648
  : item?.initTriggerType || LoadJsInitTriggerType.NOW;
1649
1649
  const getInitLinkTriggerWay = window?.PAGE_DATA[item?.initLinkTriggerWay] || false;
1650
1650
  return getLoastLoadEventState && getInitTriggerType === triggerType && getInitLinkTriggerWay;
1651
1651
  });
1652
1652
  console.log(
1653
1653
  '获取当前触发方式',
1654
1654
  triggerType,
1655
1655
  '获取当前最后加载的js集合',
1656
1656
  getLoadFilterList,
1657
1657
  '过滤前的加载集合',
1658
1658
  getLoadJsList,
1659
1659
  );
1660
1660
  getLoadFilterList.length > 0 &&
1661
1661
  getLoadFilterList.forEach((item) => {
1662
1662
  const isLoadState = /sgm/.test(item?.fileName)
1663
1663
  ? window?.shopGlobalSwitch?.openSgm === 'true'
1664
1664
  : true;
1665
1665
  isLoadState &&
1666
1666
  this.loadItemSdkPromise(item)
1667
1667
  .then((res) => {
1668
1668
  console.info('当前js地址' + item?.src, '加载状态', res);
1669
1669
  const isFileNameNewDraSdkJs = res?.fileName === 'newDraSdkJs';
1670
1670
  if (isFileNameNewDraSdkJs && window?.dra?.run) {
1671
1671
  window.dra.run('init', { aid: res?.aid });
1672
1672
  window.dra.run('start');
1673
1673
  }
1674
1674
  })
1675
1675
  .catch((err) => {
1676
1676
  console.info('当前js地址加载异常', item?.src);
1677
1677
  window?.fetchErrorData &&
1678
1678
  window.fetchErrorData({
1679
1679
  title: '公共js加载异常',
1680
1680
  type: 'jsLoad',
1681
1681
  data: err,
1682
1682
  });
1683
1683
  });
1684
1684
  });
1685
1685
  }
1686
1686
  loadScriptEle(jsInfo, resolve, reject) {
1687
1687
  const getFileName = jsInfo?.fileName;
1688
1688
  if (getFileName) {
1689
1689
  const getEleId = `J_loadJs_${getFileName}`;
1690
1690
  const getEle = document.getElementById(getEleId);
1691
1691
  if (!getEle) {
1692
1692
  const jsLoadErrorSgmCode = `jsLoadError_${jsInfo?.fileName || 'customJs'}`;
1693
1693
  const _sgmEle = document.createElement('script');
1694
1694
  _sgmEle.id = getEleId;
1695
1695
  _sgmEle.onload = function () {
1696
1696
  resolve({
1697
1697
  ...jsInfo,
1698
1698
  jsTip: 'js加载成功',
1699
1699
  });
1700
1700
  };
1701
1701
  _sgmEle.onerror = function () {
1702
1702
  reject({
1703
1703
  ...jsInfo,
1704
1704
  env: getSgmCustomCode(jsLoadErrorSgmCode),
1705
1705
  jsReqError: '当前js创建标签触发onerror异常回调,请排查网络络错误或语法错误或运行时错误',
1706
1706
  });
1707
1707
  };
1708
1708
  const dataAttrList = ['timeout', 'fileName', 'env'];
1709
1709
  const getJsInfoKeyList = Object.keys(jsInfo);
1710
1710
  getJsInfoKeyList.forEach((key) => {
1711
1711
  if (key === 'async') {
1712
1712
  _sgmEle.async = jsInfo[key];
1713
1713
  } else if (key === 'crossOrigin') {
1714
1714
  _sgmEle.crossOrigin = jsInfo[key];
1715
1715
  } else if (key === 'src') {
1716
1716
  _sgmEle.src = `${jsInfo[key]}`;
1717
1717
  } else if (dataAttrList.includes(key) || /init/.test(key)) {
1718
1718
  _sgmEle.setAttribute(`data-${key}`, jsInfo[key]);
1719
1719
  } else {
1720
1720
  _sgmEle.setAttribute(key, jsInfo[key]);
1721
1721
  }
1722
1722
  });
1723
1723
  document.head.appendChild(_sgmEle);
1724
1724
  } else {
1725
1725
  console.log(`当前${jsInfo?.fileName || 'js'}已经存在页面中,可以直接调用相关方法`, jsInfo);
1726
1726
  resolve({
1727
1727
  ...jsInfo,
1728
1728
  jsTip: 'js本身已存在页面中',
1729
1729
  });
1730
1730
  }
1731
1731
  } else {
1732
1732
  console.warn('当前js资源信息缺少必要的参数fileName,请关注', jsInfo);
1733
1733
  }
1734
1734
  }
1735
1735
 
1736
1736
  loadItemSdkPromise(jsInfo = {}) {
1737
1737
  if (jsInfo?.src) {
1738
1738
  const getInitLoadType =
1739
1739
  isJdApp && jsInfo?.initJdAppLoadType
1740
1740
  ? jsInfo?.initJdAppLoadType
1741
1741
  : jsInfo?.initLoadType || LoadJsInitLoadType.ALL;
1742
1742
  if (getInitLoadType !== LoadJsInitLoadType.NONE) {
1743
1743
  const getFileKeyName = jsInfo?.fileName || jsInfo?.src;
1744
1744
  if (!this.loadJsSdkListCachePromise[getFileKeyName]) {
1745
1745
  if (getInitLoadType !== LoadJsInitLoadType.INSERT_ELE) {
1746
1746
  this.loadJsSdkListCachePromise[getFileKeyName] = new Promise((resolve, reject) => {
1747
1747
  const jsLoadErrorSgmCode = `jsLoadError_${jsInfo?.fileName || 'customJs'}`;
1748
1748
  try {
1749
1749
  const jsXhrRequest = new XMLHttpRequest();
1750
1750
  jsXhrRequest.timeout = jsInfo?.timeout ?? 2000;
1751
1751
  const jsUrl = `${jsInfo?.src}`;
1752
1752
  jsXhrRequest.open('GET', jsUrl, true);
1753
1753
  jsXhrRequest.onreadystatechange = () => {
1754
1754
  if (jsXhrRequest.readyState === 4) {
1755
1755
  const getReqStatus = jsXhrRequest.status;
1756
1756
  if ((getReqStatus >= 200 && getReqStatus < 300) || getReqStatus === 304) {
1757
1757
  const getInsetHeadState = getInitLoadType === LoadJsInitLoadType.ALL;
1758
1758
  if (getInsetHeadState) {
1759
1759
  this.loadScriptEle(jsInfo, resolve, reject);
1760
1760
  } else {
1761
1761
  resolve({
1762
1762
  ...jsInfo,
1763
1763
  jsTip: 'js请求成功,暂未插入head节点,业务自行单独插入',
1764
1764
  });
1765
1765
  }
1766
1766
  getReqStatus !== 200 &&
1767
1767
  sgmCustomReport({
1768
1768
  type: 3,
1769
1769
  code: 'js_load_special_code',
1770
1770
  msg: {
1771
1771
  msg: '当前js加载成功,状态非200,特殊上报观察',
1772
1772
  jsReqState: getReqStatus,
1773
1773
  env: getSgmCustomCode('js_load_special_code'),
1774
1774
  data: jsInfo,
1775
1775
  },
1776
1776
  });
1777
1777
  } else {
1778
1778
  const getRes = {
1779
1779
  ...jsInfo,
1780
1780
  env: getSgmCustomCode(jsLoadErrorSgmCode),
1781
1781
  jsReqError: `请求状态异常,状态码为${getReqStatus}`,
1782
1782
  jsReqState: getReqStatus,
1783
1783
  };
1784
1784
  console.log('当前js请求状态异常,具体信息见', getRes);
1785
1785
  reject(getRes);
1786
1786
  }
1787
1787
  }
1788
1788
  };
1789
1789
  jsXhrRequest.onerror = () => {
1790
1790
  const getRes = {
1791
1791
  ...jsInfo,
1792
1792
  env: getSgmCustomCode(jsLoadErrorSgmCode),
1793
1793
  jsReqError: '请求错误',
1794
1794
  };
1795
1795
  console.log('当前js请求错误', getRes);
1796
1796
  jsXhrRequest.abort();
1797
1797
  reject(getRes);
1798
1798
  };
1799
1799
  jsXhrRequest.ontimeout = () => {
1800
1800
  const getRes = {
1801
1801
  ...jsInfo,
1802
1802
  env: getSgmCustomCode(jsLoadErrorSgmCode),
1803
1803
  jsReqError: `请求${jsXhrRequest.timeout}ms超时异常`,
1804
1804
  jsReqState: jsXhrRequest.status,
1805
1805
  };
1806
1806
  console.log('当前js请求超时异常', getRes);
1807
1807
  jsXhrRequest.abort();
1808
1808
  reject(getRes);
1809
1809
  };
1810
1810
  jsXhrRequest.send();
1811
1811
  } catch (e) {
1812
1812
  console.log('执行js请求异常', e);
1813
1813
  reject({
1814
1814
  ...jsInfo,
1815
1815
  env: getSgmCustomCode(jsLoadErrorSgmCode),
1816
1816
  jsReqError: '未知异常',
1817
1817
  error: e,
1818
1818
  });
1819
1819
  }
1820
1820
  });
1821
1821
  } else {
1822
1822
  this.loadJsSdkListCachePromise[getFileKeyName] = new Promise((resolve, reject) => {
1823
1823
  return this.loadScriptEle(jsInfo, resolve, reject);
1824
1824
  });
1825
1825
  }
1826
1826
  }
1827
1827
  return this.loadJsSdkListCachePromise[getFileKeyName];
1828
1828
  } else {
1829
1829
  return Promise.resolve({
1830
1830
  ...jsInfo,
1831
1831
  jsTip: 'js加载方式设置为不加载,当前不做处理',
1832
1832
  });
1833
1833
  }
1834
1834
  } else {
1835
1835
  return Promise.reject(jsInfo);
1836
1836
  }
1837
1837
  }
1838
1838
 
1839
1839
  createLanguagePromise() {
1840
1840
  const getLanguageConfig = window?.shopGlobalSwitch?.language || {};
1841
1841
  if (!this.languageCacheProimse) {
1842
1842
  this.languageCacheProimse = new Promise((resolve, reject) => {
1843
1843
  const { fileName, prefixUrl } = getLanguageConfig;
1844
1844
  console.log('getLanguageConfig', getLanguageConfig, 'languageNowType', languageNowType);
1845
1845
  const dealLanguageFile = () => {
1846
1846
  this.getLanguageFilePromise(getLanguageConfig, languageNowType)
1847
1847
  .then((res) => {
1848
1848
  if (res && res?.data) {
1849
1849
  this.languageJsonData = res.data;
1850
1850
 
1851
1851
  setTimeout(() => {
1852
1852
  const getOtherLanguageList = languageTypeList.filter(
1853
1853
  (item) => item !== languageNowType,
1854
1854
  );
1855
1855
  getOtherLanguageList.length > 0 &&
1856
1856
  getOtherLanguageList.map((languageTypeKey) => {
1857
1857
  this.getLanguageFilePromise(getLanguageConfig, languageTypeKey);
1858
1858
  });
1859
1859
  }, 3000);
1860
1860
  resolve(res);
1861
1861
  } else {
1862
1862
  reject(res);
1863
1863
  }
1864
1864
  })
1865
1865
  .catch((err) => {
1866
1866
  reject(err);
1867
1867
  });
1868
1868
  };
1869
1869
  if (fileName && prefixUrl) {
1870
1870
  const getLangStorageKey = `jshopx_lang_${languageNowType}`;
1871
1871
  const getLocalLangRes = getTaroStorageKeyValue(getLangStorageKey);
1872
1872
  if (getLocalLangRes) {
1873
1873
  try {
1874
1874
  const getLocalLangJsonData =
1875
1875
  typeof getLocalLangRes === 'string' ? JSON.parse(getLocalLangRes) : getLocalLangRes;
1876
1876
  if (getLocalLangJsonData?.fileName && getLocalLangJsonData?.data) {
1877
1877
  if (getLocalLangJsonData?.fileName === fileName) {
1878
1878
  const geThisLangData = getLocalLangJsonData.data;
1879
1879
  this.languageJsonData = geThisLangData;
1880
1880
  return resolve({
1881
1881
  ...getLanguageConfig,
1882
1882
  languageNowType,
1883
1883
  data: geThisLangData,
1884
1884
  });
1885
1885
  } else {
1886
1886
  dealLanguageFile();
1887
1887
  }
1888
1888
  } else {
1889
1889
  dealLanguageFile();
1890
1890
  }
1891
1891
  } catch (e) {
1892
1892
  return reject({
1893
1893
  languageNowType,
1894
1894
  msg: '转换错误',
1895
1895
  ...getLanguageConfig,
1896
1896
  });
1897
1897
  }
1898
1898
  } else {
1899
1899
  dealLanguageFile();
1900
1900
  }
1901
1901
  } else {
1902
1902
  return reject({
1903
1903
  languageNowType,
1904
1904
  msg: '文件对象下发异常',
1905
1905
  ...getLanguageConfig,
1906
1906
  });
1907
1907
  }
1908
1908
  });
1909
1909
  }
1910
1910
  return this.languageCacheProimse;
1911
1911
  }
1912
1912
 
1913
1913
  getLanguageFilePromise(info, languageTypeKey) {
1914
1914
  const { fileName, prefixUrl, timeout } = info || {};
1915
1915
  const getUrl = `${prefixUrl}${fileName}_${languageTypeKey}.json`;
1916
1916
  return new Promise((resolve, reject) => {
1917
1917
  const langLoadErrorSgmCode = `languageLoadError_${fileName || 'lang.json'}`;
1918
1918
  try {
1919
1919
  const langXhrRequest = new XMLHttpRequest();
1920
1920
  langXhrRequest.timeout = timeout || 2000;
1921
1921
  langXhrRequest.open('GET', getUrl, true);
1922
1922
  langXhrRequest.responseType = 'json';
1923
1923
  langXhrRequest.onreadystatechange = () => {
1924
1924
  if (langXhrRequest.readyState === 4) {
1925
1925
  const getReqStatus = langXhrRequest.status;
1926
1926
  const statusText = langXhrRequest.statusText;
1927
1927
  if ((getReqStatus >= 200 && getReqStatus < 300) || getReqStatus === 304) {
1928
1928
  const getData = langXhrRequest?.response || false;
1929
1929
  if (getData) {
1930
1930
  setTaroStorage(`jshopx_lang_${languageTypeKey}`, {
1931
1931
  fileName,
1932
1932
  data: getData,
1933
1933
  });
1934
1934
  resolve({
1935
1935
  ...info,
1936
1936
  languageTypeKey,
1937
1937
  data: getData,
1938
1938
  });
1939
1939
  } else {
1940
1940
  reject({
1941
1941
  ...info,
1942
1942
  languageTypeKey,
1943
1943
  msg: '数据获取异常',
1944
1944
  });
1945
1945
  }
1946
1946
  } else {
1947
1947
  const getRes = {
1948
1948
  ...info,
1949
1949
  languageTypeKey,
1950
1950
  env: getSgmCustomCode(langLoadErrorSgmCode),
1951
1951
  msg: `请求状态异常,状态码为${getReqStatus},statusText:${statusText}`,
1952
1952
  };
1953
1953
  console.log('当前lang请求状态异常,具体信息见', getRes);
1954
1954
  reject(getRes);
1955
1955
  }
1956
1956
  }
1957
1957
  };
1958
1958
  langXhrRequest.onerror = () => {
1959
1959
  const getRes = {
1960
1960
  ...info,
1961
1961
  env: getSgmCustomCode(langLoadErrorSgmCode),
1962
1962
  msg: '请求错误',
1963
1963
  };
1964
1964
  console.log('当前lang请求错误', getRes);
1965
1965
  langXhrRequest.abort();
1966
1966
  reject(getRes);
1967
1967
  };
1968
1968
  langXhrRequest.ontimeout = () => {
1969
1969
  const getRes = {
1970
1970
  ...info,
1971
1971
  msg: `请求${langXhrRequest.timeout}ms超时异常,状态${langXhrRequest.status}`,
1972
1972
  };
1973
1973
  console.log('执行lang多语言请求超时异常', getRes);
1974
1974
  langXhrRequest.abort();
1975
1975
  reject(getRes);
1976
1976
  };
1977
1977
  langXhrRequest.send();
1978
1978
  } catch (e) {
1979
1979
  console.log('执行lang多语言请求异常', e);
1980
1980
  reject({
1981
1981
  ...info,
1982
1982
  env: getSgmCustomCode(langLoadErrorSgmCode),
1983
1983
  msg: '未知异常',
1984
1984
  error: e,
1985
1985
  });
1986
1986
  }
1987
1987
  });
1988
1988
  }