pb-sxp-ui 1.0.3-alpha.1 → 1.0.3-alpha.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 (68) hide show
  1. package/dist/index.cjs +2373 -823
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.css +115 -112
  4. package/dist/index.js +2374 -824
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.min.cjs +3 -3
  7. package/dist/index.min.cjs.map +1 -1
  8. package/dist/index.min.js +3 -3
  9. package/dist/index.min.js.map +1 -1
  10. package/dist/pb-ui.js +2373 -823
  11. package/dist/pb-ui.js.map +1 -1
  12. package/dist/pb-ui.min.js +3 -3
  13. package/dist/pb-ui.min.js.map +1 -1
  14. package/es/core/components/SxpPageRender/Hashtag/index.d.ts +2 -1
  15. package/es/core/components/SxpPageRender/Hashtag/index.js +2 -2
  16. package/es/core/components/SxpPageRender/Navbar.d.ts +1 -0
  17. package/es/core/components/SxpPageRender/Navbar.js +3 -2
  18. package/es/core/components/SxpPageRender/WaterFall/List.d.ts +2 -1
  19. package/es/core/components/SxpPageRender/WaterFall/List.js +24 -14
  20. package/es/core/components/SxpPageRender/WaterFall/WaterfallList.d.ts +2 -1
  21. package/es/core/components/SxpPageRender/WaterFall/WaterfallList.js +13 -11
  22. package/es/core/components/SxpPageRender/WaterFall/index.d.ts +2 -1
  23. package/es/core/components/SxpPageRender/WaterFall/index.js +4 -3
  24. package/es/core/components/SxpPageRender/WaterFall/preview.json +1242 -0
  25. package/es/core/components/SxpPageRender/index.d.ts +2 -0
  26. package/es/core/components/SxpPageRender/index.js +5 -5
  27. package/es/core/context/EditorDataProvider.d.ts +3 -1
  28. package/es/core/context/EditorDataProvider.js +5 -2
  29. package/es/core/context/SxpDataSourceProvider.d.ts +2 -0
  30. package/es/core/context/SxpDataSourceProvider.js +7 -3
  31. package/es/materials/sxp/HashTag/index.d.ts +14 -0
  32. package/es/materials/sxp/HashTag/index.js +6 -0
  33. package/es/materials/sxp/HashTag/material.d.ts +2 -0
  34. package/es/materials/sxp/HashTag/material.js +52 -0
  35. package/es/materials/sxp/HashTag/settingRender.d.ts +122 -0
  36. package/es/materials/sxp/HashTag/settingRender.js +153 -0
  37. package/es/materials/sxp/index.d.ts +1 -0
  38. package/es/materials/sxp/index.js +1 -0
  39. package/es/materials/sxp/template/components/settingRender.d.ts +15 -0
  40. package/es/materials/sxp/template/components/settingRender.js +17 -0
  41. package/lib/core/components/SxpPageRender/Hashtag/index.d.ts +2 -1
  42. package/lib/core/components/SxpPageRender/Hashtag/index.js +2 -2
  43. package/lib/core/components/SxpPageRender/Navbar.d.ts +1 -0
  44. package/lib/core/components/SxpPageRender/Navbar.js +3 -2
  45. package/lib/core/components/SxpPageRender/WaterFall/List.d.ts +2 -1
  46. package/lib/core/components/SxpPageRender/WaterFall/List.js +23 -14
  47. package/lib/core/components/SxpPageRender/WaterFall/WaterfallList.d.ts +2 -1
  48. package/lib/core/components/SxpPageRender/WaterFall/WaterfallList.js +12 -11
  49. package/lib/core/components/SxpPageRender/WaterFall/index.d.ts +2 -1
  50. package/lib/core/components/SxpPageRender/WaterFall/index.js +4 -3
  51. package/lib/core/components/SxpPageRender/WaterFall/preview.json +1242 -0
  52. package/lib/core/components/SxpPageRender/index.d.ts +2 -0
  53. package/lib/core/components/SxpPageRender/index.js +5 -5
  54. package/lib/core/context/EditorDataProvider.d.ts +3 -1
  55. package/lib/core/context/EditorDataProvider.js +4 -1
  56. package/lib/core/context/SxpDataSourceProvider.d.ts +2 -0
  57. package/lib/core/context/SxpDataSourceProvider.js +7 -3
  58. package/lib/materials/sxp/HashTag/index.d.ts +14 -0
  59. package/lib/materials/sxp/HashTag/index.js +9 -0
  60. package/lib/materials/sxp/HashTag/material.d.ts +2 -0
  61. package/lib/materials/sxp/HashTag/material.js +56 -0
  62. package/lib/materials/sxp/HashTag/settingRender.d.ts +122 -0
  63. package/lib/materials/sxp/HashTag/settingRender.js +155 -0
  64. package/lib/materials/sxp/index.d.ts +1 -0
  65. package/lib/materials/sxp/index.js +1 -0
  66. package/lib/materials/sxp/template/components/settingRender.d.ts +15 -0
  67. package/lib/materials/sxp/template/components/settingRender.js +17 -0
  68. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { isEmpty, isEqual, cloneDeep, debounce, throttle, get } from 'lodash';
2
2
  import { v4 } from 'uuid';
3
3
  import pako from 'pako';
4
- import React, { useContext, useMemo, createContext, memo, useState, useRef, useCallback, useEffect, forwardRef, useImperativeHandle, useLayoutEffect } from 'react';
4
+ import React, { useContext, useMemo, createContext, memo, useState, useRef, useEffect, useCallback, forwardRef, useImperativeHandle, useLayoutEffect } from 'react';
5
5
  import qs from 'qs';
6
6
  import { css } from '@emotion/css';
7
7
  import { BetaSchemaForm } from '@ant-design/pro-components';
@@ -406,7 +406,7 @@ var DataSourceType;
406
406
  DataSourceType[DataSourceType["BFF"] = 5] = "BFF";
407
407
  })(DataSourceType || (DataSourceType = {}));
408
408
  const UTM_KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_id', 'utm_content', 'cl_source'];
409
- const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent = true, maxSize, defaultSize, isPreview = false, sxpParameter, appDomain, hashTagSize, loadingImage }) => {
409
+ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent = true, maxSize, defaultSize, isPreview = false, sxpParameter, appDomain, hashTagSize, loadingImage, isOpenHashTag = false }) => {
410
410
  const [rtcList, setRtcList] = useState([]);
411
411
  const [loading, setLoading] = useState(false);
412
412
  const [curReqInfo, setCurReqInfo] = useState({ rtc: '', requestId: '' });
@@ -415,10 +415,13 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
415
415
  // 弹窗数据
416
416
  const [popupDetailData, setPopupDetailData] = useState();
417
417
  const [waterFallData, setWaterFallData] = useState();
418
- const [openHashtag, setOpenHashtag] = useState(false);
418
+ const [openHashtag, setOpenHashtag] = useState(isOpenHashTag);
419
419
  const [cacheRtcList, setCacheRtcList] = useState([]);
420
420
  const [cacheActiveIndex, setCacheActiveIndex] = useState(0);
421
421
  const [isFromHashtag, setIsFromHashtag] = useState(false);
422
+ useEffect(() => {
423
+ setOpenHashtag(isOpenHashTag);
424
+ }, [isOpenHashTag]);
422
425
  // BFF 数据源
423
426
  const bffDataSource = useMemo(() => {
424
427
  return dataSources === null || dataSources === void 0 ? void 0 : dataSources.find((d) => d.type === DataSourceType.BFF);
@@ -603,7 +606,8 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
603
606
  setIsFromHashtag,
604
607
  appDomain,
605
608
  hashTagSize,
606
- loadingImage: loadingImage !== null && loadingImage !== void 0 ? loadingImage : defaultLoadingImage
609
+ loadingImage: loadingImage !== null && loadingImage !== void 0 ? loadingImage : defaultLoadingImage,
610
+ isOpenHashTag
607
611
  } }, render({ rtcList, mutateLike: bffMutateLike, mutateUnlike: bffMutateUnlike, submitForm: bffSubmitForm })));
608
612
  };
609
613
  var SxpDataSourceProvider$1 = memo(SxpDataSourceProvider);
@@ -867,7 +871,7 @@ var interactionRender$8 = [
867
871
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\AppointForm\settingRender.tsx
868
872
  *
869
873
  */
870
- var settingRender$4 = [
874
+ var settingRender$5 = [
871
875
  {
872
876
  type: 'Text',
873
877
  label: '组件名称',
@@ -1056,7 +1060,7 @@ const AppointForm = createMaterial(AppointFormComponent, {
1056
1060
  category: 'popup',
1057
1061
  type: 'AppointForm',
1058
1062
  related: {
1059
- settingRender: settingRender$4,
1063
+ settingRender: settingRender$5,
1060
1064
  bindableProps: [],
1061
1065
  interactionRender: interactionRender$8
1062
1066
  },
@@ -1098,7 +1102,7 @@ const AppointForm = createMaterial(AppointFormComponent, {
1098
1102
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\CommodityDetailDiroNew\settingRender.tsx
1099
1103
  *
1100
1104
  */
1101
- var settingRender$3 = [
1105
+ var settingRender$4 = [
1102
1106
  {
1103
1107
  title: '商品图片',
1104
1108
  child: [
@@ -8385,7 +8389,7 @@ const CommodityDetail = createMaterial(CommodityDetailComponent, {
8385
8389
  category: 'popup',
8386
8390
  type: 'CommodityDetail',
8387
8391
  related: {
8388
- settingRender: settingRender$3
8392
+ settingRender: settingRender$4
8389
8393
  },
8390
8394
  defaulSetting: {
8391
8395
  props: {
@@ -8447,7 +8451,7 @@ var interactionRender$7 = [
8447
8451
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\Prompt\settingRender.tsx
8448
8452
  *
8449
8453
  */
8450
- var settingRender$2 = [
8454
+ var settingRender$3 = [
8451
8455
  {
8452
8456
  type: 'Media',
8453
8457
  label: '图标',
@@ -8522,7 +8526,7 @@ const Prompt = createMaterial(PromptComponent, {
8522
8526
  category: 'popup',
8523
8527
  type: 'Prompt',
8524
8528
  related: {
8525
- settingRender: settingRender$2,
8529
+ settingRender: settingRender$3,
8526
8530
  bindableProps: [],
8527
8531
  interactionRender: interactionRender$7
8528
8532
  },
@@ -8547,7 +8551,7 @@ const Prompt = createMaterial(PromptComponent, {
8547
8551
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\CommodityDetailDiroNew\settingRender.tsx
8548
8552
  *
8549
8553
  */
8550
- var settingRender$1 = [
8554
+ var settingRender$2 = [
8551
8555
  {
8552
8556
  title: '商品图片',
8553
8557
  child: [
@@ -8834,7 +8838,7 @@ const CommodityDetailDiroNew = createMaterial(CommodityDetailDiroNewComponent, {
8834
8838
  category: 'popup',
8835
8839
  type: 'CommodityDetailDiroNew',
8836
8840
  related: {
8837
- settingRender: settingRender$1
8841
+ settingRender: settingRender$2
8838
8842
  },
8839
8843
  defaulSetting: {
8840
8844
  props: {
@@ -8890,11 +8894,11 @@ const CommodityDetailDiroNew = createMaterial(CommodityDetailDiroNewComponent, {
8890
8894
  * @Author: binruan@chatlabs.com
8891
8895
  * @Date: 2024-03-26 16:50:25
8892
8896
  * @LastEditors: binruan@chatlabs.com
8893
- * @LastEditTime: 2024-03-29 17:03:07
8897
+ * @LastEditTime: 2024-04-03 15:51:15
8894
8898
  * @FilePath: \pb-sxp-ui\src\materials\sxp\template\components\settingRender.tsx
8895
8899
  *
8896
8900
  */
8897
- var settingRender = [
8901
+ var settingRender$1 = [
8898
8902
  {
8899
8903
  title: '主题样式',
8900
8904
  child: [
@@ -9054,6 +9058,23 @@ var settingRender = [
9054
9058
  }
9055
9059
  ]
9056
9060
  },
9061
+ {
9062
+ type: 'Group',
9063
+ label: '圆角',
9064
+ child: [
9065
+ {
9066
+ type: 'Slider',
9067
+ name: ['props', 'ctaTempStyles', 'ctaTitle', 'borderRadius'],
9068
+ max: 100
9069
+ },
9070
+ {
9071
+ type: 'Number',
9072
+ name: ['props', 'ctaTempStyles', 'ctaTitle', 'borderRadius'],
9073
+ addonAfter: 'px',
9074
+ max: 100
9075
+ }
9076
+ ]
9077
+ },
9057
9078
  {
9058
9079
  type: 'Color',
9059
9080
  label: '背景色',
@@ -9202,7 +9223,7 @@ const Commodity = createMaterial(CommodityComponent, {
9202
9223
  related: {
9203
9224
  interactionRender: interactionRender$6,
9204
9225
  bindableProps: [],
9205
- settingRender
9226
+ settingRender: settingRender$1
9206
9227
  },
9207
9228
  defaulSetting: {
9208
9229
  props: {
@@ -9280,7 +9301,7 @@ const Appoint = createMaterial(AppointComponent, {
9280
9301
  type: 'Appoint',
9281
9302
  related: {
9282
9303
  interactionRender: interactionRender$5,
9283
- settingRender: settingRender === null || settingRender === void 0 ? void 0 : settingRender.filter((i) => i.type !== 'commodityTitle'),
9304
+ settingRender: settingRender$1 === null || settingRender$1 === void 0 ? void 0 : settingRender$1.filter((i) => i.type !== 'commodityTitle'),
9284
9305
  bindableProps: []
9285
9306
  },
9286
9307
  defaulSetting: {
@@ -9356,7 +9377,7 @@ const Link = createMaterial(LinkComponent, {
9356
9377
  category: 'template',
9357
9378
  type: 'Link',
9358
9379
  related: {
9359
- settingRender: settingRender === null || settingRender === void 0 ? void 0 : settingRender.filter((i) => i.type !== 'commodityTitle'),
9380
+ settingRender: settingRender$1 === null || settingRender$1 === void 0 ? void 0 : settingRender$1.filter((i) => i.type !== 'commodityTitle'),
9360
9381
  bindableProps: []
9361
9382
  },
9362
9383
  defaulSetting: {
@@ -9441,7 +9462,7 @@ const CommodityDiro = createMaterial(CommodityDiroComponent, {
9441
9462
  type: 'CommodityDiro',
9442
9463
  related: {
9443
9464
  interactionRender: interactionRender$4,
9444
- settingRender,
9465
+ settingRender: settingRender$1,
9445
9466
  bindableProps: []
9446
9467
  },
9447
9468
  defaulSetting: {
@@ -9533,7 +9554,7 @@ const CommodityDiroNew = createMaterial(CommodityDiroNewComponent, {
9533
9554
  related: {
9534
9555
  interactionRender: interactionRender$3,
9535
9556
  bindableProps: [],
9536
- settingRender
9557
+ settingRender: settingRender$1
9537
9558
  },
9538
9559
  defaulSetting: {
9539
9560
  props: {
@@ -9665,7 +9686,7 @@ const MultiCommodityDiro = createMaterial(MultiCommodityDiroComponent, {
9665
9686
  related: {
9666
9687
  interactionRender: interactionRender$2,
9667
9688
  bindableProps: [],
9668
- settingRender
9689
+ settingRender: settingRender$1
9669
9690
  },
9670
9691
  defaulSetting: {
9671
9692
  props: {
@@ -9767,7 +9788,7 @@ const MultiCommodity = createMaterial(MultiCommodityComponent, {
9767
9788
  type: 'MultiCommodity',
9768
9789
  related: {
9769
9790
  interactionRender: interactionRender$1,
9770
- settingRender,
9791
+ settingRender: settingRender$1,
9771
9792
  bindableProps: []
9772
9793
  },
9773
9794
  defaulSetting: {
@@ -9871,7 +9892,7 @@ const MultiCommodityDiroNew = createMaterial(MultiCommodityDiroNewComponent, {
9871
9892
  related: {
9872
9893
  interactionRender,
9873
9894
  bindableProps: [],
9874
- settingRender
9895
+ settingRender: settingRender$1
9875
9896
  },
9876
9897
  defaulSetting: {
9877
9898
  props: {
@@ -9913,898 +9934,2424 @@ const MultiCommodityDiroNew = createMaterial(MultiCommodityDiroNewComponent, {
9913
9934
 
9914
9935
  /*
9915
9936
  * @Author: binruan@chatlabs.com
9916
- * @Date: 2023-07-25 14:56:49
9937
+ * @Date: 2024-04-07 14:07:12
9917
9938
  * @LastEditors: binruan@chatlabs.com
9918
- * @LastEditTime: 2024-03-20 13:46:06
9919
- * @FilePath: \pb-sxp-ui\src\materials\index.ts
9939
+ * @LastEditTime: 2024-04-07 14:54:11
9940
+ * @FilePath: \pb-sxp-ui\src\materials\sxp\HashTag\settingRender.tsx
9920
9941
  *
9921
9942
  */
9922
-
9923
- var _materials_ = /*#__PURE__*/Object.freeze({
9924
- __proto__: null,
9925
- Appoint: Appoint,
9926
- AppointForm: AppointForm,
9927
- Commodity: Commodity,
9928
- CommodityDetail: CommodityDetail,
9929
- CommodityDetailDiroNew: CommodityDetailDiroNew,
9930
- CommodityDiro: CommodityDiro,
9931
- CommodityDiroNew: CommodityDiroNew,
9932
- Link: Link,
9933
- MultiCommodity: MultiCommodity,
9934
- MultiCommodityDiro: MultiCommodityDiro,
9935
- MultiCommodityDiroNew: MultiCommodityDiroNew,
9936
- Prompt: Prompt
9937
- });
9938
-
9939
- const defaultUnLikeIconPath = '/pb_static/f71266d2c64446c5ae6a5a7f5489cc0a.png';
9940
- const defaultLikeIconPath = '/pb_static/f07900fe3f0f4ae188ea1611d4801a44.png';
9941
- const LikeButton = (_a) => {
9942
- var { active, activeIcon, unActicveIcon, recData } = _a, props = __rest(_a, ["active", "activeIcon", "unActicveIcon", "recData"]);
9943
- const { mutateLike, mutateUnlike, bffEventReport } = useSxpDataSource();
9944
- const [state, setState] = useState(active);
9945
- const likeIcon = useIconLink(defaultLikeIconPath);
9946
- const unlikeIcon = useIconLink(defaultUnLikeIconPath);
9947
- const handleClick = debounce(() => __awaiter(void 0, void 0, void 0, function* () {
9948
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
9949
- if (state) {
9950
- // 先设置状态
9951
- setState(false);
9952
- const result = (_d = (yield (mutateUnlike === null || mutateUnlike === void 0 ? void 0 : mutateUnlike({ videoItemId: (_c = (_b = recData.video) === null || _b === void 0 ? void 0 : _b.itemId) !== null && _c !== void 0 ? _c : '' })))) !== null && _d !== void 0 ? _d : false;
9953
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
9954
- eventInfo: {
9955
- eventSubject: 'favoriteContentCanceled',
9956
- eventDescription: 'This content was unfavorite by the user',
9957
- contentId: (_f = (_e = recData.video) === null || _e === void 0 ? void 0 : _e.itemId) !== null && _f !== void 0 ? _f : '',
9958
- contentName: (_h = (_g = recData.video) === null || _g === void 0 ? void 0 : _g.title) !== null && _h !== void 0 ? _h : '',
9959
- contentTags: JSON.stringify((_k = (_j = recData.video) === null || _j === void 0 ? void 0 : _j.tags) !== null && _k !== void 0 ? _k : []),
9960
- position: recData.position,
9961
- contentFormat: ((_l = recData.video) === null || _l === void 0 ? void 0 : _l.url) ? 'video' : 'image',
9962
- traceInfo: (_m = recData.video) === null || _m === void 0 ? void 0 : _m.traceInfo
9963
- }
9964
- });
9965
- // 如果接口调用失败,则回滚状态
9966
- if (!result) {
9967
- setState(true);
9943
+ var settingRender = [
9944
+ {
9945
+ title: '卡片样式',
9946
+ child: [
9947
+ {
9948
+ type: 'Number',
9949
+ label: '文本行数',
9950
+ name: ['props', 'lineClamp']
9951
+ },
9952
+ {
9953
+ type: 'Number',
9954
+ label: '上下边距',
9955
+ name: ['props', 'space'],
9956
+ addonAfter: 'px'
9968
9957
  }
9969
- }
9970
- else {
9971
- setState(true);
9972
- const result = (_o = (yield (mutateLike === null || mutateLike === void 0 ? void 0 : mutateLike({ content: JSON.stringify(recData) })))) !== null && _o !== void 0 ? _o : false;
9973
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
9974
- eventInfo: {
9975
- eventSubject: 'favoriteContent',
9976
- eventDescription: 'This content was favorite by the user',
9977
- contentId: (_q = (_p = recData.video) === null || _p === void 0 ? void 0 : _p.itemId) !== null && _q !== void 0 ? _q : '',
9978
- contentName: (_s = (_r = recData.video) === null || _r === void 0 ? void 0 : _r.title) !== null && _s !== void 0 ? _s : '',
9979
- contentTags: JSON.stringify((_u = (_t = recData.video) === null || _t === void 0 ? void 0 : _t.tags) !== null && _u !== void 0 ? _u : []),
9980
- position: recData.position,
9981
- contentFormat: ((_v = recData.video) === null || _v === void 0 ? void 0 : _v.url) ? 'video' : 'image',
9982
- traceInfo: (_w = recData.video) === null || _w === void 0 ? void 0 : _w.traceInfo
9983
- }
9984
- });
9985
- if (!result) {
9986
- setState(false);
9958
+ ]
9959
+ },
9960
+ {
9961
+ title: '文本设置',
9962
+ child: [
9963
+ {
9964
+ name: ['props', 'textStyles'],
9965
+ type: 'SelectLinkage',
9966
+ child: [
9967
+ {
9968
+ label: '字段',
9969
+ type: 'Select',
9970
+ options: [
9971
+ {
9972
+ label: 'hashtag标题',
9973
+ value: 'hashTagTitle'
9974
+ },
9975
+ {
9976
+ label: 'hashtag描述',
9977
+ value: 'hashTagDesc'
9978
+ },
9979
+ {
9980
+ label: '标题',
9981
+ value: 'title'
9982
+ },
9983
+ {
9984
+ label: '价格',
9985
+ value: 'price'
9986
+ }
9987
+ ],
9988
+ name: ['props', 'textStyles', 'field'],
9989
+ initialValue: 'title'
9990
+ },
9991
+ {
9992
+ type: 'Group',
9993
+ label: '标题字体',
9994
+ child: [
9995
+ {
9996
+ type: 'Color',
9997
+ name: ['color']
9998
+ },
9999
+ {
10000
+ type: 'Select',
10001
+ options: [{ label: '黑体', value: '黑体' }],
10002
+ name: ['fontFamily']
10003
+ },
10004
+ {
10005
+ type: 'Number',
10006
+ addonAfter: 'px',
10007
+ name: ['fontSize']
10008
+ }
10009
+ ]
10010
+ },
10011
+ {
10012
+ label: '标题样式',
10013
+ type: 'TextStyle'
10014
+ },
10015
+ {
10016
+ label: '标题对齐',
10017
+ type: 'TextAlign'
10018
+ }
10019
+ ]
9987
10020
  }
9988
- }
9989
- }), 200);
9990
- return (React.createElement("button", Object.assign({}, props, { onClick: handleClick }),
9991
- React.createElement("img", { style: { width: '100%', height: '100%', objectFit: 'contain' }, src: state ? activeIcon || likeIcon : unActicveIcon || unlikeIcon, alt: 'icon' })));
10021
+ ]
10022
+ },
10023
+ {
10024
+ title: '按钮样式',
10025
+ child: [
10026
+ {
10027
+ type: 'Color',
10028
+ label: '背景色',
10029
+ name: ['props', 'buttonStyle', 'backgroundColor'],
10030
+ initialValue: '#000'
10031
+ },
10032
+ {
10033
+ type: 'Group',
10034
+ label: '尺寸',
10035
+ child: [
10036
+ {
10037
+ type: 'Number',
10038
+ name: ['props', 'buttonStyle', 'height'],
10039
+ addonAfter: 'H'
10040
+ }
10041
+ ]
10042
+ },
10043
+ {
10044
+ type: 'Group',
10045
+ label: '圆角',
10046
+ child: [
10047
+ {
10048
+ type: 'Slider',
10049
+ name: ['props', 'buttonStyle', 'borderRadius'],
10050
+ max: 100
10051
+ },
10052
+ {
10053
+ type: 'Number',
10054
+ name: ['props', 'buttonStyle', 'borderRadius'],
10055
+ addonAfter: 'px',
10056
+ max: 100
10057
+ }
10058
+ ]
10059
+ },
10060
+ {
10061
+ type: 'TextMargin',
10062
+ name: ['props', 'buttonStyle']
10063
+ },
10064
+ {
10065
+ type: 'Group',
10066
+ label: '字体',
10067
+ child: [
10068
+ {
10069
+ type: 'Color',
10070
+ name: ['props', 'buttonStyle', 'color'],
10071
+ initialValue: '#fff'
10072
+ },
10073
+ {
10074
+ type: 'Select',
10075
+ name: ['props', 'buttonStyle', 'fontFamily'],
10076
+ options: [{ label: '黑体', value: '黑体' }]
10077
+ },
10078
+ {
10079
+ type: 'Number',
10080
+ name: ['props', 'buttonStyle', 'fontSize'],
10081
+ addonAfter: 'px'
10082
+ }
10083
+ ]
10084
+ },
10085
+ {
10086
+ type: 'TextStyle',
10087
+ name: ['props', 'buttonStyle']
10088
+ },
10089
+ {
10090
+ type: 'TextAlign',
10091
+ name: ['props', 'buttonStyle']
10092
+ }
10093
+ ]
10094
+ }
10095
+ ];
10096
+
10097
+ /*
10098
+ * @Author: binruan@chatlabs.com
10099
+ * @Date: 2023-12-26 16:11:34
10100
+ * @LastEditors: binruan@chatlabs.com
10101
+ * @LastEditTime: 2024-04-08 11:53:47
10102
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Navbar.tsx
10103
+ *
10104
+ */
10105
+ const Navbar = ({ icon, styles, textStyle, onClose }) => {
10106
+ var _a;
10107
+ const { waterFallData, setOpenHashtag } = useSxpDataSource();
10108
+ return (React.createElement("div", { className: 'clc-sxp-nav', style: styles },
10109
+ React.createElement("img", { className: 'clc-sxp-nav-left', src: icon, alt: '', onClick: onClose }),
10110
+ React.createElement("div", { className: 'clc-sxp-nav-title', style: textStyle }, `#${(_a = waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag) !== null && _a !== void 0 ? _a : '标题'}`)));
9992
10111
  };
9993
- var LikeButton$1 = memo(LikeButton);
10112
+ var Navbar$1 = memo(Navbar);
9994
10113
 
9995
- const SXP_EVENT_BUS = new EventEmitter();
9996
- var SXP_EVENT_TYPE;
9997
- (function (SXP_EVENT_TYPE) {
9998
- SXP_EVENT_TYPE["PAGE_DID_SHOW"] = "pageDidShow";
9999
- SXP_EVENT_TYPE["PAGE_DID_HIDE"] = "pageDidHide";
10000
- })(SXP_EVENT_TYPE || (SXP_EVENT_TYPE = {}));
10114
+ var productUserId = null;
10115
+ var requestId = "3d989325-e7d6-4a74-8a97-98febdf5b567";
10116
+ var channel = null;
10117
+ var rtc = null;
10118
+ var tag = {
10119
+ info: "The dior toujours bag is distinguished by a casual and practical design. Fully embroidered with black textured tweed, it is accented by a blend of threads displaying the cannage motif.",
10120
+ link: "www.baidu.com",
10121
+ linkTitle: null,
10122
+ linkType: "WEB"
10123
+ };
10124
+ var recList = [
10125
+ {
10126
+ position: "0",
10127
+ isCollected: null,
10128
+ video: {
10129
+ itemId: "VIDEOY2BMu1710323630175",
10130
+ title: "A symbol of excellence, the Dior Toujours bag is reinterpreted in an unprecedented version. For the Dior spring-summer 2024 ready-to-wear collection, this exceptional accessory, dreamed up by Maria Grazia Chiuri, is dressed in irresistible crinkled leather featuring the iconic macrocannage motif. A new emblem of the virtuoso, perpetually reinvented savoir-faire of the Dior Ateliers.",
10131
+ tags: [
10132
+ "Dior Toujours Bag",
10133
+ "Casual",
10134
+ "Leather Strap",
10135
+ "Handbags"
10136
+ ],
10137
+ weight: null,
10138
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOY2BMu1710323630175:default:3::branch:Handbags:0",
10139
+ bindCta: null,
10140
+ bindProduct: {
10141
+ itemId: "M2821SNIOM900",
10142
+ title: "Medium Dior Toujours Bag Black Macrocannage Crinkled Leather",
10143
+ tags: [
10144
+ "Medium",
10145
+ "Black",
10146
+ "Women",
10147
+ "Handbags",
10148
+ "Bucket Bag"
10149
+ ],
10150
+ weight: null,
10151
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2821SNIOM900:default:3::branch:Handbags:0",
10152
+ bindCta: {
10153
+ itemId: "CTAzgoPn1709005149328",
10154
+ title: "立即购买",
10155
+ tags: [
10156
+ ],
10157
+ weight: null,
10158
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:0",
10159
+ enTitle: "Shop now",
10160
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10161
+ link: null,
10162
+ linkTitle: null,
10163
+ linkType: null,
10164
+ menuCategoryId: "65966478d19caa37afe3603f"
10165
+ },
10166
+ homePage: [
10167
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsy6AN0OWw3rj8Luw3RTSP9n2kDLq1710497237677.jpg",
10168
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fszTc3uEUrtppdN9QVVU2XBnaaaBY1710497237986.jpg",
10169
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKbBMTRa0tTTX661wu7DzLw9OP0r1710497237980.jpg",
10170
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsOYHlYCwgzalxzmIJcsZmIsJ2L3g1710497237145.jpg",
10171
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKJqNVm1ZBlrgZ8XLC0YAaO6ws2F1710497237650.jpg",
10172
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsm2VoVancBQ20nDHceESUPNLyrUy1710497238312.jpg",
10173
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs2B5YYmv8OztP3d9rlM2a9KmYswl1710497237339.jpg"
10174
+ ],
10175
+ collection: "Eté 2024",
10176
+ link: "https://www.dior.com/en_us/fashion/products/M1296ZRIW_M828-medium-dior-book-tote-ecru-and-blue-dior-oblique-embroidery-36-x-27.5-x-16.5-cm",
10177
+ linkTitle: null,
10178
+ linkType: "WEB",
10179
+ info: "The dior toujours bag is distinguished by a casual and practical design. Crafted in black crinkled calfskin with macrocannage topstitching, it showcases a spacious interior compartment with a matching pouch to organize the essentials. Its leather strap closure keeps items secure while the d of the cd lock closure twists to adjust the sides and enhance the bag's silhouette.",
10180
+ price: 4400,
10181
+ currency: "USD-$"
10182
+ },
10183
+ bindProducts: [
10184
+ ],
10185
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fswbY3wT0hCmrYkrqDzFKnHb3NMux1710323481052.png",
10186
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fs3Ifqv7fk2Tn9nPtwOTO2YjxAuRO1710323470472.mp4",
10187
+ imgUrls: null,
10188
+ hashTags: [
10189
+ "Dior Toujours Bag",
10190
+ "Casual",
10191
+ "Leather Strap",
10192
+ "Handbags"
10193
+ ]
10194
+ },
10195
+ product: null,
10196
+ cta: null
10197
+ },
10198
+ {
10199
+ position: "1",
10200
+ isCollected: null,
10201
+ video: {
10202
+ itemId: "VIDEO6JCOb1710323364018",
10203
+ title: "Maria grazia chiuri's hallmark dior book tote offers an original take on elegance. Unveiled at the cruise 2024 fashion show, the refined style showcases the iconic blue dior oblique embroidery and calfskin. Designed to keep all the daily essentials organized, the interior is equipped with a zipped pocket and patch pockets.",
10204
+ tags: [
10205
+ "Handbags",
10206
+ "Manufacturing Craftsmanship",
10207
+ "Dior Book Tote"
10208
+ ],
10209
+ weight: null,
10210
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEO6JCOb1710323364018:default:3::branch:Handbags:1",
10211
+ bindCta: null,
10212
+ bindProduct: {
10213
+ itemId: "M1296ZRIWM828",
10214
+ title: "Medium Dior Book Tote",
10215
+ tags: [
10216
+ "Maria Grazia Chiuri",
10217
+ "Hand",
10218
+ "Shoulder",
10219
+ "Handbags",
10220
+ "Blue",
10221
+ "Women"
10222
+ ],
10223
+ weight: null,
10224
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:1",
10225
+ bindCta: {
10226
+ itemId: "CTAzgoPn1709005149328",
10227
+ title: "立即购买",
10228
+ tags: [
10229
+ ],
10230
+ weight: null,
10231
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:1",
10232
+ enTitle: "Shop now",
10233
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10234
+ link: null,
10235
+ linkTitle: null,
10236
+ linkType: null,
10237
+ menuCategoryId: "65966478d19caa37afe3603f"
10238
+ },
10239
+ homePage: [
10240
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10241
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10242
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10243
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10244
+ ],
10245
+ collection: "Eté 2024",
10246
+ link: "https://www.dior.com/en_us/fashion/products/M1296ZRIW_M828-medium-dior-book-tote-ecru-and-blue-dior-oblique-embroidery-36-x-27.5-x-16.5-cm",
10247
+ linkTitle: null,
10248
+ linkType: "WEB",
10249
+ info: "Introduced by Maria Grazia Chiuri, Creative Director of Christian Dior, the Dior Book Tote has become a staple of the Dior aesthetic. Designed to hold all the daily essentials, the style is fully embroidered with the ecru and blue Dior Oblique motif. Adorned with the Christian Dior Paris signature on the front, the medium tote exemplifies the House's signature savoir-faire and may be carried by hand or worn over the shoulder.",
10250
+ price: 3350,
10251
+ currency: "USD-$"
10252
+ },
10253
+ bindProducts: [
10254
+ ],
10255
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsAHlkdbqYj5F84o2faRzU1E3AvG11710323339209.png",
10256
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fs7KIGk2IB0MsoDL1ANWB1Mb2hqu41710323314146.mp4",
10257
+ imgUrls: null,
10258
+ hashTags: [
10259
+ "Handbags",
10260
+ "Dior Book Tote"
10261
+ ]
10262
+ },
10263
+ product: null,
10264
+ cta: null
10265
+ },
10266
+ {
10267
+ position: "2",
10268
+ isCollected: null,
10269
+ video: null,
10270
+ product: {
10271
+ itemId: "M2820OTKVM911",
10272
+ title: "Large Dior Toujours Bag Black Cannage Tweed",
10273
+ tags: [
10274
+ "Black",
10275
+ "Women",
10276
+ "Handbags",
10277
+ "Bucket Bag",
10278
+ "Dior Toujours Bag"
10279
+ ],
10280
+ weight: null,
10281
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2820OTKVM911:default:3::branch:Handbags:2",
10282
+ bindCta: {
10283
+ itemId: "CTAzgoPn1709005149328",
10284
+ title: "立即购买",
10285
+ tags: [
10286
+ ],
10287
+ weight: null,
10288
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:2",
10289
+ enTitle: "Shop now",
10290
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10291
+ link: null,
10292
+ linkTitle: null,
10293
+ linkType: null,
10294
+ menuCategoryId: "65966478d19caa37afe3603f"
10295
+ },
10296
+ homePage: [
10297
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fsJTjyFchOFEJSTRYxXvL2XPU1dP61710238469418.jpg",
10298
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fstdFA1dFT55QjtQPU2qHNENo5peF1710836061716.jpg",
10299
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fs9xf8AlIApbHezVL3BsxjUGIrN231710836061181.jpg",
10300
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fs9iZ20MjLAPkXmFKvD8HzhLaBJ671710238470272.jpg",
10301
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fsSSodev3wicDfE1DYNWPQVeRjErt1710238464035.jpg",
10302
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fs3YAOuN6Pd9NFvH1Rdooj6eLI18S1710238465296.jpg",
10303
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fsBwIEp6OzI49isvHgiKD0cPSFtrD1710238459007.jpg"
10304
+ ],
10305
+ collection: "Eté 2024",
10306
+ link: "https://www.dior.com/en_us/fashion/products/M2820OTKV_M911-large-dior-toujours-bag",
10307
+ linkTitle: null,
10308
+ linkType: "WEB",
10309
+ info: "The dior toujours bag is distinguished by a casual and practical design. Fully embroidered with black textured tweed, it is accented by a blend of threads displaying the cannage motif. It showcases a spacious interior compartment with a matching pouch to organize the essentials, while a leather strap closure keeps items secure and the d of the cd lock closure twists to adjust the sides and enhance the bag's silhouette.",
10310
+ price: 4200,
10311
+ currency: "USD-$"
10312
+ },
10313
+ cta: null
10314
+ },
10315
+ {
10316
+ position: "3",
10317
+ isCollected: null,
10318
+ video: {
10319
+ itemId: "VIDEOOL1qU1709616182569",
10320
+ title: "Maria grazia chiuri brings a fresh update to the iconic saddle bag. Crafted in black grained calfskin, the legendary design features a saddle flap with a d stirrup clasp on a magnetic strap, as well as an antique gold-finish metal cd signature on either side of the strap. Equipped with a thin, adjustable and removable shoulder strap, the saddle bag may be carried by hand, worn over the shoulder or crossbody.. Saddle bag with strap Black grained calfskin",
10321
+ tags: [
10322
+ "Maria Grazia Chiuri",
10323
+ "Saddle Bags",
10324
+ "Removable Shoulder Strap",
10325
+ "Shoulder",
10326
+ "Crossbody",
10327
+ "Cross-body & Shoulder Bags",
10328
+ "Handbags"
10329
+ ],
10330
+ weight: null,
10331
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOOL1qU1709616182569:default:3::branch:Handbags:3",
10332
+ bindCta: null,
10333
+ bindProduct: {
10334
+ itemId: "M0455CBAAM900",
10335
+ title: "Saddle Bag with Strap",
10336
+ tags: [
10337
+ "Saddle Bags",
10338
+ "Handbags",
10339
+ "Maria Grazia Chiuri"
10340
+ ],
10341
+ weight: null,
10342
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0455CBAAM900:default:3::branch:Handbags:3",
10343
+ bindCta: {
10344
+ itemId: "CTAzgoPn1709005149328",
10345
+ title: "立即购买",
10346
+ tags: [
10347
+ ],
10348
+ weight: null,
10349
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:3",
10350
+ enTitle: "Shop now",
10351
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10352
+ link: null,
10353
+ linkTitle: null,
10354
+ linkType: null,
10355
+ menuCategoryId: "65966478d19caa37afe3603f"
10356
+ },
10357
+ homePage: [
10358
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsiwfgnCrVBGcGPh6gaFsvbYBIpxX1709285334896.png",
10359
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsXpilTgUS4u4oFWr0hUew8DQITi11709285353202.png",
10360
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsWxJm6YIeRYmDtDoB5WtYMjRX8bm1709285366208.png",
10361
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsj69PxKh1SAZ6p0902FbBT0vg2at1709285373714.png",
10362
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fs78nKueByU2cNulReOw8gJ1ZsieF1709285412981.png",
10363
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsmAEriTIohZAUMUE6gUCWvXwbbRE1709285429332.png"
10364
+ ],
10365
+ collection: "Eté 2024",
10366
+ link: "https://www.dior.com/en_us/fashion/products/M0455CBAA_M900-saddle-bag-with-strap-black-grained-calfskin?objectID=M0455CBAA_M900&query=M0455CBAAM900&queryID=c171c63e69d6d109953e2de631718496",
10367
+ linkTitle: null,
10368
+ linkType: "WEB",
10369
+ info: "Maria Grazia Chiuri brings a fresh update to the iconic Saddle bag. Crafted in black grained calfskin, the legendary design features a Saddle flap with a D stirrup clasp on a magnetic strap, as well as an antique gold-finish metal CD signature on either side of the strap. Equipped with a thin, adjustable and removable shoulder strap, the Saddle bag may be carried by hand, worn over the shoulder or crossbody.",
10370
+ price: 4400,
10371
+ currency: "USD-$"
10372
+ },
10373
+ bindProducts: [
10374
+ ],
10375
+ cover: null,
10376
+ url: null,
10377
+ imgUrls: [
10378
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsvbBN3IRfwctVIhdqgq3doWmhbb21710399187965.jpg"
10379
+ ],
10380
+ hashTags: [
10381
+ "Maria Grazia Chiuri",
10382
+ "Saddle Bags",
10383
+ "Handbags"
10384
+ ]
10385
+ },
10386
+ product: null,
10387
+ cta: null
10388
+ },
10389
+ {
10390
+ position: "4",
10391
+ isCollected: null,
10392
+ video: null,
10393
+ product: {
10394
+ itemId: "S5909CTZQM928",
10395
+ title: "Saddle Shoulder Pouch Blue Dior Oblique Jacquard ",
10396
+ tags: [
10397
+ "Saddle Bags",
10398
+ "Handbags",
10399
+ "Small-Leather-Goods",
10400
+ "Small",
10401
+ "Mini Bags"
10402
+ ],
10403
+ weight: null,
10404
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:S5909CTZQM928:default:3::branch:Handbags:4",
10405
+ bindCta: {
10406
+ itemId: "CTAzgoPn1709005149328",
10407
+ title: "立即购买",
10408
+ tags: [
10409
+ ],
10410
+ weight: null,
10411
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:4",
10412
+ enTitle: "Shop now",
10413
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10414
+ link: null,
10415
+ linkTitle: null,
10416
+ linkType: null,
10417
+ menuCategoryId: "65966478d19caa37afe3603f"
10418
+ },
10419
+ homePage: [
10420
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fs34CpwKJOyjEDgoHypoLYakF8oR31710316280669.png",
10421
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsLOSOEf9pmz7wKnFaifWNw3TZ7Gy1710316287874.png",
10422
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsWHmVcrzHKKj6EfhfnQkxYIOt20a1710316295683.png",
10423
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fslyBNMyQwjpjY4EKzyrqzTMlOGRQ1710316313161.png"
10424
+ ],
10425
+ collection: "Eté 2024",
10426
+ link: "https://www.dior.com/en_us/fashion/products/S5909CTZQ",
10427
+ linkTitle: null,
10428
+ linkType: "WEB",
10429
+ info: null,
10430
+ price: 4900,
10431
+ currency: "USD-$"
10432
+ },
10433
+ cta: null
10434
+ },
10435
+ {
10436
+ position: "5",
10437
+ isCollected: null,
10438
+ video: {
10439
+ itemId: "VIDEOrZguC1710324513737",
10440
+ title: "Introduced by Maria Grazia Chiuri, Creative Director of Christian Dior, the Dior Book Tote has become a staple of the Dior aesthetic. Designed to hold all the daily essentials, the style is fully embroidered with the ecru and blue Dior Oblique motif. Adorned with the Christian Dior Paris signature on the front, the medium tote exemplifies the House's signature savoir-faire and may be carried by hand or worn over the shoulder.",
10441
+ tags: [
10442
+ "Handbags",
10443
+ "Dior Book Tote"
10444
+ ],
10445
+ weight: null,
10446
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOrZguC1710324513737:default:3::branch:Handbags:5",
10447
+ bindCta: null,
10448
+ bindProduct: {
10449
+ itemId: "M1296ZRIWM828",
10450
+ title: "Medium Dior Book Tote",
10451
+ tags: [
10452
+ "Maria Grazia Chiuri",
10453
+ "Hand",
10454
+ "Shoulder",
10455
+ "Handbags",
10456
+ "Blue",
10457
+ "Women"
10458
+ ],
10459
+ weight: null,
10460
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:5",
10461
+ bindCta: {
10462
+ itemId: "CTAzgoPn1709005149328",
10463
+ title: "立即购买",
10464
+ tags: [
10465
+ ],
10466
+ weight: null,
10467
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:5",
10468
+ enTitle: "Shop now",
10469
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10470
+ link: null,
10471
+ linkTitle: null,
10472
+ linkType: null,
10473
+ menuCategoryId: "65966478d19caa37afe3603f"
10474
+ },
10475
+ homePage: [
10476
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10477
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10478
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10479
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10480
+ ],
10481
+ collection: "Eté 2024",
10482
+ link: "https://www.dior.com/en_us/fashion/products/M1296ZRIW_M828-medium-dior-book-tote-ecru-and-blue-dior-oblique-embroidery-36-x-27.5-x-16.5-cm",
10483
+ linkTitle: null,
10484
+ linkType: "WEB",
10485
+ info: "Introduced by Maria Grazia Chiuri, Creative Director of Christian Dior, the Dior Book Tote has become a staple of the Dior aesthetic. Designed to hold all the daily essentials, the style is fully embroidered with the ecru and blue Dior Oblique motif. Adorned with the Christian Dior Paris signature on the front, the medium tote exemplifies the House's signature savoir-faire and may be carried by hand or worn over the shoulder.",
10486
+ price: 3350,
10487
+ currency: "USD-$"
10488
+ },
10489
+ bindProducts: [
10490
+ ],
10491
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fstXNWStczbY8HbIKEqMwfCkv5CI51710324494939.png",
10492
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsOqu34FxaJTdascLcj6DHoYIIAs01710324439851.mp4",
10493
+ imgUrls: null,
10494
+ hashTags: [
10495
+ "Handbags",
10496
+ "Dior Book Tote"
10497
+ ]
10498
+ },
10499
+ product: null,
10500
+ cta: null
10501
+ },
10502
+ {
10503
+ position: "6",
10504
+ isCollected: null,
10505
+ video: null,
10506
+ product: {
10507
+ itemId: "M1296ZRIWM828",
10508
+ title: "Medium Dior Book Tote",
10509
+ tags: [
10510
+ "Maria Grazia Chiuri",
10511
+ "Hand",
10512
+ "Shoulder",
10513
+ "Handbags",
10514
+ "Blue",
10515
+ "Women"
10516
+ ],
10517
+ weight: null,
10518
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:6",
10519
+ bindCta: {
10520
+ itemId: "CTAzgoPn1709005149328",
10521
+ title: "立即购买",
10522
+ tags: [
10523
+ ],
10524
+ weight: null,
10525
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:6",
10526
+ enTitle: "Shop now",
10527
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10528
+ link: null,
10529
+ linkTitle: null,
10530
+ linkType: null,
10531
+ menuCategoryId: "65966478d19caa37afe3603f"
10532
+ },
10533
+ homePage: [
10534
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10535
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10536
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10537
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10538
+ ],
10539
+ collection: "Eté 2024",
10540
+ link: "https://www.dior.com/en_us/fashion/products/M1296ZRIW_M828-medium-dior-book-tote-ecru-and-blue-dior-oblique-embroidery-36-x-27.5-x-16.5-cm",
10541
+ linkTitle: null,
10542
+ linkType: "WEB",
10543
+ info: "Introduced by Maria Grazia Chiuri, Creative Director of Christian Dior, the Dior Book Tote has become a staple of the Dior aesthetic. Designed to hold all the daily essentials, the style is fully embroidered with the ecru and blue Dior Oblique motif. Adorned with the Christian Dior Paris signature on the front, the medium tote exemplifies the House's signature savoir-faire and may be carried by hand or worn over the shoulder.",
10544
+ price: 3350,
10545
+ currency: "USD-$"
10546
+ },
10547
+ cta: null
10548
+ },
10549
+ {
10550
+ position: "7",
10551
+ isCollected: null,
10552
+ video: {
10553
+ itemId: "VIDEOEtr621710300614047",
10554
+ title: "Unveiled at the spring-summer 2023 fashion show, the dior toujours bag is distinguished by a casual and practical design. Crafted in black calfskin with macrocannage topstitching, it showcases a spacious interior compartment with a matching pouch to organize essentials. Its leather strap closure keeps items secure while the d of the cd lock closure twists to adjust the sides and enhance the bag's silhouette. T",
10555
+ tags: [
10556
+ "Handbags",
10557
+ "Leather Strap",
10558
+ "Spring-Summer 2024 Fashion Show",
10559
+ "Backstage",
10560
+ "Dior Toujours Bag"
10561
+ ],
10562
+ weight: null,
10563
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOEtr621710300614047:default:3::branch:Handbags:7",
10564
+ bindCta: null,
10565
+ bindProduct: null,
10566
+ bindProducts: [
10567
+ ],
10568
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fshkOldZwfsSqTgvxHJzNBwS66ySc1710300910103.jpg",
10569
+ url: null,
10570
+ imgUrls: [
10571
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsryDXTtPWXjYFWoSUEBUi48RHZCh1710398617300.jpg"
10572
+ ],
10573
+ hashTags: [
10574
+ "Backstage",
10575
+ "Handbags",
10576
+ "Spring-Summer 2024 Fashion Show",
10577
+ "Dior Toujours Bag"
10578
+ ]
10579
+ },
10580
+ product: null,
10581
+ cta: null
10582
+ },
10583
+ {
10584
+ position: "8",
10585
+ isCollected: null,
10586
+ video: {
10587
+ itemId: "VIDEOO8Zjt1709616802987",
10588
+ title: "Introduced by Maria Grazia Chiuri, Creative Director of Christian Dior, the Dior Book Tote has become a staple of the Dior aesthetic. Designed to hold all the daily essentials, the style is fully embroidered with the ecru and blue Dior Oblique motif. Adorned with the Christian Dior Paris signature on the front, the medium tote exemplifies the House's signature savoir-faire and may be carried by hand or worn over the shoulder.",
10589
+ tags: [
10590
+ "Blue",
10591
+ "Medium",
10592
+ "Shoulder",
10593
+ "Hand",
10594
+ "Handbags",
10595
+ "Dior Book Tote"
10596
+ ],
10597
+ weight: null,
10598
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOO8Zjt1709616802987:default:3::branch:Handbags:8",
10599
+ bindCta: null,
10600
+ bindProduct: {
10601
+ itemId: "M1296ZRIWM828",
10602
+ title: "Medium Dior Book Tote",
10603
+ tags: [
10604
+ "Maria Grazia Chiuri",
10605
+ "Hand",
10606
+ "Shoulder",
10607
+ "Handbags",
10608
+ "Blue",
10609
+ "Women"
10610
+ ],
10611
+ weight: null,
10612
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:8",
10613
+ bindCta: {
10614
+ itemId: "CTAzgoPn1709005149328",
10615
+ title: "立即购买",
10616
+ tags: [
10617
+ ],
10618
+ weight: null,
10619
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:8",
10620
+ enTitle: "Shop now",
10621
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10622
+ link: null,
10623
+ linkTitle: null,
10624
+ linkType: null,
10625
+ menuCategoryId: "65966478d19caa37afe3603f"
10626
+ },
10627
+ homePage: [
10628
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10629
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10630
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10631
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10632
+ ],
10633
+ collection: "Eté 2024",
10634
+ link: "https://www.dior.com/en_us/fashion/products/M1296ZRIW_M828-medium-dior-book-tote-ecru-and-blue-dior-oblique-embroidery-36-x-27.5-x-16.5-cm",
10635
+ linkTitle: null,
10636
+ linkType: "WEB",
10637
+ info: "Introduced by Maria Grazia Chiuri, Creative Director of Christian Dior, the Dior Book Tote has become a staple of the Dior aesthetic. Designed to hold all the daily essentials, the style is fully embroidered with the ecru and blue Dior Oblique motif. Adorned with the Christian Dior Paris signature on the front, the medium tote exemplifies the House's signature savoir-faire and may be carried by hand or worn over the shoulder.",
10638
+ price: 3350,
10639
+ currency: "USD-$"
10640
+ },
10641
+ bindProducts: [
10642
+ ],
10643
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsmS72zfInwmblYTnuYzRuZKAOlhr1709616742898.jpg",
10644
+ url: null,
10645
+ imgUrls: [
10646
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsU2gDw28XFd1nOAqlUjb1r1h6mpT1710400349981.jpg"
10647
+ ],
10648
+ hashTags: [
10649
+ "Dior Book Tote",
10650
+ "Handbags"
10651
+ ]
10652
+ },
10653
+ product: null,
10654
+ cta: null
10655
+ },
10656
+ {
10657
+ position: "9",
10658
+ isCollected: null,
10659
+ video: null,
10660
+ product: {
10661
+ itemId: "M2821SNIOM900",
10662
+ title: "Medium Dior Toujours Bag Black Macrocannage Crinkled Leather",
10663
+ tags: [
10664
+ "Medium",
10665
+ "Black",
10666
+ "Women",
10667
+ "Handbags",
10668
+ "Bucket Bag"
10669
+ ],
10670
+ weight: null,
10671
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2821SNIOM900:default:3::branch:Handbags:9",
10672
+ bindCta: {
10673
+ itemId: "CTAzgoPn1709005149328",
10674
+ title: "立即购买",
10675
+ tags: [
10676
+ ],
10677
+ weight: null,
10678
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:9",
10679
+ enTitle: "Shop now",
10680
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10681
+ link: null,
10682
+ linkTitle: null,
10683
+ linkType: null,
10684
+ menuCategoryId: "65966478d19caa37afe3603f"
10685
+ },
10686
+ homePage: [
10687
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsy6AN0OWw3rj8Luw3RTSP9n2kDLq1710497237677.jpg",
10688
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fszTc3uEUrtppdN9QVVU2XBnaaaBY1710497237986.jpg",
10689
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKbBMTRa0tTTX661wu7DzLw9OP0r1710497237980.jpg",
10690
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsOYHlYCwgzalxzmIJcsZmIsJ2L3g1710497237145.jpg",
10691
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKJqNVm1ZBlrgZ8XLC0YAaO6ws2F1710497237650.jpg",
10692
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsm2VoVancBQ20nDHceESUPNLyrUy1710497238312.jpg",
10693
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs2B5YYmv8OztP3d9rlM2a9KmYswl1710497237339.jpg"
10694
+ ],
10695
+ collection: "Eté 2024",
10696
+ link: "https://www.dior.com/en_us/fashion/products/M1296ZRIW_M828-medium-dior-book-tote-ecru-and-blue-dior-oblique-embroidery-36-x-27.5-x-16.5-cm",
10697
+ linkTitle: null,
10698
+ linkType: "WEB",
10699
+ info: "The dior toujours bag is distinguished by a casual and practical design. Crafted in black crinkled calfskin with macrocannage topstitching, it showcases a spacious interior compartment with a matching pouch to organize the essentials. Its leather strap closure keeps items secure while the d of the cd lock closure twists to adjust the sides and enhance the bag's silhouette.",
10700
+ price: 4400,
10701
+ currency: "USD-$"
10702
+ },
10703
+ cta: null
10704
+ },
10705
+ {
10706
+ position: "10",
10707
+ isCollected: null,
10708
+ video: {
10709
+ itemId: "VIDEOesZlV1710323980494",
10710
+ title: "The lady dior bag embodies dior's vision of elegance and beauty. Sleek and refined, the timeless style demonstrates the house's exceptional savoir-faire. The black patent-to-matte gradient lambskin style is embellished with iconic cannage topstitching, while the ultra-matte metal d.i.o.r. Charms lend a modern touch. Featuring a thin, removable leather shoulder strap, the medium lady dior bag can be carried by hand or worn crossbody.",
10711
+ tags: [
10712
+ "Lady Dior",
10713
+ "Removable Shoulder Strap",
10714
+ "Medium",
10715
+ "Handbags",
10716
+ "Crossbody"
10717
+ ],
10718
+ weight: null,
10719
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOesZlV1710323980494:default:3::branch:Handbags:10",
10720
+ bindCta: null,
10721
+ bindProduct: {
10722
+ itemId: "M0565SDBRM900",
10723
+ title: "Medium Lady Dior Bag",
10724
+ tags: [
10725
+ "Women",
10726
+ "Black",
10727
+ "Handbags",
10728
+ "Hand",
10729
+ "Lady Dior",
10730
+ "Crossbody"
10731
+ ],
10732
+ weight: null,
10733
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565SDBRM900:default:3::branch:Handbags:10",
10734
+ bindCta: {
10735
+ itemId: "CTAzgoPn1709005149328",
10736
+ title: "立即购买",
10737
+ tags: [
10738
+ ],
10739
+ weight: null,
10740
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:10",
10741
+ enTitle: "Shop now",
10742
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10743
+ link: null,
10744
+ linkTitle: null,
10745
+ linkType: null,
10746
+ menuCategoryId: "65966478d19caa37afe3603f"
10747
+ },
10748
+ homePage: [
10749
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsnyiCm9oirbXLqmqY7231O8O2Yhb1710498970982.jpg",
10750
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fskwIRRKCtuw9cb9btuubt2D5bXfB1710498970676.jpg",
10751
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqXFTCyhxspeYCD3uo4UiuN5vQ7w1710498970671.jpg",
10752
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8rDRSKJmWUNI42MjrMWVlI0D9Fz1710498970729.jpg",
10753
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsca9Cjqo3WMJVU0OL0OjQo8xOoMx1710498972076.jpg",
10754
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsjl1bxi56X0QrKwfvl8YocBVJ2N81710498971352.jpg"
10755
+ ],
10756
+ collection: null,
10757
+ link: "https://www.dior.com/en_us/fashion/products/M0565SDBR_M900-medium-lady-dior-bag-black-patent-to-matte-gradient-cannage-lambskin?objectID=M0565SDBR_M900&query=M0565SDBRM900&queryID=14cc52b35774a9a42e78fd9ba199860e",
10758
+ linkTitle: null,
10759
+ linkType: "WEB",
10760
+ info: "The Lady Dior bag embodies Dior's vision of elegance and beauty. Sleek and refined, the timeless style demonstrates the House's exceptional savoir-faire. The black patent-to-matte gradient lambskin style is embellished with iconic Cannage topstitching, while the ultra-matte metal D.I.O.R. charms lend a modern touch. Featuring a thin, removable leather shoulder strap, the medium Lady Dior bag can be carried by hand or worn crossbody.",
10761
+ price: 7100,
10762
+ currency: "USD-$"
10763
+ },
10764
+ bindProducts: [
10765
+ ],
10766
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsiwMQ88zO5Xdnl939krMyBMbz7Js1710323763013.png",
10767
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsxyS8nr7nn0LMe7EqOt3ETXqLu7d1710323753073.mp4",
10768
+ imgUrls: null,
10769
+ hashTags: [
10770
+ "Lady Dior",
10771
+ "Handbags"
10772
+ ]
10773
+ },
10774
+ product: null,
10775
+ cta: null
10776
+ },
10777
+ {
10778
+ position: "11",
10779
+ isCollected: null,
10780
+ video: {
10781
+ itemId: "VIDEOdvsXq1710324342942",
10782
+ title: "New for summer 2024, the lady d-sire my abcdior bag draws inspiration from the signature elegance of the lady dior design. Reimagined with a casual style for an urban look, the lightweight black grained bull leather feels soft to the touch yet offers excellent durability. The medium bag is embellished with pale gold-finish metal d.i.o.r. Charms that highlight the silhouette.",
10783
+ tags: [
10784
+ "Summer 2024",
10785
+ "Lady Dior",
10786
+ "Casual",
10787
+ "Lightweight",
10788
+ "Medium",
10789
+ "Handbags"
10790
+ ],
10791
+ weight: null,
10792
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOdvsXq1710324342942:default:3::branch:Handbags:11",
10793
+ bindCta: null,
10794
+ bindProduct: {
10795
+ itemId: "M1151OTRLM900",
10796
+ title: "Medium Lady D-Sire My ABCDior Bag",
10797
+ tags: [
10798
+ "Handbags",
10799
+ "Summer 2024",
10800
+ "Lady Dior",
10801
+ "Black",
10802
+ "Medium",
10803
+ "Women",
10804
+ "Lady D-Sire"
10805
+ ],
10806
+ weight: null,
10807
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1151OTRLM900:default:3::branch:Handbags:11",
10808
+ bindCta: {
10809
+ itemId: "CTAzgoPn1709005149328",
10810
+ title: "立即购买",
10811
+ tags: [
10812
+ ],
10813
+ weight: null,
10814
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:11",
10815
+ enTitle: "Shop now",
10816
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10817
+ link: null,
10818
+ linkTitle: null,
10819
+ linkType: null,
10820
+ menuCategoryId: "65966478d19caa37afe3603f"
10821
+ },
10822
+ homePage: [
10823
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsBvqPYhaE9Ct1JzBd4gm8g9YOiAZ1710499102900.jpg",
10824
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs6sf9nB7WpJuLNIZT3c8O8Fmf3Gu1710499102936.jpg",
10825
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsSxYBxyVx2yRrUgEaYmarWhlUbk41710499102531.jpg",
10826
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsyhykK1B7W9613MAfipfIuE1foim1710499102345.jpg",
10827
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs6FXJdaXib8lP0NPloe1XQGpoiKc1710499103268.jpg",
10828
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsCRx7T4ejNvgKNensH6LT4dPt6251710499103615.jpg"
10829
+ ],
10830
+ collection: null,
10831
+ link: "https://www.dior.com/en_us/fashion/products/M1151OTRL_M900-medium-lady-d-sire-my-abcdior-bag-black-bull-leather?objectID=M1151OTRL_M900&query=M1151OTRLM900&queryID=e82938220687c425c75277a7c526b932",
10832
+ linkTitle: null,
10833
+ linkType: "WEB",
10834
+ info: "New for Summer 2024, the Lady D-Sire My ABCDior bag draws inspiration from the signature elegance of the Lady Dior design. Reimagined with a casual style for an urban look, the lightweight black grained bull leather feels soft to the touch yet offers excellent durability. The medium bag is embellished with pale gold-finish metal D.I.O.R. charms that highlight the silhouette. Showcasing a shoulder strap that can be personalized by adding symbolic badges, the unique bag can be carried by hand or w",
10835
+ price: 6100,
10836
+ currency: "USD-$"
10837
+ },
10838
+ bindProducts: [
10839
+ ],
10840
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsOsdUSXr57U5Twhhkv17th3yHqBJ1710324292456.png",
10841
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsZyr3slVtlsParX6D0DqsM0QEx8d1710324283147.mp4",
10842
+ imgUrls: null,
10843
+ hashTags: [
10844
+ "Summer 2024",
10845
+ "Lady Dior",
10846
+ "Handbags"
10847
+ ]
10848
+ },
10849
+ product: null,
10850
+ cta: null
10851
+ },
10852
+ {
10853
+ position: "12",
10854
+ isCollected: null,
10855
+ video: {
10856
+ itemId: "VIDEOy76Fr1710324746846",
10857
+ title: "Maria grazia chiuri brings a fresh update to the iconic saddle bag. Crafted in black grained calfskin, the legendary design features a saddle flap with a d stirrup clasp on a magnetic strap, as well as an antique gold-finish metal cd signature on either side of the strap. Equipped with a thin, adjustable and removable shoulder strap, the saddle bag may be carried by hand, worn over the shoulder or crossbody.. Saddle bag with strap Black grained calfskin",
10858
+ tags: [
10859
+ "Maria Grazia Chiuri",
10860
+ "Saddle Bags",
10861
+ "Removable Shoulder Strap",
10862
+ "Hand",
10863
+ "Shoulder",
10864
+ "Crossbody",
10865
+ "Handbags"
10866
+ ],
10867
+ weight: null,
10868
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOy76Fr1710324746846:default:3::branch:Handbags:12",
10869
+ bindCta: null,
10870
+ bindProduct: {
10871
+ itemId: "M0455CBAAM900",
10872
+ title: "Saddle Bag with Strap",
10873
+ tags: [
10874
+ "Saddle Bags",
10875
+ "Handbags",
10876
+ "Maria Grazia Chiuri"
10877
+ ],
10878
+ weight: null,
10879
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0455CBAAM900:default:3::branch:Handbags:12",
10880
+ bindCta: {
10881
+ itemId: "CTAzgoPn1709005149328",
10882
+ title: "立即购买",
10883
+ tags: [
10884
+ ],
10885
+ weight: null,
10886
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:12",
10887
+ enTitle: "Shop now",
10888
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10889
+ link: null,
10890
+ linkTitle: null,
10891
+ linkType: null,
10892
+ menuCategoryId: "65966478d19caa37afe3603f"
10893
+ },
10894
+ homePage: [
10895
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsiwfgnCrVBGcGPh6gaFsvbYBIpxX1709285334896.png",
10896
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsXpilTgUS4u4oFWr0hUew8DQITi11709285353202.png",
10897
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsWxJm6YIeRYmDtDoB5WtYMjRX8bm1709285366208.png",
10898
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsj69PxKh1SAZ6p0902FbBT0vg2at1709285373714.png",
10899
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fs78nKueByU2cNulReOw8gJ1ZsieF1709285412981.png",
10900
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsmAEriTIohZAUMUE6gUCWvXwbbRE1709285429332.png"
10901
+ ],
10902
+ collection: "Eté 2024",
10903
+ link: "https://www.dior.com/en_us/fashion/products/M0455CBAA_M900-saddle-bag-with-strap-black-grained-calfskin?objectID=M0455CBAA_M900&query=M0455CBAAM900&queryID=c171c63e69d6d109953e2de631718496",
10904
+ linkTitle: null,
10905
+ linkType: "WEB",
10906
+ info: "Maria Grazia Chiuri brings a fresh update to the iconic Saddle bag. Crafted in black grained calfskin, the legendary design features a Saddle flap with a D stirrup clasp on a magnetic strap, as well as an antique gold-finish metal CD signature on either side of the strap. Equipped with a thin, adjustable and removable shoulder strap, the Saddle bag may be carried by hand, worn over the shoulder or crossbody.",
10907
+ price: 4400,
10908
+ currency: "USD-$"
10909
+ },
10910
+ bindProducts: [
10911
+ ],
10912
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsqwogfFahvNml7vmATxwfKLcNlh91710324602536.png",
10913
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsVRd4z4V8UScNc7Wc96xv4xDVByb1710324589932.mp4",
10914
+ imgUrls: null,
10915
+ hashTags: [
10916
+ "Maria Grazia Chiuri",
10917
+ "Saddle Bags",
10918
+ "Handbags"
10919
+ ]
10920
+ },
10921
+ product: null,
10922
+ cta: null
10923
+ },
10924
+ {
10925
+ position: "13",
10926
+ isCollected: null,
10927
+ video: {
10928
+ itemId: "VIDEOvqhF71709609258469",
10929
+ title: "The lady dior bag embodies dior's vision of elegance and beauty. Sleek and refined, the timeless style demonstrates the house's exceptional savoir-faire. The black patent-to-matte gradient lambskin style is embellished with iconic cannage topstitching, while the ultra-matte metal d.i.o.r. Charms lend a modern touch. Featuring a thin, removable leather shoulder strap, the medium lady dior bag can be carried by hand or worn crossbody.",
10930
+ tags: [
10931
+ "Thin",
10932
+ "Removable Shoulder Strap",
10933
+ "Medium",
10934
+ "Lady Dior",
10935
+ "Crossbody",
10936
+ "Handbags",
10937
+ "Cross-body & Shoulder Bags"
10938
+ ],
10939
+ weight: null,
10940
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOvqhF71709609258469:default:3::branch:Handbags:13",
10941
+ bindCta: null,
10942
+ bindProduct: {
10943
+ itemId: "M0565SDBRM900",
10944
+ title: "Medium Lady Dior Bag",
10945
+ tags: [
10946
+ "Women",
10947
+ "Black",
10948
+ "Handbags",
10949
+ "Hand",
10950
+ "Lady Dior",
10951
+ "Crossbody"
10952
+ ],
10953
+ weight: null,
10954
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565SDBRM900:default:3::branch:Handbags:13",
10955
+ bindCta: {
10956
+ itemId: "CTAzgoPn1709005149328",
10957
+ title: "立即购买",
10958
+ tags: [
10959
+ ],
10960
+ weight: null,
10961
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:13",
10962
+ enTitle: "Shop now",
10963
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10964
+ link: null,
10965
+ linkTitle: null,
10966
+ linkType: null,
10967
+ menuCategoryId: "65966478d19caa37afe3603f"
10968
+ },
10969
+ homePage: [
10970
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsnyiCm9oirbXLqmqY7231O8O2Yhb1710498970982.jpg",
10971
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fskwIRRKCtuw9cb9btuubt2D5bXfB1710498970676.jpg",
10972
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqXFTCyhxspeYCD3uo4UiuN5vQ7w1710498970671.jpg",
10973
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8rDRSKJmWUNI42MjrMWVlI0D9Fz1710498970729.jpg",
10974
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsca9Cjqo3WMJVU0OL0OjQo8xOoMx1710498972076.jpg",
10975
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsjl1bxi56X0QrKwfvl8YocBVJ2N81710498971352.jpg"
10976
+ ],
10977
+ collection: null,
10978
+ link: "https://www.dior.com/en_us/fashion/products/M0565SDBR_M900-medium-lady-dior-bag-black-patent-to-matte-gradient-cannage-lambskin?objectID=M0565SDBR_M900&query=M0565SDBRM900&queryID=14cc52b35774a9a42e78fd9ba199860e",
10979
+ linkTitle: null,
10980
+ linkType: "WEB",
10981
+ info: "The Lady Dior bag embodies Dior's vision of elegance and beauty. Sleek and refined, the timeless style demonstrates the House's exceptional savoir-faire. The black patent-to-matte gradient lambskin style is embellished with iconic Cannage topstitching, while the ultra-matte metal D.I.O.R. charms lend a modern touch. Featuring a thin, removable leather shoulder strap, the medium Lady Dior bag can be carried by hand or worn crossbody.",
10982
+ price: 7100,
10983
+ currency: "USD-$"
10984
+ },
10985
+ bindProducts: [
10986
+ ],
10987
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsHmNyOcNdgB9Y8aIFYWCHlEZVl4x1709608981919.jpg",
10988
+ url: null,
10989
+ imgUrls: [
10990
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fslhMX6mwCM4i5XFY6dpcMZdPocYv1710398865153.jpg",
10991
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsJQCe9rZmsEjuIUpdck9Hs2gpNU81710398856427.jpg",
10992
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsnHUJufSHptF88bNsyUGmSSKYH4A1710398855734.jpg"
10993
+ ],
10994
+ hashTags: [
10995
+ "Lady Dior",
10996
+ "Handbags"
10997
+ ]
10998
+ },
10999
+ product: null,
11000
+ cta: null
11001
+ },
11002
+ {
11003
+ position: "14",
11004
+ isCollected: null,
11005
+ video: null,
11006
+ product: {
11007
+ itemId: "M0455CBAAM900",
11008
+ title: "Saddle Bag with Strap",
11009
+ tags: [
11010
+ "Saddle Bags",
11011
+ "Handbags",
11012
+ "Maria Grazia Chiuri"
11013
+ ],
11014
+ weight: null,
11015
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0455CBAAM900:default:3::branch:Handbags:14",
11016
+ bindCta: {
11017
+ itemId: "CTAzgoPn1709005149328",
11018
+ title: "立即购买",
11019
+ tags: [
11020
+ ],
11021
+ weight: null,
11022
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:14",
11023
+ enTitle: "Shop now",
11024
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11025
+ link: null,
11026
+ linkTitle: null,
11027
+ linkType: null,
11028
+ menuCategoryId: "65966478d19caa37afe3603f"
11029
+ },
11030
+ homePage: [
11031
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsiwfgnCrVBGcGPh6gaFsvbYBIpxX1709285334896.png",
11032
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsXpilTgUS4u4oFWr0hUew8DQITi11709285353202.png",
11033
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsWxJm6YIeRYmDtDoB5WtYMjRX8bm1709285366208.png",
11034
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsj69PxKh1SAZ6p0902FbBT0vg2at1709285373714.png",
11035
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fs78nKueByU2cNulReOw8gJ1ZsieF1709285412981.png",
11036
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsmAEriTIohZAUMUE6gUCWvXwbbRE1709285429332.png"
11037
+ ],
11038
+ collection: "Eté 2024",
11039
+ link: "https://www.dior.com/en_us/fashion/products/M0455CBAA_M900-saddle-bag-with-strap-black-grained-calfskin?objectID=M0455CBAA_M900&query=M0455CBAAM900&queryID=c171c63e69d6d109953e2de631718496",
11040
+ linkTitle: null,
11041
+ linkType: "WEB",
11042
+ info: "Maria Grazia Chiuri brings a fresh update to the iconic Saddle bag. Crafted in black grained calfskin, the legendary design features a Saddle flap with a D stirrup clasp on a magnetic strap, as well as an antique gold-finish metal CD signature on either side of the strap. Equipped with a thin, adjustable and removable shoulder strap, the Saddle bag may be carried by hand, worn over the shoulder or crossbody.",
11043
+ price: 4400,
11044
+ currency: "USD-$"
11045
+ },
11046
+ cta: null
11047
+ },
11048
+ {
11049
+ position: "15",
11050
+ isCollected: null,
11051
+ video: {
11052
+ itemId: "VIDEO693hq1709628690318",
11053
+ title: "New for the summer 2024 season, the dior caro top handle camera bag is a sophisticated and practical design. Crafted in black calfskin, the small model is elevated by the originality of the macrocannage stitching's quilted effect. The bag features a zip closure and an antique gold-tone metal cd signature.",
11054
+ tags: [
11055
+ "Ready-To-Wear",
11056
+ "Handbags",
11057
+ "Signature Hardware Design",
11058
+ "Monogram/Logo Print",
11059
+ "Calfskin Leather",
11060
+ "Summer 2024",
11061
+ "Black"
11062
+ ],
11063
+ weight: null,
11064
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEO693hq1709628690318:default:3::branch:Handbags:15",
11065
+ bindCta: null,
11066
+ bindProduct: {
11067
+ itemId: "M3352UBHMM900",
11068
+ title: "Small Dior Caro Top Handle Camera Bag Black Macrocannage Calfskin ",
11069
+ tags: [
11070
+ "Summer 2024",
11071
+ "Black",
11072
+ "Women",
11073
+ "Handbags",
11074
+ "Dior Caro"
11075
+ ],
11076
+ weight: null,
11077
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M3352UBHMM900:default:3::branch:Handbags:15",
11078
+ bindCta: {
11079
+ itemId: "CTAzgoPn1709005149328",
11080
+ title: "立即购买",
11081
+ tags: [
11082
+ ],
11083
+ weight: null,
11084
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:15",
11085
+ enTitle: "Shop now",
11086
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11087
+ link: null,
11088
+ linkTitle: null,
11089
+ linkType: null,
11090
+ menuCategoryId: "65966478d19caa37afe3603f"
11091
+ },
11092
+ homePage: [
11093
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsx3wufMP9P6ovvCrXL58eVVA61gI1710499528917.jpg",
11094
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs82a414vXXhbgMXsw3Zm8TWyDMvI1710499528543.jpg",
11095
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsJaZoFhur3jfMEciQdk5GMV8O2un1710499528346.jpg",
11096
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fstO8CRKfBzpJUmAMyCDHDo23ji9N1710499528346.jpg",
11097
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsagaUiox7KECRhbPn6MScg3s4Nwd1710499528602.jpg",
11098
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsBsyFADiYBLWHaAIQfNRsgweVOWj1710499529947.jpg",
11099
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqJEwfvOLpXQ6nQt76o92XdLwzs11710499529939.jpg"
11100
+ ],
11101
+ collection: "Eté 2024",
11102
+ link: "https://www.dior.com/en_us/fashion/products/M3352UBHM_M900",
11103
+ linkTitle: null,
11104
+ linkType: "WEB",
11105
+ info: "New for the Summer 2024 season, the Dior Caro Top Handle Camera bag is a sophisticated and practical design. Crafted in black calfskin, the small model is elevated by the originality of the Macrocannage stitching's quilted effect. The bag features a zip closure and an antique gold-tone metal CD signature. ",
11106
+ price: 3350,
11107
+ currency: "USD-$"
11108
+ },
11109
+ bindProducts: [
11110
+ ],
11111
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsZhMDVzP6kuh9Qt86c11whAMglMU1709628656988.jpg",
11112
+ url: null,
11113
+ imgUrls: [
11114
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsWrEKA6oRWUmOY14D1POTJjgiks51710401973577.jpg"
11115
+ ],
11116
+ hashTags: [
11117
+ "Ready-To-Wear"
11118
+ ]
11119
+ },
11120
+ product: null,
11121
+ cta: null
11122
+ },
11123
+ {
11124
+ position: "16",
11125
+ isCollected: null,
11126
+ video: {
11127
+ itemId: "VIDEO2rUuG1709617832960",
11128
+ title: "The dior toujours bag is distinguished by a casual and practical design. Crafted in black crinkled calfskin with macrocannage topstitching, it showcases a spacious interior compartment with a matching pouch to organize the essentials. Its leather strap closure keeps items secure while the d of the cd lock closure twists to adjust the sides and enhance the bag's silhouette.",
11129
+ tags: [
11130
+ "Dior Toujours Bag",
11131
+ "Casual",
11132
+ "Leather Strap",
11133
+ "Handbags"
11134
+ ],
11135
+ weight: null,
11136
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEO2rUuG1709617832960:default:3::branch:Handbags:16",
11137
+ bindCta: null,
11138
+ bindProduct: {
11139
+ itemId: "M2821SNIOM900",
11140
+ title: "Medium Dior Toujours Bag Black Macrocannage Crinkled Leather",
11141
+ tags: [
11142
+ "Medium",
11143
+ "Black",
11144
+ "Women",
11145
+ "Handbags",
11146
+ "Bucket Bag"
11147
+ ],
11148
+ weight: null,
11149
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2821SNIOM900:default:3::branch:Handbags:16",
11150
+ bindCta: {
11151
+ itemId: "CTAzgoPn1709005149328",
11152
+ title: "立即购买",
11153
+ tags: [
11154
+ ],
11155
+ weight: null,
11156
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:16",
11157
+ enTitle: "Shop now",
11158
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11159
+ link: null,
11160
+ linkTitle: null,
11161
+ linkType: null,
11162
+ menuCategoryId: "65966478d19caa37afe3603f"
11163
+ },
11164
+ homePage: [
11165
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsy6AN0OWw3rj8Luw3RTSP9n2kDLq1710497237677.jpg",
11166
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fszTc3uEUrtppdN9QVVU2XBnaaaBY1710497237986.jpg",
11167
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKbBMTRa0tTTX661wu7DzLw9OP0r1710497237980.jpg",
11168
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsOYHlYCwgzalxzmIJcsZmIsJ2L3g1710497237145.jpg",
11169
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKJqNVm1ZBlrgZ8XLC0YAaO6ws2F1710497237650.jpg",
11170
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsm2VoVancBQ20nDHceESUPNLyrUy1710497238312.jpg",
11171
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs2B5YYmv8OztP3d9rlM2a9KmYswl1710497237339.jpg"
11172
+ ],
11173
+ collection: "Eté 2024",
11174
+ link: "https://www.dior.com/en_us/fashion/products/M1296ZRIW_M828-medium-dior-book-tote-ecru-and-blue-dior-oblique-embroidery-36-x-27.5-x-16.5-cm",
11175
+ linkTitle: null,
11176
+ linkType: "WEB",
11177
+ info: "The dior toujours bag is distinguished by a casual and practical design. Crafted in black crinkled calfskin with macrocannage topstitching, it showcases a spacious interior compartment with a matching pouch to organize the essentials. Its leather strap closure keeps items secure while the d of the cd lock closure twists to adjust the sides and enhance the bag's silhouette.",
11178
+ price: 4400,
11179
+ currency: "USD-$"
11180
+ },
11181
+ bindProducts: [
11182
+ ],
11183
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fs0BUtn8TYp4l8gWsg5WD9Ht8AP7R1709617796077.jpg",
11184
+ url: null,
11185
+ imgUrls: [
11186
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsmecPfhI3OtZwJmKAXLv8scBSSdK1710399333565.jpg",
11187
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsfsWBLxbC36B7Pm7Ae1uL98EmoaH1710399333017.jpg"
11188
+ ],
11189
+ hashTags: [
11190
+ "Handbags",
11191
+ "Dior Toujours Bag"
11192
+ ]
11193
+ },
11194
+ product: null,
11195
+ cta: null
11196
+ },
11197
+ {
11198
+ position: "17",
11199
+ isCollected: null,
11200
+ video: {
11201
+ itemId: "VIDEOGZGZI1709629679782",
11202
+ title: "The Lady Dior bag embodies Dior's vision of elegance and beauty. Sleek and refined, the timeless white and navy blue calfskin style offers a new take on the iconic House motif with this season's signature Toile de Jouy Soleil, layering suns and crescent moons into a floral design representing the four seasons. A",
11203
+ tags: [
11204
+ "Handbags"
11205
+ ],
11206
+ weight: null,
11207
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOGZGZI1709629679782:default:3::branch:Handbags:17",
11208
+ bindCta: null,
11209
+ bindProduct: {
11210
+ itemId: "M0565OZEDM928",
11211
+ title: "Medium Lady Dior Bag",
11212
+ tags: [
11213
+ "Lady Dior",
11214
+ "Medium",
11215
+ "Handbags",
11216
+ "Crossbody"
11217
+ ],
11218
+ weight: null,
11219
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565OZEDM928:default:3::branch:Handbags:17",
11220
+ bindCta: {
11221
+ itemId: "CTAzgoPn1709005149328",
11222
+ title: "立即购买",
11223
+ tags: [
11224
+ ],
11225
+ weight: null,
11226
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:17",
11227
+ enTitle: "Shop now",
11228
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11229
+ link: null,
11230
+ linkTitle: null,
11231
+ linkType: null,
11232
+ menuCategoryId: "65966478d19caa37afe3603f"
11233
+ },
11234
+ homePage: [
11235
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsbVwOx4grEmqCNmvOnKpIS0vTPPc1710499656033.jpg",
11236
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsJrpY9R8uGenvzM7NnzI4lPMCF8g1710836215790.jpg",
11237
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsYQG9gipUNt6UbzFPXTwLTNgj5BF1710836214937.jpg",
11238
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsqPEXjWl7l3wPAxJIZbnnhZPXDCw1710836216838.jpg",
11239
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsNHlPmAsNYPsGDJ5w0G213wJkwFf1710499654946.jpg",
11240
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8dAObnEoAYe1V6pwJOGTs4vCBJO1710499655963.jpg",
11241
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsJpaBPC8OxQ4aYwxsMcqZpGtPWnq1710499655730.jpg"
11242
+ ],
11243
+ collection: "Eté 2024",
11244
+ link: "https://www.dior.com/en_us/fashion/products/M0565OZED_M928",
11245
+ linkTitle: null,
11246
+ linkType: "WEB",
11247
+ info: "The Lady Dior bag embodies Dior's vision of elegance and beauty. Sleek and refined, the timeless white and navy blue calfskin style offers a new take on the iconic House motif with this season's signature Toile de Jouy Soleil, layering suns and crescent moons into a floral design representing the four seasons. Accented by pale gold-finish metal D.I.O.R. charms illuminating the silhouette and featuring a thin, removable leather shoulder strap, the medium Lady Dior bag can be carried by hand or wo",
11248
+ price: 6500,
11249
+ currency: "USD-$"
11250
+ },
11251
+ bindProducts: [
11252
+ ],
11253
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsG1IT2gcB5iabcTL89Xs9bRHISMb1709629659698.jpg",
11254
+ url: null,
11255
+ imgUrls: [
11256
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsJB1txgzSsQLBBJSTzqGI40BvLkr1710399454552.jpg"
11257
+ ],
11258
+ hashTags: [
11259
+ "Handbags"
11260
+ ]
11261
+ },
11262
+ product: null,
11263
+ cta: null
11264
+ },
11265
+ {
11266
+ position: "18",
11267
+ isCollected: null,
11268
+ video: {
11269
+ itemId: "VIDEOC2IMa1710324169054",
11270
+ title: "The lady dior bag embodies dior's vision of elegance and beauty. Sleek and refined, the timeless style demonstrates the house's exceptional savoir-faire. The black patent-to-matte gradient lambskin style is embellished with iconic cannage topstitching, while the ultra-matte metal d.i.o.r. Charms lend a modern touch. Featuring a thin, removable leather shoulder strap, the medium lady dior bag can be carried by hand or worn crossbody.",
11271
+ tags: [
11272
+ "Lady Dior",
11273
+ "Removable Shoulder Strap",
11274
+ "Medium",
11275
+ "Handbags",
11276
+ "Crossbody"
11277
+ ],
11278
+ weight: null,
11279
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOC2IMa1710324169054:default:3::branch:Handbags:18",
11280
+ bindCta: null,
11281
+ bindProduct: {
11282
+ itemId: "M0565SDBRM900",
11283
+ title: "Medium Lady Dior Bag",
11284
+ tags: [
11285
+ "Women",
11286
+ "Black",
11287
+ "Handbags",
11288
+ "Hand",
11289
+ "Lady Dior",
11290
+ "Crossbody"
11291
+ ],
11292
+ weight: null,
11293
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565SDBRM900:default:3::branch:Handbags:18",
11294
+ bindCta: {
11295
+ itemId: "CTAzgoPn1709005149328",
11296
+ title: "立即购买",
11297
+ tags: [
11298
+ ],
11299
+ weight: null,
11300
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:18",
11301
+ enTitle: "Shop now",
11302
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11303
+ link: null,
11304
+ linkTitle: null,
11305
+ linkType: null,
11306
+ menuCategoryId: "65966478d19caa37afe3603f"
11307
+ },
11308
+ homePage: [
11309
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsnyiCm9oirbXLqmqY7231O8O2Yhb1710498970982.jpg",
11310
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fskwIRRKCtuw9cb9btuubt2D5bXfB1710498970676.jpg",
11311
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqXFTCyhxspeYCD3uo4UiuN5vQ7w1710498970671.jpg",
11312
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8rDRSKJmWUNI42MjrMWVlI0D9Fz1710498970729.jpg",
11313
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsca9Cjqo3WMJVU0OL0OjQo8xOoMx1710498972076.jpg",
11314
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsjl1bxi56X0QrKwfvl8YocBVJ2N81710498971352.jpg"
11315
+ ],
11316
+ collection: null,
11317
+ link: "https://www.dior.com/en_us/fashion/products/M0565SDBR_M900-medium-lady-dior-bag-black-patent-to-matte-gradient-cannage-lambskin?objectID=M0565SDBR_M900&query=M0565SDBRM900&queryID=14cc52b35774a9a42e78fd9ba199860e",
11318
+ linkTitle: null,
11319
+ linkType: "WEB",
11320
+ info: "The Lady Dior bag embodies Dior's vision of elegance and beauty. Sleek and refined, the timeless style demonstrates the House's exceptional savoir-faire. The black patent-to-matte gradient lambskin style is embellished with iconic Cannage topstitching, while the ultra-matte metal D.I.O.R. charms lend a modern touch. Featuring a thin, removable leather shoulder strap, the medium Lady Dior bag can be carried by hand or worn crossbody.",
11321
+ price: 7100,
11322
+ currency: "USD-$"
11323
+ },
11324
+ bindProducts: [
11325
+ ],
11326
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsuF6sqlC9LCBLTgxHwMRinXwB6bF1710324135846.png",
11327
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsFwNsGElWR2SXQ2tWwHkaiqMZN5H1710324095954.mp4",
11328
+ imgUrls: null,
11329
+ hashTags: [
11330
+ "Lady Dior",
11331
+ "Handbags"
11332
+ ]
11333
+ },
11334
+ product: null,
11335
+ cta: null
11336
+ },
11337
+ {
11338
+ position: "19",
11339
+ isCollected: null,
11340
+ video: null,
11341
+ product: {
11342
+ itemId: "M0565OZEDM928",
11343
+ title: "Medium Lady Dior Bag",
11344
+ tags: [
11345
+ "Lady Dior",
11346
+ "Medium",
11347
+ "Handbags",
11348
+ "Crossbody"
11349
+ ],
11350
+ weight: null,
11351
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565OZEDM928:default:3::branch:Handbags:19",
11352
+ bindCta: {
11353
+ itemId: "CTAzgoPn1709005149328",
11354
+ title: "立即购买",
11355
+ tags: [
11356
+ ],
11357
+ weight: null,
11358
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:19",
11359
+ enTitle: "Shop now",
11360
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11361
+ link: null,
11362
+ linkTitle: null,
11363
+ linkType: null,
11364
+ menuCategoryId: "65966478d19caa37afe3603f"
11365
+ },
11366
+ homePage: [
11367
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsbVwOx4grEmqCNmvOnKpIS0vTPPc1710499656033.jpg",
11368
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsJrpY9R8uGenvzM7NnzI4lPMCF8g1710836215790.jpg",
11369
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsYQG9gipUNt6UbzFPXTwLTNgj5BF1710836214937.jpg",
11370
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsqPEXjWl7l3wPAxJIZbnnhZPXDCw1710836216838.jpg",
11371
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsNHlPmAsNYPsGDJ5w0G213wJkwFf1710499654946.jpg",
11372
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8dAObnEoAYe1V6pwJOGTs4vCBJO1710499655963.jpg",
11373
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsJpaBPC8OxQ4aYwxsMcqZpGtPWnq1710499655730.jpg"
11374
+ ],
11375
+ collection: "Eté 2024",
11376
+ link: "https://www.dior.com/en_us/fashion/products/M0565OZED_M928",
11377
+ linkTitle: null,
11378
+ linkType: "WEB",
11379
+ info: "The Lady Dior bag embodies Dior's vision of elegance and beauty. Sleek and refined, the timeless white and navy blue calfskin style offers a new take on the iconic House motif with this season's signature Toile de Jouy Soleil, layering suns and crescent moons into a floral design representing the four seasons. Accented by pale gold-finish metal D.I.O.R. charms illuminating the silhouette and featuring a thin, removable leather shoulder strap, the medium Lady Dior bag can be carried by hand or wo",
11380
+ price: 6500,
11381
+ currency: "USD-$"
11382
+ },
11383
+ cta: null
11384
+ }
11385
+ ];
11386
+ var hashTag = "Handbags";
11387
+ var previewData = {
11388
+ productUserId: productUserId,
11389
+ requestId: requestId,
11390
+ channel: channel,
11391
+ rtc: rtc,
11392
+ tag: tag,
11393
+ recList: recList,
11394
+ hashTag: hashTag
11395
+ };
10001
11396
 
10002
- const VideoWidget = ({ rec, index, height, data, muted, activeIndex }) => {
10003
- const [isPauseVideo, setIsPauseVideo] = useState(false);
10004
- const videoRef = useRef(null);
10005
- const { bffEventReport, sxpParameter, waterFallData, openHashtag } = useSxpDataSource();
10006
- const videoStartTime = useRef(0);
10007
- const [isLoad, setIsLoad] = useState(false);
10008
- const { isActive } = useSwiperSlide();
10009
- useEffect(() => {
10010
- if (!videoRef.current)
10011
- return;
10012
- videoRef.current.muted = muted;
10013
- }, [muted]);
10014
- const handleVideoStart = useCallback(() => {
10015
- var _a, _b;
10016
- if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
10017
- return;
10018
- (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
10019
- }, []);
10020
- const PAUSE_ICON = useIconLink('/pb_static/06f28a2025c74c1cb49be6767316d827.png');
10021
- const handlePlaying = useCallback(() => {
10022
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
10023
- setIsPauseVideo(false);
10024
- const item = data[index];
10025
- if (item && isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
10026
- videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
10027
- const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
10028
- const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
10029
- const playType = '1';
10030
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10031
- eventInfo: {
10032
- eventSubject: 'playVideo',
10033
- eventDescription: 'User played the video',
10034
- contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
10035
- contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
10036
- playType,
10037
- startTime: videoCurrentTime,
10038
- videoDuration,
10039
- contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
10040
- position: item.position,
10041
- contentFormat: 'video',
10042
- traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10043
- }
10044
- });
10045
- }
10046
- if (!isLoad) {
10047
- setIsLoad(true);
11397
+ const WaterfallFlowItem = (props) => {
11398
+ const { rec, index, list, reportTagsView, textStyles, space } = props;
11399
+ const { swiperRef, setRtcList, setOpenHashtag, bffEventReport, sxpParameter } = useSxpDataSource();
11400
+ const [showVideo, setShowVideo] = useState(false);
11401
+ const imgDom = useRef(null);
11402
+ const videoDom = useRef(null);
11403
+ const canvasRef = useRef(null);
11404
+ const [firstFrameSrc, setFirstFrameSrc] = useState('');
11405
+ const src = useMemo(() => {
11406
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
11407
+ if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.cover) {
11408
+ return (_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.cover;
10048
11409
  }
10049
- }, [bffEventReport, data, index, isLoad]);
10050
- const handleLoadedMetadata = useCallback(() => {
10051
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
10052
- const item = data[index];
10053
- if (item && !isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
10054
- videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
10055
- const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
10056
- const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
10057
- const playType = '0';
10058
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10059
- eventInfo: {
10060
- eventSubject: 'playVideo',
10061
- eventDescription: 'User played the video',
10062
- contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
10063
- contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
10064
- playType,
10065
- startTime: videoCurrentTime,
10066
- videoDuration,
10067
- contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
10068
- position: item.position,
10069
- contentFormat: 'video',
10070
- traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10071
- }
10072
- });
11410
+ else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.url) {
11411
+ setShowVideo(true);
11412
+ return (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.url;
10073
11413
  }
10074
- setTimeout(() => {
10075
- var _a, _b;
10076
- if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
10077
- return;
10078
- (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
10079
- }, 0);
10080
- }, [index, bffEventReport, data, isLoad]);
10081
- const handleClickVideo = useCallback((type) => () => {
10082
- var _a, _b, _c, _d, _e, _f;
10083
- if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
10084
- return;
10085
- if (!isLoad)
10086
- return;
10087
- const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
10088
- switch (type) {
10089
- case 'start':
10090
- if (!isPause)
10091
- return;
10092
- (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.play();
10093
- setIsPauseVideo(false);
10094
- break;
10095
- case 'pause':
10096
- if (isPause)
10097
- return;
10098
- (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.pause();
10099
- setIsPauseVideo(true);
10100
- break;
10101
- default:
10102
- if (isPause) {
10103
- (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.play();
10104
- }
10105
- else {
10106
- (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.pause();
10107
- }
10108
- setIsPauseVideo(!isPause);
10109
- break;
11414
+ else if ((_f = (_e = rec === null || rec === void 0 ? void 0 : rec.video) === null || _e === void 0 ? void 0 : _e.imgUrls) === null || _f === void 0 ? void 0 : _f.length) {
11415
+ return (_h = (_g = rec === null || rec === void 0 ? void 0 : rec.video) === null || _g === void 0 ? void 0 : _g.imgUrls) === null || _h === void 0 ? void 0 : _h[0];
10110
11416
  }
10111
- }, [data, index, isLoad]);
10112
- const onPause = useCallback(() => {
10113
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
10114
- const item = data[index];
10115
- const videoDuration = ((_b = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.duration) !== null && _b !== void 0 ? _b : 0).toFixed(2);
10116
- const videoCurrentTime = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.currentTime) !== null && _d !== void 0 ? _d : 0).toFixed(2);
10117
- if ((_e = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _e === void 0 ? void 0 : _e.duration) {
10118
- const playDuration = (((_f = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _f === void 0 ? void 0 : _f.currentTime) - videoStartTime.current).toFixed(2);
10119
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10120
- eventInfo: {
10121
- eventSubject: 'playOverVideo',
10122
- eventDescription: 'User finished playing the video',
10123
- contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
10124
- contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
10125
- endTime: videoCurrentTime,
10126
- videoDuration,
10127
- playDuration,
10128
- contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
10129
- position: item.position,
10130
- contentFormat: 'video',
10131
- traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10132
- }
10133
- });
11417
+ else if ((_k = (_j = rec === null || rec === void 0 ? void 0 : rec.product) === null || _j === void 0 ? void 0 : _j.homePage) === null || _k === void 0 ? void 0 : _k.length) {
11418
+ return (_m = (_l = rec === null || rec === void 0 ? void 0 : rec.product) === null || _l === void 0 ? void 0 : _l.homePage) === null || _m === void 0 ? void 0 : _m[0];
10134
11419
  }
10135
- }, [data, index, bffEventReport]);
10136
- useEffect(() => {
10137
- var _a, _b, _c, _d, _e, _f;
10138
- if (data.length <= 0)
10139
- return;
10140
- if (!videoRef.current)
10141
- return;
10142
- const isPause = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.paused;
10143
- setIsPauseVideo(false);
10144
- if (!isActive) {
10145
- if (!isPause && ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.readyState) >= 2)
10146
- (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
10147
- return;
11420
+ else {
11421
+ return (sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image) || '';
10148
11422
  }
10149
- if (!videoRef.current.src) {
10150
- const videoSrc = rec.video.url;
10151
- // if (videoSrc.includes('.m3u8')) {
10152
- // if (Hls.isSupported()) {
10153
- // const hls = new Hls();
10154
- // hls.loadSource(videoSrc);
10155
- // hls.attachMedia(videoRef.current);
10156
- // } else if (videoRef.current.canPlayType('application/vnd.apple.mpegurl')) {
10157
- // videoRef.current.src = videoSrc;
10158
- // } else {
10159
- // videoRef.current.src = videoSrc;
10160
- // }
10161
- // } else {
10162
- // videoRef.current.src = videoSrc;
10163
- // }
10164
- videoRef.current.src = videoSrc;
10165
- videoRef.current.setAttribute('x5-playsinline', 'true');
10166
- videoRef.current.setAttribute('webkit-playsinline', 'true');
11423
+ }, [rec, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image]);
11424
+ const title = useMemo(() => {
11425
+ var _a, _b;
11426
+ return ((_a = rec === null || rec === void 0 ? void 0 : rec.product) === null || _a === void 0 ? void 0 : _a.title) || ((_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.title) || null;
11427
+ }, [rec]);
11428
+ const priceText = useMemo(() => {
11429
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
11430
+ if (((_a = rec === null || rec === void 0 ? void 0 : rec.product) === null || _a === void 0 ? void 0 : _a.currency) && ((_b = rec === null || rec === void 0 ? void 0 : rec.product) === null || _b === void 0 ? void 0 : _b.price)) {
11431
+ return `${(_f = (_e = (_d = (_c = rec === null || rec === void 0 ? void 0 : rec.product) === null || _c === void 0 ? void 0 : _c.currency) === null || _d === void 0 ? void 0 : _d.split('-')[1]) === null || _e === void 0 ? void 0 : _e.toUpperCase()) !== null && _f !== void 0 ? _f : ''}${(_j = (_h = (_g = rec === null || rec === void 0 ? void 0 : rec.product) === null || _g === void 0 ? void 0 : _g.price) === null || _h === void 0 ? void 0 : _h.toLocaleString('zh', {
11432
+ minimumFractionDigits: 0
11433
+ })) !== null && _j !== void 0 ? _j : ''}`;
10167
11434
  }
10168
11435
  else {
10169
- if (((_d = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _d === void 0 ? void 0 : _d.readyState) < 2)
10170
- return;
10171
- videoRef.current.play();
11436
+ return null;
10172
11437
  }
10173
- (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener('canplay', handleLoadedMetadata);
10174
- (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.addEventListener('playing', handlePlaying);
11438
+ }, [rec]);
11439
+ // useEffect(() => {
11440
+ // if (imgDom.current === null || src === '') {
11441
+ // return;
11442
+ // }
11443
+ // const img = new Image();
11444
+ // if (showVideo && firstFrameSrc) {
11445
+ // img.src = firstFrameSrc;
11446
+ // } else {
11447
+ // img.src = src;
11448
+ // }
11449
+ // // img.onload = () => {
11450
+ // // setIsLoading(true);
11451
+ // // };
11452
+ // imgDom.current.src = img.src;
11453
+ // }, [src, showVideo, firstFrameSrc]);
11454
+ useEffect(() => {
11455
+ const observer = new IntersectionObserver((entries) => {
11456
+ entries.forEach((entry) => {
11457
+ if (entry.isIntersecting) {
11458
+ if (imgDom.current === null || src === '') {
11459
+ return;
11460
+ }
11461
+ if (showVideo && firstFrameSrc) {
11462
+ imgDom.current.src = firstFrameSrc;
11463
+ }
11464
+ else {
11465
+ imgDom.current.src = src;
11466
+ }
11467
+ observer.unobserve(imgDom.current);
11468
+ }
11469
+ });
11470
+ });
11471
+ observer.observe(imgDom.current);
10175
11472
  return () => {
10176
- var _a, _b;
10177
- (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('canplay', handleLoadedMetadata);
10178
- (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener('playing', handlePlaying);
11473
+ observer.disconnect();
10179
11474
  };
10180
- }, [data, handleLoadedMetadata, handlePlaying, isActive, isLoad, rec.video]);
10181
- /*
10182
- 打开/关闭hashtag暂停/播放视频
10183
- */
11475
+ }, [src, showVideo, firstFrameSrc]);
11476
+ const calculateHeightForWidth = (videoWidth, videoHeight, targetWidth) => {
11477
+ const aspectRatio = videoWidth / videoHeight;
11478
+ const targetHeight = targetWidth / aspectRatio;
11479
+ return targetHeight;
11480
+ };
10184
11481
  useEffect(() => {
10185
- var _a, _b, _c, _d;
10186
- if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
10187
- return;
10188
- const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
10189
- if (!isActive)
11482
+ const video = videoDom === null || videoDom === void 0 ? void 0 : videoDom.current;
11483
+ if (video === null || src === '' || !showVideo) {
10190
11484
  return;
10191
- if (!isPause && openHashtag) {
10192
- (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
10193
- }
10194
- else if (!openHashtag) {
10195
- (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.play();
10196
11485
  }
10197
- }, [openHashtag, isActive]);
10198
- useEffect(() => {
10199
- if (!isActive)
10200
- return;
10201
- const onShow = handleClickVideo('start');
10202
- const onHide = handleClickVideo('pause');
10203
- SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
10204
- SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
10205
- return () => {
10206
- SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
10207
- SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
11486
+ video.src = src;
11487
+ video.currentTime = 1;
11488
+ video.crossOrigin = 'anonymous';
11489
+ video.onloadeddata = () => {
11490
+ const canvas = canvasRef === null || canvasRef === void 0 ? void 0 : canvasRef.current;
11491
+ if (!canvas)
11492
+ return;
11493
+ const ctx = canvas.getContext('2d');
11494
+ const targetWidth = (window === null || window === void 0 ? void 0 : window.innerWidth) / 2;
11495
+ const targetHeight = calculateHeightForWidth(video.videoWidth, video.videoHeight, targetWidth);
11496
+ canvas.height = targetHeight;
11497
+ canvas.width = targetWidth;
11498
+ ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
11499
+ setFirstFrameSrc(canvas.toDataURL());
11500
+ video.remove();
11501
+ canvas.remove();
10208
11502
  };
10209
- }, [handleClickVideo, isActive]);
10210
- const renderPoster = useMemo(() => {
10211
- if (!(sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image)) {
10212
- return null;
11503
+ }, [src, showVideo]);
11504
+ const handleClickToDetail = () => {
11505
+ reportTagsView();
11506
+ setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(list);
11507
+ setTimeout(() => {
11508
+ var _a;
11509
+ (_a = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _a === void 0 ? void 0 : _a.swiper.slideTo(index, 0, false);
11510
+ setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
11511
+ }, 0);
11512
+ };
11513
+ return (React.createElement("div", { className: 'list-content-listItem', key: index, onClick: handleClickToDetail, style: { marginBottom: space } },
11514
+ React.createElement("div", { className: 'list-content-listItem-picture' },
11515
+ showVideo && (React.createElement("div", { style: { display: 'none' } },
11516
+ React.createElement("video", { ref: videoDom, crossOrigin: 'anonymous', className: 'list-content-listItem-picture-img' }),
11517
+ React.createElement("canvas", { ref: canvasRef }))),
11518
+ React.createElement("img", { className: 'list-content-listItem-picture-img', loading: 'lazy', ref: imgDom })),
11519
+ React.createElement("div", { className: 'list-content-listItem-info' },
11520
+ React.createElement("div", { className: `${'list-content-listItem-info-title'} ${priceText ? 'list-content-listItem-info-nowrap' : ''}`, style: textStyles === null || textStyles === void 0 ? void 0 : textStyles.title }, title && title),
11521
+ React.createElement("div", { className: 'list-content-listItem-info-price', style: textStyles.price, hidden: !priceText }, priceText))));
11522
+ };
11523
+ function WaterfallList(_a) {
11524
+ var _b, _c, _d, _e, _f, _g, _h;
11525
+ var { reportTagsView } = _a, props = __rest(_a, ["reportTagsView"]);
11526
+ const { waterFallData, getRecommendVideos, hashTagSize, loadingImage, isOpenHashTag } = useSxpDataSource();
11527
+ const [list, setList] = useState();
11528
+ const [data, setData] = useState();
11529
+ const [isLoadingData, setIsLoadingData] = useState(false);
11530
+ const containerRef = useRef(null);
11531
+ const [isLoadMore, setIsLoadMore] = useState(false);
11532
+ useCallback(() => {
11533
+ if (isLoadMore)
11534
+ return;
11535
+ setIsLoadMore(true);
11536
+ waterFallData &&
11537
+ (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
11538
+ hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
11539
+ 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
11540
+ 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType
11541
+ }).then((res) => {
11542
+ var _a;
11543
+ setList(list === null || list === void 0 ? void 0 : list.concat((_a = res === null || res === void 0 ? void 0 : res.recList) !== null && _a !== void 0 ? _a : []));
11544
+ setIsLoadMore(false);
11545
+ }));
11546
+ }, [waterFallData, getRecommendVideos, list, isLoadMore]);
11547
+ useEffect(() => {
11548
+ var _a, _b;
11549
+ setIsLoadingData(true);
11550
+ waterFallData &&
11551
+ (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
11552
+ hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
11553
+ 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
11554
+ 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType,
11555
+ defaultSize: hashTagSize
11556
+ }).then((res) => {
11557
+ var _a, _b;
11558
+ setData(res);
11559
+ setList((_b = (_a = res === null || res === void 0 ? void 0 : res.recList) === null || _a === void 0 ? void 0 : _a.filter((item) => (item === null || item === void 0 ? void 0 : item.video) !== null || (item === null || item === void 0 ? void 0 : item.product) !== null)) !== null && _b !== void 0 ? _b : []);
11560
+ setIsLoadingData(false);
11561
+ }));
11562
+ if (isOpenHashTag) {
11563
+ const res = previewData;
11564
+ setData(res);
11565
+ setList((_b = (_a = res === null || res === void 0 ? void 0 : res.recList) === null || _a === void 0 ? void 0 : _a.filter((item) => (item === null || item === void 0 ? void 0 : item.video) !== null || (item === null || item === void 0 ? void 0 : item.product) !== null)) !== null && _b !== void 0 ? _b : []);
11566
+ setIsLoadingData(false);
10213
11567
  }
10214
- return (React.createElement("img", { hidden: isLoad, style: { position: 'absolute', left: 0, top: 0, width: '100%', height: '100%', objectFit: 'cover' }, src: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image }));
10215
- }, [isLoad, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image]);
11568
+ }, [waterFallData, getRecommendVideos, hashTagSize, isOpenHashTag]);
11569
+ // useEffect(() => {
11570
+ // const container = containerRef?.current;
11571
+ // if (!container) return;
11572
+ // const handleScroll = () => {
11573
+ // const top = (container as any)?.scrollTop;
11574
+ // const clientHeight = (container as any)?.clientHeight;
11575
+ // const scrollHeight = (container as any)?.scrollHeight;
11576
+ // if (scrollHeight <= top + clientHeight && !isLoadingData) {
11577
+ // loadMoreData();
11578
+ // }
11579
+ // };
11580
+ // container?.addEventListener('scroll', handleScroll);
11581
+ // return () => {
11582
+ // container?.removeEventListener('scroll', handleScroll); // 在组件卸载时移除事件监听器
11583
+ // };
11584
+ // }, [isLoadingData, containerRef, loadMoreData]);
11585
+ const handleClickLink = () => {
11586
+ var _a, _b;
11587
+ if ((_a = data === null || data === void 0 ? void 0 : data.tag) === null || _a === void 0 ? void 0 : _a.link) {
11588
+ reportTagsView();
11589
+ window.location.href = (_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.link;
11590
+ }
11591
+ };
11592
+ return (React.createElement(React.Fragment, null, isLoadingData ? (React.createElement("div", { style: { height: '100%', width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' } },
11593
+ React.createElement("img", { width: 64, height: 64, src: loadingImage, alt: 'loading...', style: { objectFit: 'contain' } }))) : (React.createElement("div", { className: 'list' },
11594
+ React.createElement("div", { className: 'list-scroll', ref: containerRef, style: {
11595
+ bottom: ((_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.link) ? '100px' : 0
11596
+ } },
11597
+ React.createElement("div", { className: 'list-info', style: (_c = props === null || props === void 0 ? void 0 : props.textStyles) === null || _c === void 0 ? void 0 : _c.hashTagDesc }, (_d = data === null || data === void 0 ? void 0 : data.tag) === null || _d === void 0 ? void 0 : _d.info),
11598
+ React.createElement("div", { hidden: !((_e = data === null || data === void 0 ? void 0 : data.tag) === null || _e === void 0 ? void 0 : _e.link), className: 'list-collection', onClick: handleClickLink, style: { marginBottom: props === null || props === void 0 ? void 0 : props.space } }, ((_f = data === null || data === void 0 ? void 0 : data.tag) === null || _f === void 0 ? void 0 : _f.linkTitle) || 'Shop the collection'),
11599
+ React.createElement("div", { className: 'list-content' }, list === null || list === void 0 ? void 0 : list.map((item, ind) => {
11600
+ return (React.createElement(WaterfallFlowItem, Object.assign({ key: ind, index: ind, rec: item, list: list, reportTagsView: reportTagsView }, props)));
11601
+ })),
11602
+ React.createElement("div", { hidden: !isLoadMore, style: { textAlign: 'center' } }, "loading...")),
11603
+ React.createElement("div", { className: 'list-bottom', hidden: !((_g = data === null || data === void 0 ? void 0 : data.tag) === null || _g === void 0 ? void 0 : _g.link) },
11604
+ React.createElement("button", { className: 'list-bottom-btn', style: props === null || props === void 0 ? void 0 : props.buttonStyle, onClick: handleClickLink }, ((_h = data === null || data === void 0 ? void 0 : data.tag) === null || _h === void 0 ? void 0 : _h.linkTitle) || 'Shop the collection'))))));
11605
+ }
11606
+
11607
+ var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAaZJREFUeF7t2jFKBEEQRuG3mSJeQTARURDMTL2EqXfwAnoKD6FHMDEzNVIw2tzQC2gFggyDrExX1V92T7wz9PumFnqbXdH5teq8nwEwJqBzgfEVKDYAW8Ae8NZq3ZUm4Aa4AnaBR+C8BUIVAIu/ngSfAs9LESoAWLgB/LzWwP7SeLtfHWAu3tZ9Adz/dwD3eOUJCIlXBQiLVwQIjVcDCI9XAkiJVwFIi1cASI3PBpjb3jbd5GyyUcraCUrEZ02ATHwGgFR8NIBcfCSAZHwUgGx8BIB0vDeAfLwnQIl4L4Ay8R4ApeJbA2wD78DOZA/e7ABzk739Xz/T8rfAIfA6WYCd3BqA7NUSwCKfgLNKCK0BjoC7rzP74yoIrQGsuxSCB0ApBC+AMgieACUQvAHkESIApBGiAGQRIgEkEaIB5BAyAKQQsgBkEDIBJBCyAdIRFABSEVQA0hCUAFIQ1ADCERQBQhFUAcIQlAFCENQBfkOwg9eXpeftFQDmEOzv8ifARy8A3wiXwAHwANwujbf7q0xAi9bZZwwAN9oiDx4TUORFuS2z+wn4BAiAaEHnKChjAAAAAElFTkSuQmCC";
11608
+
11609
+ /*
11610
+ * @Author: binruan@chatlabs.com
11611
+ * @Date: 2024-01-10 10:58:24
11612
+ * @LastEditors: binruan@chatlabs.com
11613
+ * @LastEditTime: 2024-04-07 15:18:35
11614
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\WaterFall\index.tsx
11615
+ *
11616
+ */
11617
+ const WaterFall = (props) => {
11618
+ var _a;
11619
+ const { waterFallData, setOpenHashtag, openHashtag, swiperRef, setWaterFallData, cacheRtcList, setRtcList, cacheActiveIndex, rtcList, setCacheRtcList, setIsFromHashtag, isFromHashtag, bffEventReport } = useSxpDataSource();
11620
+ useRef(null);
11621
+ const modalEleRef = useRef(null);
11622
+ const [viewTime, setViewTime] = useState();
10216
11623
  useEffect(() => {
10217
- const handleBeforeUnload = () => {
11624
+ const parentNode = document.getElementById('sxp-render');
11625
+ const node = document.getElementById('water-fall');
11626
+ if (node) {
11627
+ modalEleRef.current = node;
11628
+ }
11629
+ else {
11630
+ modalEleRef.current = document.createElement('div');
11631
+ modalEleRef.current.setAttribute('id', 'water-fall');
11632
+ parentNode === null || parentNode === void 0 ? void 0 : parentNode.appendChild(modalEleRef.current);
11633
+ }
11634
+ }, []);
11635
+ const handleClose = () => {
11636
+ const isEq = isEqual(rtcList, cacheRtcList);
11637
+ if (!isEq && cacheRtcList && (cacheRtcList === null || cacheRtcList === void 0 ? void 0 : cacheRtcList.length)) {
11638
+ setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(cacheRtcList);
11639
+ }
11640
+ reportTagsView();
11641
+ setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData(undefined);
11642
+ setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(false);
11643
+ setTimeout(() => {
10218
11644
  var _a, _b;
10219
- if (activeIndex === index && ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.url) && ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.src) && !isPauseVideo) {
10220
- handleClickVideo('pause')();
11645
+ if (!isEq) {
11646
+ (_b = (_a = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _a === void 0 ? void 0 : _a.swiper) === null || _b === void 0 ? void 0 : _b.slideTo(cacheActiveIndex, 0, false);
11647
+ }
11648
+ setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
11649
+ }, 0);
11650
+ };
11651
+ const [recData, setRecData] = useState();
11652
+ useEffect(() => {
11653
+ if (waterFallData) {
11654
+ setRecData(waterFallData);
11655
+ }
11656
+ }, [waterFallData]);
11657
+ const reportTagsView = useCallback(() => {
11658
+ var _a, _b, _c, _d, _e, _f;
11659
+ const rec = recData === null || recData === void 0 ? void 0 : recData.rec;
11660
+ if (!rec)
11661
+ return;
11662
+ let fromKName = '';
11663
+ if (isFromHashtag) {
11664
+ fromKName = 'hashTagPage';
11665
+ }
11666
+ else if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.url) {
11667
+ fromKName = 'videoPage';
11668
+ }
11669
+ else if ((_c = (_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.imgUrls) === null || _c === void 0 ? void 0 : _c.length) {
11670
+ fromKName = 'imagePage';
11671
+ }
11672
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11673
+ eventInfo: {
11674
+ relatedContentId: (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.itemId,
11675
+ position: rec === null || rec === void 0 ? void 0 : rec.position,
11676
+ contentTags: JSON.stringify((_e = rec === null || rec === void 0 ? void 0 : rec.video) === null || _e === void 0 ? void 0 : _e.tags),
11677
+ traceInfo: JSON.stringify((_f = rec === null || rec === void 0 ? void 0 : rec.video) === null || _f === void 0 ? void 0 : _f.traceInfo),
11678
+ hashTags: JSON.stringify([recData === null || recData === void 0 ? void 0 : recData.hashTag]),
11679
+ fromKName,
11680
+ fromKPage: location === null || location === void 0 ? void 0 : location.href,
11681
+ timeOnSite: Math.floor((new Date() - viewTime) / 1000) + '',
11682
+ eventSubject: 'clickTagsViewContents',
11683
+ eventDescription: 'User click tags view contents'
10221
11684
  }
11685
+ });
11686
+ }, [recData, bffEventReport, viewTime, isFromHashtag]);
11687
+ useEffect(() => {
11688
+ if (openHashtag) {
11689
+ setViewTime(new Date());
11690
+ }
11691
+ }, [openHashtag]);
11692
+ useEffect(() => {
11693
+ const initTime = () => {
11694
+ setViewTime(new Date());
10222
11695
  };
10223
- window.addEventListener('beforeunload', handleBeforeUnload);
11696
+ window.addEventListener('pageshow', initTime);
10224
11697
  return () => {
10225
- window.removeEventListener('beforeunload', handleBeforeUnload);
11698
+ window.removeEventListener('pageshow', initTime);
10226
11699
  };
10227
- }, [activeIndex, index, rec, videoRef, handleClickVideo, isPauseVideo]);
10228
- if (!rec.video) {
11700
+ }, []);
11701
+ if (!modalEleRef.current)
10229
11702
  return null;
10230
- }
10231
- return (React.createElement("div", { className: 'video-container', key: rec.video.itemId, onClick: handleClickVideo(), style: {
10232
- position: 'relative',
10233
- width: '100%',
10234
- height
11703
+ return ReactDOM.createPortal(React.createElement("div", { className: 'waterfall', style: {
11704
+ display: openHashtag ? 'block' : 'none'
10235
11705
  } },
10236
- React.createElement("video", { id: `pb-video-${index}`, className: 'clc-pb-video', ref: videoRef, poster: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, muted: true, controls: false, playsInline: true, preload: 'auto', onPause: onPause, onEnded: handleVideoStart }),
10237
- renderPoster,
10238
- React.createElement("img", { hidden: !isPauseVideo, className: 'clc-pb-video-pause', src: PAUSE_ICON })));
11706
+ React.createElement(Navbar$1, { icon: img$1, styles: { top: '32px' }, textStyle: (_a = props === null || props === void 0 ? void 0 : props.textStyles) === null || _a === void 0 ? void 0 : _a.hashTagTitle, onClose: handleClose }),
11707
+ React.createElement(WaterfallList, Object.assign({ reportTagsView: reportTagsView }, props))), modalEleRef.current);
10239
11708
  };
10240
- var VideoWidget$1 = memo(VideoWidget);
11709
+ var WaterFall$1 = memo(WaterFall);
10241
11710
 
10242
11711
  /*
10243
11712
  * @Author: binruan@chatlabs.com
10244
- * @Date: 2023-12-27 19:02:59
11713
+ * @Date: 2024-01-15 19:03:09
10245
11714
  * @LastEditors: binruan@chatlabs.com
10246
- * @LastEditTime: 2024-01-24 10:30:13
10247
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\ToggleButton\index.tsx
11715
+ * @LastEditTime: 2024-04-07 15:42:10
11716
+ * @FilePath: \pb-sxp-ui\src\materials\sxp\HashTag\index.tsx
10248
11717
  *
10249
11718
  */
10250
- const ToggleButton = ({ defaultValue, activeIcon, unactiveIcon, onChange, style }) => {
10251
- const [isTrue, setIsTure] = useState(defaultValue);
10252
- const handleClick = (e) => {
10253
- e.stopPropagation();
10254
- const result = !isTrue;
10255
- setIsTure(result);
10256
- onChange === null || onChange === void 0 ? void 0 : onChange(result);
10257
- };
10258
- return (React.createElement("button", { style: style, className: 'pb-toggle-button', onClick: handleClick },
10259
- React.createElement("img", { className: 'pb-toggle-button-icon', src: isTrue ? activeIcon : unactiveIcon })));
11719
+ const HashTag$1 = (props) => {
11720
+ return React.createElement(WaterFall$1, Object.assign({}, props));
10260
11721
  };
10261
- var ToggleButton$1 = memo(ToggleButton);
11722
+ var HashTagComponent = memo(HashTag$1);
10262
11723
 
10263
11724
  /*
10264
11725
  * @Author: binruan@chatlabs.com
10265
- * @Date: 2024-01-15 19:03:09
11726
+ * @Date: 2023-07-28 18:29:57
10266
11727
  * @LastEditors: binruan@chatlabs.com
10267
- * @LastEditTime: 2024-03-13 10:53:56
10268
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\FingerSwipeTip\index.tsx
11728
+ * @LastEditTime: 2024-04-07 16:22:28
11729
+ * @FilePath: \pb-sxp-ui\src\materials\sxp\HashTag\material.tsx
10269
11730
  *
10270
11731
  */
10271
- const FingerSwipeTip = ({ imageUrl }) => {
10272
- const [show, setShow] = useState(true);
10273
- useEditor();
10274
- useEffect(() => {
10275
- setTimeout(() => {
10276
- setShow(false);
10277
- }, 2000);
10278
- }, []);
10279
- const FINGER_SWIPE_ICON = useIconLink('/pb_static/finger-swipe-tip.29dc3a48a3c746c906ea..png');
10280
- const animationCls = useMemo(() => {
10281
- return show ? 'pb-fadeIn' : 'pb-fadeOut';
10282
- }, [show]);
10283
- return (React.createElement("div", { hidden: !show, className: `pb-finger-wrap ${animationCls}` },
10284
- React.createElement("img", { src: imageUrl || FINGER_SWIPE_ICON })));
10285
- };
10286
-
10287
- const Picture = (props) => {
10288
- const { src, height, width } = props;
10289
- const imgDom = useRef(null);
10290
- const { sxpParameter } = useSxpDataSource();
10291
- return (React.createElement("div", { style: {
10292
- overflow: 'hidden',
10293
- height,
10294
- width: '100%',
10295
- position: 'relative'
10296
- } },
10297
- React.createElement("img", { ref: imgDom, loading: 'lazy', src: src !== null && src !== void 0 ? src : sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, style: {
10298
- height: '100%',
10299
- width: '100%',
10300
- objectFit: 'cover'
10301
- } })));
10302
- };
10303
-
10304
- /*
10305
- * @Author: lewinlu@chatlabs.com
10306
- * @Date: 2024-01-03 14:39:09
10307
- * @LastEditors: binruan@chatlabs.com
10308
- * @LastEditTime: 2024-03-25 15:08:11
10309
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\PictureGroup\index.tsx
10310
- */
10311
- const PictureGroup = ({ imgUrls, width, height, rec, index, onReportViewImageEnd, onViewImageStartEvent }) => {
10312
- const { isActive } = useSwiperSlide();
10313
- const { sxpParameter, openHashtag } = useSxpDataSource();
10314
- const [isLoad, setIsLoad] = useState(false);
10315
- useEffect(() => {
10316
- if (isLoad && isActive) {
10317
- if (openHashtag) {
10318
- onReportViewImageEnd(rec);
10319
- }
10320
- else {
10321
- onViewImageStartEvent(index);
11732
+ const HashTag = createMaterial(HashTagComponent, {
11733
+ displayName: '',
11734
+ icon: '',
11735
+ category: 'base',
11736
+ type: 'HashTag',
11737
+ related: {
11738
+ settingRender,
11739
+ bindableProps: []
11740
+ },
11741
+ defaulSetting: {
11742
+ props: {
11743
+ lineClamp: 1,
11744
+ space: 40,
11745
+ textStyles: {
11746
+ hashTagTitle: {
11747
+ fontSize: 16,
11748
+ color: '#000'
11749
+ },
11750
+ hashTagDesc: {
11751
+ fontSize: 12,
11752
+ textAlign: 'center',
11753
+ color: '#000'
11754
+ },
11755
+ title: {
11756
+ fontSize: 12,
11757
+ color: '#000'
11758
+ },
11759
+ price: {
11760
+ fontSize: 12,
11761
+ fontWeight: 'bold',
11762
+ color: '#000'
11763
+ }
11764
+ },
11765
+ buttonStyle: {
11766
+ backgroundColor: '#000',
11767
+ fontSize: 12,
11768
+ height: 52,
11769
+ fontWeight: 'bold',
11770
+ textAlign: 'center',
11771
+ color: '#fff',
11772
+ borderRadius: 25
10322
11773
  }
10323
11774
  }
10324
- else {
10325
- setIsLoad(true);
10326
- }
10327
- }, [rec, isActive, onReportViewImageEnd, openHashtag, index, onViewImageStartEvent, isLoad]);
10328
- if (!isActive) {
10329
- return React.createElement("img", { src: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, style: { width, height, objectFit: 'cover' } });
10330
- }
10331
- return (React.createElement(Swiper, { defaultValue: 0, direction: 'horizontal', modules: [Pagination, Autoplay], pagination: { clickable: true, bulletActiveClass: 'swipe-item-active-bullet' }, height: height, loop: true, autoplay: { delay: 3000 } }, imgUrls === null || imgUrls === void 0 ? void 0 : imgUrls.map((url) => {
10332
- return (React.createElement(SwiperSlide, { key: url },
10333
- React.createElement(Picture, { src: url, width: width, height: height })));
10334
- })));
10335
- };
10336
- var PictureGroup$1 = memo(PictureGroup);
11775
+ },
11776
+ w: 100,
11777
+ h: 40,
11778
+ sort: 2
11779
+ });
10337
11780
 
10338
11781
  /*
10339
11782
  * @Author: binruan@chatlabs.com
10340
- * @Date: 2024-01-15 19:03:09
11783
+ * @Date: 2023-07-25 14:56:49
10341
11784
  * @LastEditors: binruan@chatlabs.com
10342
- * @LastEditTime: 2024-03-25 10:42:07
10343
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Hashtag\index.tsx
11785
+ * @LastEditTime: 2024-03-20 13:46:06
11786
+ * @FilePath: \pb-sxp-ui\src\materials\index.ts
10344
11787
  *
10345
11788
  */
10346
- const Hashtag = ({ tags, itemId, itemType, index, rec }) => {
10347
- const [isShowMore, setIsShowMore] = useState(false);
10348
- const { setWaterFallData, setOpenHashtag, setCacheActiveIndex, waterFallData, setIsFromHashtag } = useSxpDataSource();
10349
- const handleClickTag = (data) => {
10350
- if (!waterFallData) {
10351
- setCacheActiveIndex === null || setCacheActiveIndex === void 0 ? void 0 : setCacheActiveIndex(index);
10352
- }
10353
- else {
10354
- setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(true);
10355
- }
10356
- if (itemType) {
10357
- setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
10358
- hashTag: data,
10359
- itemId,
10360
- itemType,
10361
- rec
11789
+
11790
+ var _materials_ = /*#__PURE__*/Object.freeze({
11791
+ __proto__: null,
11792
+ Appoint: Appoint,
11793
+ AppointForm: AppointForm,
11794
+ Commodity: Commodity,
11795
+ CommodityDetail: CommodityDetail,
11796
+ CommodityDetailDiroNew: CommodityDetailDiroNew,
11797
+ CommodityDiro: CommodityDiro,
11798
+ CommodityDiroNew: CommodityDiroNew,
11799
+ HashTag: HashTag,
11800
+ Link: Link,
11801
+ MultiCommodity: MultiCommodity,
11802
+ MultiCommodityDiro: MultiCommodityDiro,
11803
+ MultiCommodityDiroNew: MultiCommodityDiroNew,
11804
+ Prompt: Prompt
11805
+ });
11806
+
11807
+ const defaultUnLikeIconPath = '/pb_static/f71266d2c64446c5ae6a5a7f5489cc0a.png';
11808
+ const defaultLikeIconPath = '/pb_static/f07900fe3f0f4ae188ea1611d4801a44.png';
11809
+ const LikeButton = (_a) => {
11810
+ var { active, activeIcon, unActicveIcon, recData } = _a, props = __rest(_a, ["active", "activeIcon", "unActicveIcon", "recData"]);
11811
+ const { mutateLike, mutateUnlike, bffEventReport } = useSxpDataSource();
11812
+ const [state, setState] = useState(active);
11813
+ const likeIcon = useIconLink(defaultLikeIconPath);
11814
+ const unlikeIcon = useIconLink(defaultUnLikeIconPath);
11815
+ const handleClick = debounce(() => __awaiter(void 0, void 0, void 0, function* () {
11816
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
11817
+ if (state) {
11818
+ // 先设置状态
11819
+ setState(false);
11820
+ const result = (_d = (yield (mutateUnlike === null || mutateUnlike === void 0 ? void 0 : mutateUnlike({ videoItemId: (_c = (_b = recData.video) === null || _b === void 0 ? void 0 : _b.itemId) !== null && _c !== void 0 ? _c : '' })))) !== null && _d !== void 0 ? _d : false;
11821
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11822
+ eventInfo: {
11823
+ eventSubject: 'favoriteContentCanceled',
11824
+ eventDescription: 'This content was unfavorite by the user',
11825
+ contentId: (_f = (_e = recData.video) === null || _e === void 0 ? void 0 : _e.itemId) !== null && _f !== void 0 ? _f : '',
11826
+ contentName: (_h = (_g = recData.video) === null || _g === void 0 ? void 0 : _g.title) !== null && _h !== void 0 ? _h : '',
11827
+ contentTags: JSON.stringify((_k = (_j = recData.video) === null || _j === void 0 ? void 0 : _j.tags) !== null && _k !== void 0 ? _k : []),
11828
+ position: recData.position,
11829
+ contentFormat: ((_l = recData.video) === null || _l === void 0 ? void 0 : _l.url) ? 'video' : 'image',
11830
+ traceInfo: (_m = recData.video) === null || _m === void 0 ? void 0 : _m.traceInfo
11831
+ }
10362
11832
  });
11833
+ // 如果接口调用失败,则回滚状态
11834
+ if (!result) {
11835
+ setState(true);
11836
+ }
10363
11837
  }
10364
11838
  else {
10365
- setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
10366
- hashTag: data,
10367
- rec
11839
+ setState(true);
11840
+ const result = (_o = (yield (mutateLike === null || mutateLike === void 0 ? void 0 : mutateLike({ content: JSON.stringify(recData) })))) !== null && _o !== void 0 ? _o : false;
11841
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11842
+ eventInfo: {
11843
+ eventSubject: 'favoriteContent',
11844
+ eventDescription: 'This content was favorite by the user',
11845
+ contentId: (_q = (_p = recData.video) === null || _p === void 0 ? void 0 : _p.itemId) !== null && _q !== void 0 ? _q : '',
11846
+ contentName: (_s = (_r = recData.video) === null || _r === void 0 ? void 0 : _r.title) !== null && _s !== void 0 ? _s : '',
11847
+ contentTags: JSON.stringify((_u = (_t = recData.video) === null || _t === void 0 ? void 0 : _t.tags) !== null && _u !== void 0 ? _u : []),
11848
+ position: recData.position,
11849
+ contentFormat: ((_v = recData.video) === null || _v === void 0 ? void 0 : _v.url) ? 'video' : 'image',
11850
+ traceInfo: (_w = recData.video) === null || _w === void 0 ? void 0 : _w.traceInfo
11851
+ }
10368
11852
  });
11853
+ if (!result) {
11854
+ setState(false);
11855
+ }
10369
11856
  }
10370
- setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(true);
10371
- };
10372
- useMemo(() => {
10373
- if (tags.length <= 6) {
10374
- return null;
10375
- }
10376
- return (React.createElement("span", { style: { textDecoration: 'underline', cursor: 'pointer', color: '#fff' }, onClick: () => setIsShowMore(!isShowMore) }, isShowMore ? 'show less' : 'show more'));
10377
- }, [isShowMore, tags]);
10378
- return (React.createElement("div", { className: 'clc-sxp-bottom-hashtag' },
10379
- React.createElement(Scroll$1, null, tags === null || tags === void 0 ? void 0 : tags.map((item, index) => (React.createElement(SwiperSlide, { key: index, hidden: !isShowMore ? index >= 6 : false, className: 'clc-sxp-bottom-hashtag-item', onClick: () => handleClickTag(item) }, `#${item}`))))));
10380
- };
10381
- var Hashtag$1 = memo(Hashtag);
10382
-
10383
- /*
10384
- * @Author: binruan@chatlabs.com
10385
- * @Date: 2023-12-26 16:11:34
10386
- * @LastEditors: binruan@chatlabs.com
10387
- * @LastEditTime: 2024-03-04 17:35:19
10388
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Navbar.tsx
10389
- *
10390
- */
10391
- const Navbar = ({ icon, styles, onClose }) => {
10392
- const { waterFallData, setOpenHashtag } = useSxpDataSource();
10393
- return (React.createElement("div", { className: 'clc-sxp-nav', style: styles },
10394
- React.createElement("img", { className: 'clc-sxp-nav-left', src: icon, alt: '', onClick: onClose }),
10395
- React.createElement("div", { className: 'clc-sxp-nav-title' }, `#${waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag}`)));
11857
+ }), 200);
11858
+ return (React.createElement("button", Object.assign({}, props, { onClick: handleClick }),
11859
+ React.createElement("img", { style: { width: '100%', height: '100%', objectFit: 'contain' }, src: state ? activeIcon || likeIcon : unActicveIcon || unlikeIcon, alt: 'icon' })));
10396
11860
  };
10397
- var Navbar$1 = memo(Navbar);
11861
+ var LikeButton$1 = memo(LikeButton);
10398
11862
 
10399
- var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAbtJREFUeF7t2DFKxFAQxvHv6xTxCoKNiAuCna2X2NY7eAE9hYdwj2BjZ2ulYLW9pQcYDWyxBIK7ZN7MNyapk/D+v8zC20dM/OLE+zEDzBMwcYH5J1BpAMzsAMAJyU+vdZeZADN7AHAH4BjAC8kbD4QSAJv4+17wFcm3sQjyAGbWhXdff/takzwdG989Lw0wEN+te0ly9a8BIuJlJyAqXhIgMl4OIDpeCiAjXgYgK14CIDM+HSA7PhVgYHvrusnZZaOUshNUiU+ZAKX4cAC1+FAAxfgwANX4EADl+OYA6vFNASrENwOoEt8EoFK8O0C1eFcAMzsE8AXgqLcHdzvA3GVvv+89bv8FzOwcwEdvASuSy30XFXm/G0C3aDN7BXBdCcEb4ALAE4BFFQRXgM0UlEJwB6iG0ASgEkIzgCoITQEqIDQHUEcIAVBGCANQRQgFUEQIB1BDSAFQQkgDUEFIBVBASAfIRpAAyESQAchCkALIQJADiEaQBIhEkAWIQpAG+ANh8Xvk/j72CF0eYABhDeCS5PckALYQbgGcAXgm+Tg2vnu+xAR4hA69YwZoqVvh3fMEVPhKLdc4+Qn4AXwYBFBN2dYpAAAAAElFTkSuQmCC";
11863
+ const SXP_EVENT_BUS = new EventEmitter();
11864
+ var SXP_EVENT_TYPE;
11865
+ (function (SXP_EVENT_TYPE) {
11866
+ SXP_EVENT_TYPE["PAGE_DID_SHOW"] = "pageDidShow";
11867
+ SXP_EVENT_TYPE["PAGE_DID_HIDE"] = "pageDidHide";
11868
+ })(SXP_EVENT_TYPE || (SXP_EVENT_TYPE = {}));
10400
11869
 
10401
- function withBindDataSource(Component) {
10402
- // 处理函数事件中的数据源
10403
- return memo(function (props) {
10404
- const { $store } = useDataSource();
10405
- const handleDataSourceByEvent = (value) => {
10406
- let res = value;
10407
- const dataArr = value.match(/{{.*?}}/g);
10408
- if (dataArr === null || dataArr === void 0 ? void 0 : dataArr.length) {
10409
- dataArr.forEach((item) => {
10410
- item.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
10411
- if (p) {
10412
- const v = get($store, p);
10413
- res = res.replace(item, v);
10414
- return v;
10415
- }
10416
- });
10417
- });
10418
- }
10419
- return res;
10420
- };
10421
- const clonedProps = useMemo(() => {
10422
- var _a, _b, _c;
10423
- const { bindDatas } = props, cloneProps = __rest(props, ["bindDatas"]);
10424
- (_a = bindDatas === null || bindDatas === void 0 ? void 0 : bindDatas.forEach) === null || _a === void 0 ? void 0 : _a.call(bindDatas, (d) => {
10425
- if ((d === null || d === void 0 ? void 0 : d.propKey) && (d === null || d === void 0 ? void 0 : d.dataPath)) {
10426
- const { propKey, dataPath } = d;
10427
- dataPath.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
10428
- var _a, _b;
10429
- if (p) {
10430
- const v = (_b = (_a = get($store, p)) !== null && _a !== void 0 ? _a : props[propKey]) !== null && _b !== void 0 ? _b : '';
10431
- cloneProps[propKey] = v;
10432
- return v;
10433
- }
10434
- });
11870
+ const VideoWidget = ({ rec, index, height, data, muted, activeIndex }) => {
11871
+ const [isPauseVideo, setIsPauseVideo] = useState(false);
11872
+ const videoRef = useRef(null);
11873
+ const { bffEventReport, sxpParameter, waterFallData, openHashtag } = useSxpDataSource();
11874
+ const videoStartTime = useRef(0);
11875
+ const [isLoad, setIsLoad] = useState(false);
11876
+ const { isActive } = useSwiperSlide();
11877
+ useEffect(() => {
11878
+ if (!videoRef.current)
11879
+ return;
11880
+ videoRef.current.muted = muted;
11881
+ }, [muted]);
11882
+ const handleVideoStart = useCallback(() => {
11883
+ var _a, _b;
11884
+ if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
11885
+ return;
11886
+ (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
11887
+ }, []);
11888
+ const PAUSE_ICON = useIconLink('/pb_static/06f28a2025c74c1cb49be6767316d827.png');
11889
+ const handlePlaying = useCallback(() => {
11890
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
11891
+ setIsPauseVideo(false);
11892
+ const item = data[index];
11893
+ if (item && isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
11894
+ videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
11895
+ const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
11896
+ const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
11897
+ const playType = '1';
11898
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11899
+ eventInfo: {
11900
+ eventSubject: 'playVideo',
11901
+ eventDescription: 'User played the video',
11902
+ contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
11903
+ contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
11904
+ playType,
11905
+ startTime: videoCurrentTime,
11906
+ videoDuration,
11907
+ contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
11908
+ position: item.position,
11909
+ contentFormat: 'video',
11910
+ traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10435
11911
  }
10436
11912
  });
10437
- if (cloneProps) {
10438
- cloneProps.eventMap = {};
10439
- const eventObj = cloneDeep(cloneProps.event) || {};
10440
- for (const key in eventObj) {
10441
- if (Object.prototype.hasOwnProperty.call(eventObj, key)) {
10442
- try {
10443
- eventObj[key].value = handleDataSourceByEvent(eventObj[key].value);
10444
- cloneProps.eventMap[key] = new Function(eventObj[key].value);
10445
- }
10446
- catch (error) { }
10447
- }
10448
- }
10449
- }
10450
- if ((_c = (_b = cloneProps === null || cloneProps === void 0 ? void 0 : cloneProps.event) === null || _b === void 0 ? void 0 : _b.onClick) === null || _c === void 0 ? void 0 : _c.linkType) {
10451
- cloneProps.style.cursor = 'pointer';
10452
- }
10453
- return cloneProps;
10454
- }, [$store, props]);
10455
- return React.createElement(Component, Object.assign({}, clonedProps, clonedProps.eventMap));
10456
- });
10457
- }
10458
-
10459
- /*
10460
- * @Author: binruan@chatlabs.com
10461
- * @Date: 2023-12-26 16:11:34
10462
- * @LastEditors: binruan@chatlabs.com
10463
- * @LastEditTime: 2024-03-04 14:25:27
10464
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\RenderCard.tsx
10465
- *
10466
- */
10467
- const RenderCard = ({ rec, index, tempMap, resolver }) => {
10468
- const { schema } = useEditor();
10469
- const renderComp = useMemo(() => {
10470
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;
10471
- if (!(rec === null || rec === void 0 ? void 0 : rec.video))
10472
- return null;
10473
- let cta = null;
10474
- if ((_b = (_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.bindProducts) === null || _b === void 0 ? void 0 : _b.length) {
10475
- cta = '多商品CTA';
10476
- }
10477
- else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.bindProduct) {
10478
- cta = '商品CTA';
10479
- }
10480
- else {
10481
- cta = (_e = (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.bindCta) === null || _e === void 0 ? void 0 : _e.itemId;
10482
- }
10483
- const value = tempMap === null || tempMap === void 0 ? void 0 : tempMap[cta];
10484
- if ((((_f = value === null || value === void 0 ? void 0 : value.item) === null || _f === void 0 ? void 0 : _f.type) === 'CommodityDiro' && !((_g = rec === null || rec === void 0 ? void 0 : rec.video) === null || _g === void 0 ? void 0 : _g.bindProduct)) ||
10485
- (((_h = value === null || value === void 0 ? void 0 : value.item) === null || _h === void 0 ? void 0 : _h.type) === 'Commodity' && !((_j = rec === null || rec === void 0 ? void 0 : rec.video) === null || _j === void 0 ? void 0 : _j.bindProduct)) ||
10486
- (((_k = value === null || value === void 0 ? void 0 : value.item) === null || _k === void 0 ? void 0 : _k.type) === 'CommodityDiroNew' && !((_l = rec === null || rec === void 0 ? void 0 : rec.video) === null || _l === void 0 ? void 0 : _l.bindProduct)) ||
10487
- (((_m = value === null || value === void 0 ? void 0 : value.item) === null || _m === void 0 ? void 0 : _m.type) === 'MultiCommodity' && !((_p = (_o = rec === null || rec === void 0 ? void 0 : rec.video) === null || _o === void 0 ? void 0 : _o.bindProducts) === null || _p === void 0 ? void 0 : _p.length)) ||
10488
- (((_q = value === null || value === void 0 ? void 0 : value.item) === null || _q === void 0 ? void 0 : _q.type) === 'MultiCommodityDiro' && !((_s = (_r = rec === null || rec === void 0 ? void 0 : rec.video) === null || _r === void 0 ? void 0 : _r.bindProducts) === null || _s === void 0 ? void 0 : _s.length)) ||
10489
- (((_t = value === null || value === void 0 ? void 0 : value.item) === null || _t === void 0 ? void 0 : _t.type) === 'MultiCommodityDiroNew' && !((_v = (_u = rec === null || rec === void 0 ? void 0 : rec.video) === null || _u === void 0 ? void 0 : _u.bindProducts) === null || _v === void 0 ? void 0 : _v.length))) {
10490
- return null;
10491
11913
  }
10492
- if (value && resolver) {
10493
- const Component = withBindDataSource(resolver[(_w = value === null || value === void 0 ? void 0 : value.item) === null || _w === void 0 ? void 0 : _w.type]);
10494
- return (React.createElement(Component, Object.assign({ style: Object.assign(Object.assign({}, (_x = value === null || value === void 0 ? void 0 : value.item) === null || _x === void 0 ? void 0 : _x.style), { zIndex: 50, marginLeft: '20px' }), textStyle: (_y = value === null || value === void 0 ? void 0 : value.item) === null || _y === void 0 ? void 0 : _y.textStyle, bindDatas: (_0 = (_z = value === null || value === void 0 ? void 0 : value.item) === null || _z === void 0 ? void 0 : _z.bindDatas) !== null && _0 !== void 0 ? _0 : [] }, (_1 = value === null || value === void 0 ? void 0 : value.item) === null || _1 === void 0 ? void 0 : _1.props, { event: ((_2 = value === null || value === void 0 ? void 0 : value.item) === null || _2 === void 0 ? void 0 : _2.event) || {}, schema: schema, id: value === null || value === void 0 ? void 0 : value.id, key: value === null || value === void 0 ? void 0 : value.id, recData: rec })));
10495
- }
10496
- else {
10497
- return null;
10498
- }
10499
- }, [rec, resolver, tempMap, schema]);
10500
- return React.createElement(React.Fragment, null, renderComp);
10501
- };
10502
- var RenderCard$1 = memo(RenderCard);
10503
-
10504
- const WaterfallFlowItem = (props) => {
10505
- const { rec, index, list, reportTagsView } = props;
10506
- const { swiperRef, setRtcList, setOpenHashtag, bffEventReport, sxpParameter } = useSxpDataSource();
10507
- const [showVideo, setShowVideo] = useState(false);
10508
- const imgDom = useRef(null);
10509
- const videoDom = useRef(null);
10510
- const canvasRef = useRef(null);
10511
- const [firstFrameSrc, setFirstFrameSrc] = useState('');
10512
- const src = useMemo(() => {
10513
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
10514
- if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.cover) {
10515
- return (_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.cover;
11914
+ if (!isLoad) {
11915
+ setIsLoad(true);
10516
11916
  }
10517
- else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.url) {
10518
- setShowVideo(true);
10519
- return (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.url;
11917
+ }, [bffEventReport, data, index, isLoad]);
11918
+ const handleLoadedMetadata = useCallback(() => {
11919
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
11920
+ const item = data[index];
11921
+ if (item && !isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
11922
+ videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
11923
+ const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
11924
+ const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
11925
+ const playType = '0';
11926
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11927
+ eventInfo: {
11928
+ eventSubject: 'playVideo',
11929
+ eventDescription: 'User played the video',
11930
+ contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
11931
+ contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
11932
+ playType,
11933
+ startTime: videoCurrentTime,
11934
+ videoDuration,
11935
+ contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
11936
+ position: item.position,
11937
+ contentFormat: 'video',
11938
+ traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
11939
+ }
11940
+ });
10520
11941
  }
10521
- else if ((_f = (_e = rec === null || rec === void 0 ? void 0 : rec.video) === null || _e === void 0 ? void 0 : _e.imgUrls) === null || _f === void 0 ? void 0 : _f.length) {
10522
- return (_h = (_g = rec === null || rec === void 0 ? void 0 : rec.video) === null || _g === void 0 ? void 0 : _g.imgUrls) === null || _h === void 0 ? void 0 : _h[0];
11942
+ setTimeout(() => {
11943
+ var _a, _b;
11944
+ if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
11945
+ return;
11946
+ (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
11947
+ }, 0);
11948
+ }, [index, bffEventReport, data, isLoad]);
11949
+ const handleClickVideo = useCallback((type) => () => {
11950
+ var _a, _b, _c, _d, _e, _f;
11951
+ if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
11952
+ return;
11953
+ if (!isLoad)
11954
+ return;
11955
+ const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
11956
+ switch (type) {
11957
+ case 'start':
11958
+ if (!isPause)
11959
+ return;
11960
+ (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.play();
11961
+ setIsPauseVideo(false);
11962
+ break;
11963
+ case 'pause':
11964
+ if (isPause)
11965
+ return;
11966
+ (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.pause();
11967
+ setIsPauseVideo(true);
11968
+ break;
11969
+ default:
11970
+ if (isPause) {
11971
+ (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.play();
11972
+ }
11973
+ else {
11974
+ (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.pause();
11975
+ }
11976
+ setIsPauseVideo(!isPause);
11977
+ break;
10523
11978
  }
10524
- else if ((_k = (_j = rec === null || rec === void 0 ? void 0 : rec.product) === null || _j === void 0 ? void 0 : _j.homePage) === null || _k === void 0 ? void 0 : _k.length) {
10525
- return (_m = (_l = rec === null || rec === void 0 ? void 0 : rec.product) === null || _l === void 0 ? void 0 : _l.homePage) === null || _m === void 0 ? void 0 : _m[0];
11979
+ }, [data, index, isLoad]);
11980
+ const onPause = useCallback(() => {
11981
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
11982
+ const item = data[index];
11983
+ const videoDuration = ((_b = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.duration) !== null && _b !== void 0 ? _b : 0).toFixed(2);
11984
+ const videoCurrentTime = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.currentTime) !== null && _d !== void 0 ? _d : 0).toFixed(2);
11985
+ if ((_e = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _e === void 0 ? void 0 : _e.duration) {
11986
+ const playDuration = (((_f = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _f === void 0 ? void 0 : _f.currentTime) - videoStartTime.current).toFixed(2);
11987
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11988
+ eventInfo: {
11989
+ eventSubject: 'playOverVideo',
11990
+ eventDescription: 'User finished playing the video',
11991
+ contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
11992
+ contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
11993
+ endTime: videoCurrentTime,
11994
+ videoDuration,
11995
+ playDuration,
11996
+ contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
11997
+ position: item.position,
11998
+ contentFormat: 'video',
11999
+ traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
12000
+ }
12001
+ });
10526
12002
  }
10527
- else {
10528
- return (sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image) || '';
12003
+ }, [data, index, bffEventReport]);
12004
+ useEffect(() => {
12005
+ var _a, _b, _c, _d, _e, _f;
12006
+ if (data.length <= 0)
12007
+ return;
12008
+ if (!videoRef.current)
12009
+ return;
12010
+ const isPause = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.paused;
12011
+ setIsPauseVideo(false);
12012
+ if (!isActive) {
12013
+ if (!isPause && ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.readyState) >= 2)
12014
+ (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
12015
+ return;
10529
12016
  }
10530
- }, [rec, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image]);
10531
- const title = useMemo(() => {
10532
- var _a, _b;
10533
- return ((_a = rec === null || rec === void 0 ? void 0 : rec.product) === null || _a === void 0 ? void 0 : _a.title) || ((_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.title) || null;
10534
- }, [rec]);
10535
- const priceText = useMemo(() => {
10536
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
10537
- if (((_a = rec === null || rec === void 0 ? void 0 : rec.product) === null || _a === void 0 ? void 0 : _a.currency) && ((_b = rec === null || rec === void 0 ? void 0 : rec.product) === null || _b === void 0 ? void 0 : _b.price)) {
10538
- return `${(_f = (_e = (_d = (_c = rec === null || rec === void 0 ? void 0 : rec.product) === null || _c === void 0 ? void 0 : _c.currency) === null || _d === void 0 ? void 0 : _d.split('-')[1]) === null || _e === void 0 ? void 0 : _e.toUpperCase()) !== null && _f !== void 0 ? _f : ''}${(_j = (_h = (_g = rec === null || rec === void 0 ? void 0 : rec.product) === null || _g === void 0 ? void 0 : _g.price) === null || _h === void 0 ? void 0 : _h.toLocaleString('zh', {
10539
- minimumFractionDigits: 0
10540
- })) !== null && _j !== void 0 ? _j : ''}`;
12017
+ if (!videoRef.current.src) {
12018
+ const videoSrc = rec.video.url;
12019
+ // if (videoSrc.includes('.m3u8')) {
12020
+ // if (Hls.isSupported()) {
12021
+ // const hls = new Hls();
12022
+ // hls.loadSource(videoSrc);
12023
+ // hls.attachMedia(videoRef.current);
12024
+ // } else if (videoRef.current.canPlayType('application/vnd.apple.mpegurl')) {
12025
+ // videoRef.current.src = videoSrc;
12026
+ // } else {
12027
+ // videoRef.current.src = videoSrc;
12028
+ // }
12029
+ // } else {
12030
+ // videoRef.current.src = videoSrc;
12031
+ // }
12032
+ videoRef.current.src = videoSrc;
12033
+ videoRef.current.setAttribute('x5-playsinline', 'true');
12034
+ videoRef.current.setAttribute('webkit-playsinline', 'true');
10541
12035
  }
10542
12036
  else {
10543
- return null;
12037
+ if (((_d = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _d === void 0 ? void 0 : _d.readyState) < 2)
12038
+ return;
12039
+ videoRef.current.play();
10544
12040
  }
10545
- }, [rec]);
10546
- // useEffect(() => {
10547
- // if (imgDom.current === null || src === '') {
10548
- // return;
10549
- // }
10550
- // const img = new Image();
10551
- // if (showVideo && firstFrameSrc) {
10552
- // img.src = firstFrameSrc;
10553
- // } else {
10554
- // img.src = src;
10555
- // }
10556
- // // img.onload = () => {
10557
- // // setIsLoading(true);
10558
- // // };
10559
- // imgDom.current.src = img.src;
10560
- // }, [src, showVideo, firstFrameSrc]);
10561
- useEffect(() => {
10562
- const observer = new IntersectionObserver((entries) => {
10563
- entries.forEach((entry) => {
10564
- if (entry.isIntersecting) {
10565
- if (imgDom.current === null || src === '') {
10566
- return;
10567
- }
10568
- if (showVideo && firstFrameSrc) {
10569
- imgDom.current.src = firstFrameSrc;
10570
- }
10571
- else {
10572
- imgDom.current.src = src;
10573
- }
10574
- observer.unobserve(imgDom.current);
10575
- }
10576
- });
10577
- });
10578
- observer.observe(imgDom.current);
12041
+ (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener('canplay', handleLoadedMetadata);
12042
+ (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.addEventListener('playing', handlePlaying);
10579
12043
  return () => {
10580
- observer.disconnect();
12044
+ var _a, _b;
12045
+ (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('canplay', handleLoadedMetadata);
12046
+ (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener('playing', handlePlaying);
10581
12047
  };
10582
- }, [src, showVideo, firstFrameSrc]);
10583
- const calculateHeightForWidth = (videoWidth, videoHeight, targetWidth) => {
10584
- const aspectRatio = videoWidth / videoHeight;
10585
- const targetHeight = targetWidth / aspectRatio;
10586
- return targetHeight;
10587
- };
12048
+ }, [data, handleLoadedMetadata, handlePlaying, isActive, isLoad, rec.video]);
12049
+ /*
12050
+ 打开/关闭hashtag暂停/播放视频
12051
+ */
10588
12052
  useEffect(() => {
10589
- const video = videoDom === null || videoDom === void 0 ? void 0 : videoDom.current;
10590
- if (video === null || src === '' || !showVideo) {
12053
+ var _a, _b, _c, _d;
12054
+ if (!(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.readyState) < 2)
12055
+ return;
12056
+ const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
12057
+ if (!isActive)
10591
12058
  return;
12059
+ if (!isPause && openHashtag) {
12060
+ (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
10592
12061
  }
10593
- video.src = src;
10594
- video.currentTime = 1;
10595
- video.crossOrigin = 'anonymous';
10596
- video.onloadeddata = () => {
10597
- const canvas = canvasRef === null || canvasRef === void 0 ? void 0 : canvasRef.current;
10598
- if (!canvas)
10599
- return;
10600
- const ctx = canvas.getContext('2d');
10601
- const targetWidth = (window === null || window === void 0 ? void 0 : window.innerWidth) / 2;
10602
- const targetHeight = calculateHeightForWidth(video.videoWidth, video.videoHeight, targetWidth);
10603
- canvas.height = targetHeight;
10604
- canvas.width = targetWidth;
10605
- ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
10606
- setFirstFrameSrc(canvas.toDataURL());
10607
- video.remove();
10608
- canvas.remove();
12062
+ else if (!openHashtag) {
12063
+ (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.play();
12064
+ }
12065
+ }, [openHashtag, isActive]);
12066
+ useEffect(() => {
12067
+ if (!isActive)
12068
+ return;
12069
+ const onShow = handleClickVideo('start');
12070
+ const onHide = handleClickVideo('pause');
12071
+ SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
12072
+ SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
12073
+ return () => {
12074
+ SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
12075
+ SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
10609
12076
  };
10610
- }, [src, showVideo]);
10611
- const handleClickToDetail = () => {
10612
- reportTagsView();
10613
- setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(list);
10614
- setTimeout(() => {
10615
- var _a;
10616
- (_a = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _a === void 0 ? void 0 : _a.swiper.slideTo(index, 0, false);
10617
- setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
10618
- }, 0);
12077
+ }, [handleClickVideo, isActive]);
12078
+ const renderPoster = useMemo(() => {
12079
+ if (!(sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image)) {
12080
+ return null;
12081
+ }
12082
+ return (React.createElement("img", { hidden: isLoad, style: { position: 'absolute', left: 0, top: 0, width: '100%', height: '100%', objectFit: 'cover' }, src: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image }));
12083
+ }, [isLoad, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image]);
12084
+ useEffect(() => {
12085
+ const handleBeforeUnload = () => {
12086
+ var _a, _b;
12087
+ if (activeIndex === index && ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.url) && ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.src) && !isPauseVideo) {
12088
+ handleClickVideo('pause')();
12089
+ }
12090
+ };
12091
+ window.addEventListener('beforeunload', handleBeforeUnload);
12092
+ return () => {
12093
+ window.removeEventListener('beforeunload', handleBeforeUnload);
12094
+ };
12095
+ }, [activeIndex, index, rec, videoRef, handleClickVideo, isPauseVideo]);
12096
+ if (!rec.video) {
12097
+ return null;
12098
+ }
12099
+ return (React.createElement("div", { className: 'video-container', key: rec.video.itemId, onClick: handleClickVideo(), style: {
12100
+ position: 'relative',
12101
+ width: '100%',
12102
+ height
12103
+ } },
12104
+ React.createElement("video", { id: `pb-video-${index}`, className: 'clc-pb-video', ref: videoRef, poster: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, muted: true, controls: false, playsInline: true, preload: 'auto', onPause: onPause, onEnded: handleVideoStart }),
12105
+ renderPoster,
12106
+ React.createElement("img", { hidden: !isPauseVideo, className: 'clc-pb-video-pause', src: PAUSE_ICON })));
12107
+ };
12108
+ var VideoWidget$1 = memo(VideoWidget);
12109
+
12110
+ /*
12111
+ * @Author: binruan@chatlabs.com
12112
+ * @Date: 2023-12-27 19:02:59
12113
+ * @LastEditors: binruan@chatlabs.com
12114
+ * @LastEditTime: 2024-01-24 10:30:13
12115
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\ToggleButton\index.tsx
12116
+ *
12117
+ */
12118
+ const ToggleButton = ({ defaultValue, activeIcon, unactiveIcon, onChange, style }) => {
12119
+ const [isTrue, setIsTure] = useState(defaultValue);
12120
+ const handleClick = (e) => {
12121
+ e.stopPropagation();
12122
+ const result = !isTrue;
12123
+ setIsTure(result);
12124
+ onChange === null || onChange === void 0 ? void 0 : onChange(result);
10619
12125
  };
10620
- return (React.createElement("div", { className: 'list-content-listItem', key: index, onClick: handleClickToDetail },
10621
- React.createElement("div", { className: 'list-content-listItem-picture' },
10622
- showVideo && (React.createElement("div", { style: { display: 'none' } },
10623
- React.createElement("video", { ref: videoDom, crossOrigin: 'anonymous', className: 'list-content-listItem-picture-img' }),
10624
- React.createElement("canvas", { ref: canvasRef }))),
10625
- React.createElement("img", { className: 'list-content-listItem-picture-img', loading: 'lazy', ref: imgDom })),
10626
- React.createElement("div", { className: 'list-content-listItem-info' },
10627
- React.createElement("div", { className: `${'list-content-listItem-info-title'} ${priceText ? 'list-content-listItem-info-nowrap' : ''}` }, title && title),
10628
- React.createElement("div", { className: 'list-content-listItem-info-price', hidden: !priceText }, priceText))));
12126
+ return (React.createElement("button", { style: style, className: 'pb-toggle-button', onClick: handleClick },
12127
+ React.createElement("img", { className: 'pb-toggle-button-icon', src: isTrue ? activeIcon : unactiveIcon })));
10629
12128
  };
10630
- function WaterfallList({ reportTagsView }) {
10631
- var _a, _b, _c, _d, _e, _f;
10632
- const { waterFallData, getRecommendVideos, hashTagSize, loadingImage } = useSxpDataSource();
10633
- const [list, setList] = useState();
10634
- const [data, setData] = useState();
10635
- const [isLoadingData, setIsLoadingData] = useState(false);
10636
- const containerRef = useRef(null);
10637
- const [isLoadMore, setIsLoadMore] = useState(false);
10638
- useCallback(() => {
10639
- if (isLoadMore)
10640
- return;
10641
- setIsLoadMore(true);
10642
- waterFallData &&
10643
- (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
10644
- hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
10645
- 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
10646
- 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType
10647
- }).then((res) => {
10648
- var _a;
10649
- setList(list === null || list === void 0 ? void 0 : list.concat((_a = res === null || res === void 0 ? void 0 : res.recList) !== null && _a !== void 0 ? _a : []));
10650
- setIsLoadMore(false);
10651
- }));
10652
- }, [waterFallData, getRecommendVideos, list, isLoadMore]);
12129
+ var ToggleButton$1 = memo(ToggleButton);
12130
+
12131
+ /*
12132
+ * @Author: binruan@chatlabs.com
12133
+ * @Date: 2024-01-15 19:03:09
12134
+ * @LastEditors: binruan@chatlabs.com
12135
+ * @LastEditTime: 2024-03-13 10:53:56
12136
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\FingerSwipeTip\index.tsx
12137
+ *
12138
+ */
12139
+ const FingerSwipeTip = ({ imageUrl }) => {
12140
+ const [show, setShow] = useState(true);
12141
+ useEditor();
10653
12142
  useEffect(() => {
10654
- setIsLoadingData(true);
10655
- waterFallData &&
10656
- (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
10657
- hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
10658
- 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
10659
- 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType,
10660
- defaultSize: hashTagSize
10661
- }).then((res) => {
10662
- var _a, _b;
10663
- setData(res);
10664
- setList((_b = (_a = res === null || res === void 0 ? void 0 : res.recList) === null || _a === void 0 ? void 0 : _a.filter((item) => (item === null || item === void 0 ? void 0 : item.video) !== null || (item === null || item === void 0 ? void 0 : item.product) !== null)) !== null && _b !== void 0 ? _b : []);
10665
- setIsLoadingData(false);
10666
- }));
10667
- }, [waterFallData, getRecommendVideos, hashTagSize]);
10668
- // useEffect(() => {
10669
- // const container = containerRef?.current;
10670
- // if (!container) return;
10671
- // const handleScroll = () => {
10672
- // const top = (container as any)?.scrollTop;
10673
- // const clientHeight = (container as any)?.clientHeight;
10674
- // const scrollHeight = (container as any)?.scrollHeight;
10675
- // if (scrollHeight <= top + clientHeight && !isLoadingData) {
10676
- // loadMoreData();
10677
- // }
10678
- // };
10679
- // container?.addEventListener('scroll', handleScroll);
10680
- // return () => {
10681
- // container?.removeEventListener('scroll', handleScroll); // 在组件卸载时移除事件监听器
10682
- // };
10683
- // }, [isLoadingData, containerRef, loadMoreData]);
10684
- const handleClickLink = () => {
10685
- var _a, _b;
10686
- if ((_a = data === null || data === void 0 ? void 0 : data.tag) === null || _a === void 0 ? void 0 : _a.link) {
10687
- reportTagsView();
10688
- window.location.href = (_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.link;
10689
- }
10690
- };
10691
- return (React.createElement(React.Fragment, null, isLoadingData ? (React.createElement("div", { style: { height: '100%', width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' } },
10692
- React.createElement("img", { width: 64, height: 64, src: loadingImage, alt: 'loading...', style: { objectFit: 'contain' } }))) : (React.createElement("div", { className: 'list' },
10693
- React.createElement("div", { className: 'list-scroll', ref: containerRef, style: {
10694
- bottom: ((_a = data === null || data === void 0 ? void 0 : data.tag) === null || _a === void 0 ? void 0 : _a.link) ? '100px' : 0
10695
- } },
10696
- React.createElement("div", { className: 'list-info' }, (_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.info),
10697
- React.createElement("div", { hidden: !((_c = data === null || data === void 0 ? void 0 : data.tag) === null || _c === void 0 ? void 0 : _c.link), className: 'list-collection', onClick: handleClickLink }, ((_d = data === null || data === void 0 ? void 0 : data.tag) === null || _d === void 0 ? void 0 : _d.linkTitle) || 'Shop the collection'),
10698
- React.createElement("div", { className: 'list-content' }, list === null || list === void 0 ? void 0 : list.map((item, ind) => {
10699
- return (React.createElement(WaterfallFlowItem, { key: ind, index: ind, rec: item, list: list, reportTagsView: reportTagsView }));
10700
- })),
10701
- React.createElement("div", { hidden: !isLoadMore, style: { textAlign: 'center' } }, "loading...")),
10702
- React.createElement("div", { className: 'list-bottom', hidden: !((_e = data === null || data === void 0 ? void 0 : data.tag) === null || _e === void 0 ? void 0 : _e.link) },
10703
- React.createElement("button", { className: 'list-bottom-btn', onClick: handleClickLink }, ((_f = data === null || data === void 0 ? void 0 : data.tag) === null || _f === void 0 ? void 0 : _f.linkTitle) || 'Shop the collection'))))));
10704
- }
12143
+ setTimeout(() => {
12144
+ setShow(false);
12145
+ }, 2000);
12146
+ }, []);
12147
+ const FINGER_SWIPE_ICON = useIconLink('/pb_static/finger-swipe-tip.29dc3a48a3c746c906ea..png');
12148
+ const animationCls = useMemo(() => {
12149
+ return show ? 'pb-fadeIn' : 'pb-fadeOut';
12150
+ }, [show]);
12151
+ return (React.createElement("div", { hidden: !show, className: `pb-finger-wrap ${animationCls}` },
12152
+ React.createElement("img", { src: imageUrl || FINGER_SWIPE_ICON })));
12153
+ };
12154
+
12155
+ const Picture = (props) => {
12156
+ const { src, height, width } = props;
12157
+ const imgDom = useRef(null);
12158
+ const { sxpParameter } = useSxpDataSource();
12159
+ return (React.createElement("div", { style: {
12160
+ overflow: 'hidden',
12161
+ height,
12162
+ width: '100%',
12163
+ position: 'relative'
12164
+ } },
12165
+ React.createElement("img", { ref: imgDom, loading: 'lazy', src: src !== null && src !== void 0 ? src : sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, style: {
12166
+ height: '100%',
12167
+ width: '100%',
12168
+ objectFit: 'cover'
12169
+ } })));
12170
+ };
10705
12171
 
10706
- var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAaZJREFUeF7t2jFKBEEQRuG3mSJeQTARURDMTL2EqXfwAnoKD6FHMDEzNVIw2tzQC2gFggyDrExX1V92T7wz9PumFnqbXdH5teq8nwEwJqBzgfEVKDYAW8Ae8NZq3ZUm4Aa4AnaBR+C8BUIVAIu/ngSfAs9LESoAWLgB/LzWwP7SeLtfHWAu3tZ9Adz/dwD3eOUJCIlXBQiLVwQIjVcDCI9XAkiJVwFIi1cASI3PBpjb3jbd5GyyUcraCUrEZ02ATHwGgFR8NIBcfCSAZHwUgGx8BIB0vDeAfLwnQIl4L4Ay8R4ApeJbA2wD78DOZA/e7ABzk739Xz/T8rfAIfA6WYCd3BqA7NUSwCKfgLNKCK0BjoC7rzP74yoIrQGsuxSCB0ApBC+AMgieACUQvAHkESIApBGiAGQRIgEkEaIB5BAyAKQQsgBkEDIBJBCyAdIRFABSEVQA0hCUAFIQ1ADCERQBQhFUAcIQlAFCENQBfkOwg9eXpeftFQDmEOzv8ifARy8A3wiXwAHwANwujbf7q0xAi9bZZwwAN9oiDx4TUORFuS2z+wn4BAiAaEHnKChjAAAAAElFTkSuQmCC";
12172
+ /*
12173
+ * @Author: lewinlu@chatlabs.com
12174
+ * @Date: 2024-01-03 14:39:09
12175
+ * @LastEditors: binruan@chatlabs.com
12176
+ * @LastEditTime: 2024-03-25 15:08:11
12177
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\PictureGroup\index.tsx
12178
+ */
12179
+ const PictureGroup = ({ imgUrls, width, height, rec, index, onReportViewImageEnd, onViewImageStartEvent }) => {
12180
+ const { isActive } = useSwiperSlide();
12181
+ const { sxpParameter, openHashtag } = useSxpDataSource();
12182
+ const [isLoad, setIsLoad] = useState(false);
12183
+ useEffect(() => {
12184
+ if (isLoad && isActive) {
12185
+ if (openHashtag) {
12186
+ onReportViewImageEnd(rec);
12187
+ }
12188
+ else {
12189
+ onViewImageStartEvent(index);
12190
+ }
12191
+ }
12192
+ else {
12193
+ setIsLoad(true);
12194
+ }
12195
+ }, [rec, isActive, onReportViewImageEnd, openHashtag, index, onViewImageStartEvent, isLoad]);
12196
+ if (!isActive) {
12197
+ return React.createElement("img", { src: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, style: { width, height, objectFit: 'cover' } });
12198
+ }
12199
+ return (React.createElement(Swiper, { defaultValue: 0, direction: 'horizontal', modules: [Pagination, Autoplay], pagination: { clickable: true, bulletActiveClass: 'swipe-item-active-bullet' }, height: height, loop: true, autoplay: { delay: 3000 } }, imgUrls === null || imgUrls === void 0 ? void 0 : imgUrls.map((url) => {
12200
+ return (React.createElement(SwiperSlide, { key: url },
12201
+ React.createElement(Picture, { src: url, width: width, height: height })));
12202
+ })));
12203
+ };
12204
+ var PictureGroup$1 = memo(PictureGroup);
10707
12205
 
10708
12206
  /*
10709
12207
  * @Author: binruan@chatlabs.com
10710
- * @Date: 2024-01-10 10:58:24
12208
+ * @Date: 2024-01-15 19:03:09
10711
12209
  * @LastEditors: binruan@chatlabs.com
10712
- * @LastEditTime: 2024-03-12 14:53:22
10713
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\WaterFall\index.tsx
12210
+ * @LastEditTime: 2024-04-03 14:51:17
12211
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Hashtag\index.tsx
10714
12212
  *
10715
12213
  */
10716
- const WaterFall = () => {
10717
- const { waterFallData, setOpenHashtag, openHashtag, swiperRef, setWaterFallData, cacheRtcList, setRtcList, cacheActiveIndex, rtcList, setCacheRtcList, setIsFromHashtag, isFromHashtag, bffEventReport } = useSxpDataSource();
10718
- useRef(null);
10719
- const modalEleRef = useRef(null);
10720
- const [viewTime, setViewTime] = useState();
10721
- useEffect(() => {
10722
- const parentNode = document.getElementById('sxp-render');
10723
- const node = document.getElementById('water-fall');
10724
- if (node) {
10725
- modalEleRef.current = node;
12214
+ const Hashtag = ({ tags, itemId, itemType, index, rec, hashTagStyle }) => {
12215
+ const [isShowMore, setIsShowMore] = useState(false);
12216
+ const { setWaterFallData, setOpenHashtag, setCacheActiveIndex, waterFallData, setIsFromHashtag } = useSxpDataSource();
12217
+ const handleClickTag = (data) => {
12218
+ if (!waterFallData) {
12219
+ setCacheActiveIndex === null || setCacheActiveIndex === void 0 ? void 0 : setCacheActiveIndex(index);
10726
12220
  }
10727
12221
  else {
10728
- modalEleRef.current = document.createElement('div');
10729
- modalEleRef.current.setAttribute('id', 'water-fall');
10730
- parentNode === null || parentNode === void 0 ? void 0 : parentNode.appendChild(modalEleRef.current);
12222
+ setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(true);
10731
12223
  }
10732
- }, []);
10733
- const handleClose = () => {
10734
- const isEq = isEqual(rtcList, cacheRtcList);
10735
- if (!isEq && cacheRtcList && (cacheRtcList === null || cacheRtcList === void 0 ? void 0 : cacheRtcList.length)) {
10736
- setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(cacheRtcList);
12224
+ if (itemType) {
12225
+ setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
12226
+ hashTag: data,
12227
+ itemId,
12228
+ itemType,
12229
+ rec
12230
+ });
10737
12231
  }
10738
- reportTagsView();
10739
- setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData(undefined);
10740
- setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(false);
10741
- setTimeout(() => {
10742
- var _a, _b;
10743
- if (!isEq) {
10744
- (_b = (_a = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _a === void 0 ? void 0 : _a.swiper) === null || _b === void 0 ? void 0 : _b.slideTo(cacheActiveIndex, 0, false);
10745
- }
10746
- setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
10747
- }, 0);
12232
+ else {
12233
+ setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
12234
+ hashTag: data,
12235
+ rec
12236
+ });
12237
+ }
12238
+ setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(true);
10748
12239
  };
10749
- const [recData, setRecData] = useState();
10750
- useEffect(() => {
10751
- if (waterFallData) {
10752
- setRecData(waterFallData);
12240
+ useMemo(() => {
12241
+ if (tags.length <= 6) {
12242
+ return null;
10753
12243
  }
10754
- }, [waterFallData]);
10755
- const reportTagsView = useCallback(() => {
10756
- var _a, _b, _c, _d, _e, _f;
10757
- const rec = recData === null || recData === void 0 ? void 0 : recData.rec;
10758
- if (!rec)
10759
- return;
10760
- let fromKName = '';
10761
- if (isFromHashtag) {
10762
- fromKName = 'hashTagPage';
12244
+ return (React.createElement("span", { style: { textDecoration: 'underline', cursor: 'pointer', color: '#fff' }, onClick: () => setIsShowMore(!isShowMore) }, isShowMore ? 'show less' : 'show more'));
12245
+ }, [isShowMore, tags]);
12246
+ return (React.createElement("div", { className: 'clc-sxp-bottom-hashtag' },
12247
+ React.createElement(Scroll$1, null, tags === null || tags === void 0 ? void 0 : tags.map((item, index) => (React.createElement(SwiperSlide, { key: index, hidden: !isShowMore ? index >= 6 : false, className: 'clc-sxp-bottom-hashtag-item', style: hashTagStyle, onClick: () => handleClickTag(item) }, `#${item}`))))));
12248
+ };
12249
+ var Hashtag$1 = memo(Hashtag);
12250
+
12251
+ var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAbtJREFUeF7t2DFKxFAQxvHv6xTxCoKNiAuCna2X2NY7eAE9hYdwj2BjZ2ulYLW9pQcYDWyxBIK7ZN7MNyapk/D+v8zC20dM/OLE+zEDzBMwcYH5J1BpAMzsAMAJyU+vdZeZADN7AHAH4BjAC8kbD4QSAJv4+17wFcm3sQjyAGbWhXdff/takzwdG989Lw0wEN+te0ly9a8BIuJlJyAqXhIgMl4OIDpeCiAjXgYgK14CIDM+HSA7PhVgYHvrusnZZaOUshNUiU+ZAKX4cAC1+FAAxfgwANX4EADl+OYA6vFNASrENwOoEt8EoFK8O0C1eFcAMzsE8AXgqLcHdzvA3GVvv+89bv8FzOwcwEdvASuSy30XFXm/G0C3aDN7BXBdCcEb4ALAE4BFFQRXgM0UlEJwB6iG0ASgEkIzgCoITQEqIDQHUEcIAVBGCANQRQgFUEQIB1BDSAFQQkgDUEFIBVBASAfIRpAAyESQAchCkALIQJADiEaQBIhEkAWIQpAG+ANh8Xvk/j72CF0eYABhDeCS5PckALYQbgGcAXgm+Tg2vnu+xAR4hA69YwZoqVvh3fMEVPhKLdc4+Qn4AXwYBFBN2dYpAAAAAElFTkSuQmCC";
12252
+
12253
+ function withBindDataSource(Component) {
12254
+ // 处理函数事件中的数据源
12255
+ return memo(function (props) {
12256
+ const { $store } = useDataSource();
12257
+ const handleDataSourceByEvent = (value) => {
12258
+ let res = value;
12259
+ const dataArr = value.match(/{{.*?}}/g);
12260
+ if (dataArr === null || dataArr === void 0 ? void 0 : dataArr.length) {
12261
+ dataArr.forEach((item) => {
12262
+ item.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
12263
+ if (p) {
12264
+ const v = get($store, p);
12265
+ res = res.replace(item, v);
12266
+ return v;
12267
+ }
12268
+ });
12269
+ });
12270
+ }
12271
+ return res;
12272
+ };
12273
+ const clonedProps = useMemo(() => {
12274
+ var _a, _b, _c;
12275
+ const { bindDatas } = props, cloneProps = __rest(props, ["bindDatas"]);
12276
+ (_a = bindDatas === null || bindDatas === void 0 ? void 0 : bindDatas.forEach) === null || _a === void 0 ? void 0 : _a.call(bindDatas, (d) => {
12277
+ if ((d === null || d === void 0 ? void 0 : d.propKey) && (d === null || d === void 0 ? void 0 : d.dataPath)) {
12278
+ const { propKey, dataPath } = d;
12279
+ dataPath.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
12280
+ var _a, _b;
12281
+ if (p) {
12282
+ const v = (_b = (_a = get($store, p)) !== null && _a !== void 0 ? _a : props[propKey]) !== null && _b !== void 0 ? _b : '';
12283
+ cloneProps[propKey] = v;
12284
+ return v;
12285
+ }
12286
+ });
12287
+ }
12288
+ });
12289
+ if (cloneProps) {
12290
+ cloneProps.eventMap = {};
12291
+ const eventObj = cloneDeep(cloneProps.event) || {};
12292
+ for (const key in eventObj) {
12293
+ if (Object.prototype.hasOwnProperty.call(eventObj, key)) {
12294
+ try {
12295
+ eventObj[key].value = handleDataSourceByEvent(eventObj[key].value);
12296
+ cloneProps.eventMap[key] = new Function(eventObj[key].value);
12297
+ }
12298
+ catch (error) { }
12299
+ }
12300
+ }
12301
+ }
12302
+ if ((_c = (_b = cloneProps === null || cloneProps === void 0 ? void 0 : cloneProps.event) === null || _b === void 0 ? void 0 : _b.onClick) === null || _c === void 0 ? void 0 : _c.linkType) {
12303
+ cloneProps.style.cursor = 'pointer';
12304
+ }
12305
+ return cloneProps;
12306
+ }, [$store, props]);
12307
+ return React.createElement(Component, Object.assign({}, clonedProps, clonedProps.eventMap));
12308
+ });
12309
+ }
12310
+
12311
+ /*
12312
+ * @Author: binruan@chatlabs.com
12313
+ * @Date: 2023-12-26 16:11:34
12314
+ * @LastEditors: binruan@chatlabs.com
12315
+ * @LastEditTime: 2024-03-04 14:25:27
12316
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\RenderCard.tsx
12317
+ *
12318
+ */
12319
+ const RenderCard = ({ rec, index, tempMap, resolver }) => {
12320
+ const { schema } = useEditor();
12321
+ const renderComp = useMemo(() => {
12322
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;
12323
+ if (!(rec === null || rec === void 0 ? void 0 : rec.video))
12324
+ return null;
12325
+ let cta = null;
12326
+ if ((_b = (_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.bindProducts) === null || _b === void 0 ? void 0 : _b.length) {
12327
+ cta = '多商品CTA';
10763
12328
  }
10764
- else if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.url) {
10765
- fromKName = 'videoPage';
12329
+ else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.bindProduct) {
12330
+ cta = '商品CTA';
10766
12331
  }
10767
- else if ((_c = (_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.imgUrls) === null || _c === void 0 ? void 0 : _c.length) {
10768
- fromKName = 'imagePage';
12332
+ else {
12333
+ cta = (_e = (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.bindCta) === null || _e === void 0 ? void 0 : _e.itemId;
10769
12334
  }
10770
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10771
- eventInfo: {
10772
- relatedContentId: (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.itemId,
10773
- position: rec === null || rec === void 0 ? void 0 : rec.position,
10774
- contentTags: JSON.stringify((_e = rec === null || rec === void 0 ? void 0 : rec.video) === null || _e === void 0 ? void 0 : _e.tags),
10775
- traceInfo: JSON.stringify((_f = rec === null || rec === void 0 ? void 0 : rec.video) === null || _f === void 0 ? void 0 : _f.traceInfo),
10776
- hashTags: JSON.stringify([recData === null || recData === void 0 ? void 0 : recData.hashTag]),
10777
- fromKName,
10778
- fromKPage: location === null || location === void 0 ? void 0 : location.href,
10779
- timeOnSite: Math.floor((new Date() - viewTime) / 1000) + '',
10780
- eventSubject: 'clickTagsViewContents',
10781
- eventDescription: 'User click tags view contents'
10782
- }
10783
- });
10784
- }, [recData, bffEventReport, viewTime, isFromHashtag]);
10785
- useEffect(() => {
10786
- if (openHashtag) {
10787
- setViewTime(new Date());
12335
+ const value = tempMap === null || tempMap === void 0 ? void 0 : tempMap[cta];
12336
+ if ((((_f = value === null || value === void 0 ? void 0 : value.item) === null || _f === void 0 ? void 0 : _f.type) === 'CommodityDiro' && !((_g = rec === null || rec === void 0 ? void 0 : rec.video) === null || _g === void 0 ? void 0 : _g.bindProduct)) ||
12337
+ (((_h = value === null || value === void 0 ? void 0 : value.item) === null || _h === void 0 ? void 0 : _h.type) === 'Commodity' && !((_j = rec === null || rec === void 0 ? void 0 : rec.video) === null || _j === void 0 ? void 0 : _j.bindProduct)) ||
12338
+ (((_k = value === null || value === void 0 ? void 0 : value.item) === null || _k === void 0 ? void 0 : _k.type) === 'CommodityDiroNew' && !((_l = rec === null || rec === void 0 ? void 0 : rec.video) === null || _l === void 0 ? void 0 : _l.bindProduct)) ||
12339
+ (((_m = value === null || value === void 0 ? void 0 : value.item) === null || _m === void 0 ? void 0 : _m.type) === 'MultiCommodity' && !((_p = (_o = rec === null || rec === void 0 ? void 0 : rec.video) === null || _o === void 0 ? void 0 : _o.bindProducts) === null || _p === void 0 ? void 0 : _p.length)) ||
12340
+ (((_q = value === null || value === void 0 ? void 0 : value.item) === null || _q === void 0 ? void 0 : _q.type) === 'MultiCommodityDiro' && !((_s = (_r = rec === null || rec === void 0 ? void 0 : rec.video) === null || _r === void 0 ? void 0 : _r.bindProducts) === null || _s === void 0 ? void 0 : _s.length)) ||
12341
+ (((_t = value === null || value === void 0 ? void 0 : value.item) === null || _t === void 0 ? void 0 : _t.type) === 'MultiCommodityDiroNew' && !((_v = (_u = rec === null || rec === void 0 ? void 0 : rec.video) === null || _u === void 0 ? void 0 : _u.bindProducts) === null || _v === void 0 ? void 0 : _v.length))) {
12342
+ return null;
10788
12343
  }
10789
- }, [openHashtag]);
10790
- useEffect(() => {
10791
- const initTime = () => {
10792
- setViewTime(new Date());
10793
- };
10794
- window.addEventListener('pageshow', initTime);
10795
- return () => {
10796
- window.removeEventListener('pageshow', initTime);
10797
- };
10798
- }, []);
10799
- if (!modalEleRef.current)
10800
- return null;
10801
- return ReactDOM.createPortal(React.createElement("div", { className: 'waterfall', style: {
10802
- display: openHashtag ? 'block' : 'none'
10803
- } },
10804
- React.createElement(Navbar$1, { icon: img, styles: { top: '32px' }, onClose: handleClose }),
10805
- React.createElement(WaterfallList, { reportTagsView: reportTagsView })), modalEleRef.current);
12344
+ if (value && resolver) {
12345
+ const Component = withBindDataSource(resolver[(_w = value === null || value === void 0 ? void 0 : value.item) === null || _w === void 0 ? void 0 : _w.type]);
12346
+ return (React.createElement(Component, Object.assign({ style: Object.assign(Object.assign({}, (_x = value === null || value === void 0 ? void 0 : value.item) === null || _x === void 0 ? void 0 : _x.style), { zIndex: 50, marginLeft: '20px' }), textStyle: (_y = value === null || value === void 0 ? void 0 : value.item) === null || _y === void 0 ? void 0 : _y.textStyle, bindDatas: (_0 = (_z = value === null || value === void 0 ? void 0 : value.item) === null || _z === void 0 ? void 0 : _z.bindDatas) !== null && _0 !== void 0 ? _0 : [] }, (_1 = value === null || value === void 0 ? void 0 : value.item) === null || _1 === void 0 ? void 0 : _1.props, { event: ((_2 = value === null || value === void 0 ? void 0 : value.item) === null || _2 === void 0 ? void 0 : _2.event) || {}, schema: schema, id: value === null || value === void 0 ? void 0 : value.id, key: value === null || value === void 0 ? void 0 : value.id, recData: rec })));
12347
+ }
12348
+ else {
12349
+ return null;
12350
+ }
12351
+ }, [rec, resolver, tempMap, schema]);
12352
+ return React.createElement(React.Fragment, null, renderComp);
10806
12353
  };
10807
- var WaterFall$1 = memo(WaterFall);
12354
+ var RenderCard$1 = memo(RenderCard);
10808
12355
 
10809
12356
  const Nudge = ({ nudge }) => {
10810
12357
  return (React.createElement("div", { hidden: !(nudge === null || nudge === void 0 ? void 0 : nudge.isOpen), className: 'clc-sxp-bottom-nudge', style: {
@@ -10822,12 +12369,12 @@ const Nudge = ({ nudge }) => {
10822
12369
  * @Author: binruan@chatlabs.com
10823
12370
  * @Date: 2024-01-15 19:03:09
10824
12371
  * @LastEditors: binruan@chatlabs.com
10825
- * @LastEditTime: 2024-04-02 10:42:58
12372
+ * @LastEditTime: 2024-04-07 17:06:06
10826
12373
  * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\index.tsx
10827
12374
  *
10828
12375
  */
10829
- const SxpPageRender = ({ globalConfig, descStyle, containerHeight = window.innerHeight, containerWidth = window.innerWidth, tempMap, resolver, data = [], ctaType, tipText, nudge, _schema }) => {
10830
- var _a, _b, _c, _d;
12376
+ const SxpPageRender = ({ globalConfig, descStyle, containerHeight = window.innerHeight, containerWidth = window.innerWidth, tempMap, resolver, data = [], ctaType, tipText, nudge, _schema, hashTagStyle }) => {
12377
+ var _a, _b, _c, _d, _e, _f, _g;
10831
12378
  const { schema } = useEditor();
10832
12379
  const [activeIndex, setActiveIndex] = useState(0);
10833
12380
  const viewImageStartTime = useRef(0);
@@ -11007,10 +12554,10 @@ const SxpPageRender = ({ globalConfig, descStyle, containerHeight = window.inner
11007
12554
  React.createElement(RenderCard$1, { rec: rec, index: index, tempMap: tempMap, resolver: resolver })),
11008
12555
  React.createElement("div", { className: 'clc-sxp-bottom-text' },
11009
12556
  React.createElement(ExpandableText$1, { isPost: true, foldText: tipText === null || tipText === void 0 ? void 0 : tipText.foldText, unfoldText: tipText === null || tipText === void 0 ? void 0 : tipText.unfoldText, text: (_c = (_b = rec.video) === null || _b === void 0 ? void 0 : _b.title) !== null && _c !== void 0 ? _c : '', style: descStyle })),
11010
- React.createElement(Hashtag$1, { index: activeIndex, tags: (_e = (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.hashTags) !== null && _e !== void 0 ? _e : [], itemId: (_f = rec === null || rec === void 0 ? void 0 : rec.video) === null || _f === void 0 ? void 0 : _f.itemId, itemType: ((_g = rec.video) === null || _g === void 0 ? void 0 : _g.url) ? 'VIDEO' : null, rec: rec }))));
12557
+ React.createElement(Hashtag$1, { index: activeIndex, tags: (_e = (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.hashTags) !== null && _e !== void 0 ? _e : [], itemId: (_f = rec === null || rec === void 0 ? void 0 : rec.video) === null || _f === void 0 ? void 0 : _f.itemId, itemType: ((_g = rec.video) === null || _g === void 0 ? void 0 : _g.url) ? 'VIDEO' : null, rec: rec, hashTagStyle: hashTagStyle }))));
11011
12558
  }
11012
12559
  return null;
11013
- }, [descStyle, activeIndex, tempMap, resolver, tipText, nudge]);
12560
+ }, [descStyle, activeIndex, tempMap, resolver, tipText, nudge, hashTagStyle]);
11014
12561
  const renderLikeButton = useCallback((rec) => {
11015
12562
  var _a, _b;
11016
12563
  if (!(globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.isShowLike))
@@ -11149,7 +12696,7 @@ const SxpPageRender = ({ globalConfig, descStyle, containerHeight = window.inner
11149
12696
  const mutedIcon = useIconLink('/pb_static/5beaaa5ce7f3477b99db3838619cc471.png');
11150
12697
  const unmutedIcon = useIconLink('/pb_static/fea8668a8a894e4aa3a86bcc775e895e.png');
11151
12698
  return (React.createElement("div", { id: 'sxp-render', className: 'clc-sxp-container' },
11152
- waterFallData && (React.createElement(Navbar$1, { icon: img$1, styles: { background: 'rgba(0,0,0,.3)', color: '#fff' }, onClose: () => {
12699
+ waterFallData && (React.createElement(Navbar$1, { icon: img, styles: { background: 'rgba(0,0,0,.3)', color: '#fff' }, onClose: () => {
11153
12700
  setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(true);
11154
12701
  } })),
11155
12702
  renderLogo,
@@ -11193,7 +12740,7 @@ const SxpPageRender = ({ globalConfig, descStyle, containerHeight = window.inner
11193
12740
  zIndex: 999
11194
12741
  }, defaultValue: isMuted, activeIcon: (globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.unMuteIcon) ? globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.unMuteIcon : mutedIcon, unactiveIcon: (globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.muteIcon) ? globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.muteIcon : unmutedIcon, onChange: setIsMuted }),
11195
12742
  renderView),
11196
- React.createElement(WaterFall$1, null)));
12743
+ React.createElement(WaterFall$1, Object.assign({}, (_g = (_f = (_e = globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.hashTag) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.item) === null || _g === void 0 ? void 0 : _g.props))));
11197
12744
  };
11198
12745
 
11199
12746
  /*
@@ -11300,13 +12847,14 @@ var index = memo(SxpPageCore);
11300
12847
  * @Author: binruan@chatlabs.com
11301
12848
  * @Date: 2023-12-26 10:38:53
11302
12849
  * @LastEditors: binruan@chatlabs.com
11303
- * @LastEditTime: 2024-03-14 15:13:36
12850
+ * @LastEditTime: 2024-04-08 10:53:29
11304
12851
  * @FilePath: \pb-sxp-ui\src\core\context\EditorDataProvider.tsx
11305
12852
  *
11306
12853
  */
11307
12854
  const EditorDataContext = createContext({});
11308
12855
  const EditorDataProvider = ({ children, data }) => {
11309
12856
  var _a, _b, _c, _d, _e, _f;
12857
+ const [openHashtag, setOpenHashtag] = useState(false);
11310
12858
  return (React.createElement(EditorDataContext.Provider, { value: {
11311
12859
  sxpPrameter: {
11312
12860
  bottomImage: (_a = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _a === void 0 ? void 0 : _a.bottom_image,
@@ -11316,7 +12864,9 @@ const EditorDataProvider = ({ children, data }) => {
11316
12864
  hashTagSize: (_e = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _e === void 0 ? void 0 : _e.hash_tag_size,
11317
12865
  loadingImage: (_f = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _f === void 0 ? void 0 : _f.loading_image
11318
12866
  },
11319
- appDomain: data === null || data === void 0 ? void 0 : data.appDomain
12867
+ appDomain: data === null || data === void 0 ? void 0 : data.appDomain,
12868
+ openHashtag,
12869
+ setOpenHashtag
11320
12870
  } }, children));
11321
12871
  };
11322
12872
  function useEditorDataProvider() {