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/pb-ui.js CHANGED
@@ -421,7 +421,7 @@
421
421
  DataSourceType[DataSourceType["BFF"] = 5] = "BFF";
422
422
  })(DataSourceType || (DataSourceType = {}));
423
423
  const UTM_KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_id', 'utm_content', 'cl_source'];
424
- const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent = true, maxSize, defaultSize, isPreview = false, sxpParameter, appDomain, hashTagSize, loadingImage }) => {
424
+ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent = true, maxSize, defaultSize, isPreview = false, sxpParameter, appDomain, hashTagSize, loadingImage, isOpenHashTag = false }) => {
425
425
  const [rtcList, setRtcList] = React.useState([]);
426
426
  const [loading, setLoading] = React.useState(false);
427
427
  const [curReqInfo, setCurReqInfo] = React.useState({ rtc: '', requestId: '' });
@@ -430,10 +430,13 @@
430
430
  // 弹窗数据
431
431
  const [popupDetailData, setPopupDetailData] = React.useState();
432
432
  const [waterFallData, setWaterFallData] = React.useState();
433
- const [openHashtag, setOpenHashtag] = React.useState(false);
433
+ const [openHashtag, setOpenHashtag] = React.useState(isOpenHashTag);
434
434
  const [cacheRtcList, setCacheRtcList] = React.useState([]);
435
435
  const [cacheActiveIndex, setCacheActiveIndex] = React.useState(0);
436
436
  const [isFromHashtag, setIsFromHashtag] = React.useState(false);
437
+ React.useEffect(() => {
438
+ setOpenHashtag(isOpenHashTag);
439
+ }, [isOpenHashTag]);
437
440
  // BFF 数据源
438
441
  const bffDataSource = React.useMemo(() => {
439
442
  return dataSources === null || dataSources === void 0 ? void 0 : dataSources.find((d) => d.type === DataSourceType.BFF);
@@ -618,7 +621,8 @@
618
621
  setIsFromHashtag,
619
622
  appDomain,
620
623
  hashTagSize,
621
- loadingImage: loadingImage !== null && loadingImage !== void 0 ? loadingImage : defaultLoadingImage
624
+ loadingImage: loadingImage !== null && loadingImage !== void 0 ? loadingImage : defaultLoadingImage,
625
+ isOpenHashTag
622
626
  } }, render({ rtcList, mutateLike: bffMutateLike, mutateUnlike: bffMutateUnlike, submitForm: bffSubmitForm })));
623
627
  };
624
628
  var SxpDataSourceProvider$1 = React.memo(SxpDataSourceProvider);
@@ -882,7 +886,7 @@
882
886
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\AppointForm\settingRender.tsx
883
887
  *
884
888
  */
885
- var settingRender$4 = [
889
+ var settingRender$5 = [
886
890
  {
887
891
  type: 'Text',
888
892
  label: '组件名称',
@@ -1071,7 +1075,7 @@
1071
1075
  category: 'popup',
1072
1076
  type: 'AppointForm',
1073
1077
  related: {
1074
- settingRender: settingRender$4,
1078
+ settingRender: settingRender$5,
1075
1079
  bindableProps: [],
1076
1080
  interactionRender: interactionRender$8
1077
1081
  },
@@ -1113,7 +1117,7 @@
1113
1117
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\CommodityDetailDiroNew\settingRender.tsx
1114
1118
  *
1115
1119
  */
1116
- var settingRender$3 = [
1120
+ var settingRender$4 = [
1117
1121
  {
1118
1122
  title: '商品图片',
1119
1123
  child: [
@@ -8400,7 +8404,7 @@
8400
8404
  category: 'popup',
8401
8405
  type: 'CommodityDetail',
8402
8406
  related: {
8403
- settingRender: settingRender$3
8407
+ settingRender: settingRender$4
8404
8408
  },
8405
8409
  defaulSetting: {
8406
8410
  props: {
@@ -8462,7 +8466,7 @@
8462
8466
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\Prompt\settingRender.tsx
8463
8467
  *
8464
8468
  */
8465
- var settingRender$2 = [
8469
+ var settingRender$3 = [
8466
8470
  {
8467
8471
  type: 'Media',
8468
8472
  label: '图标',
@@ -8537,7 +8541,7 @@
8537
8541
  category: 'popup',
8538
8542
  type: 'Prompt',
8539
8543
  related: {
8540
- settingRender: settingRender$2,
8544
+ settingRender: settingRender$3,
8541
8545
  bindableProps: [],
8542
8546
  interactionRender: interactionRender$7
8543
8547
  },
@@ -8562,7 +8566,7 @@
8562
8566
  * @FilePath: \pb-sxp-ui\src\materials\sxp\popup\CommodityDetailDiroNew\settingRender.tsx
8563
8567
  *
8564
8568
  */
8565
- var settingRender$1 = [
8569
+ var settingRender$2 = [
8566
8570
  {
8567
8571
  title: '商品图片',
8568
8572
  child: [
@@ -8849,7 +8853,7 @@ Made in Italy` })));
8849
8853
  category: 'popup',
8850
8854
  type: 'CommodityDetailDiroNew',
8851
8855
  related: {
8852
- settingRender: settingRender$1
8856
+ settingRender: settingRender$2
8853
8857
  },
8854
8858
  defaulSetting: {
8855
8859
  props: {
@@ -8905,11 +8909,11 @@ Made in Italy` })));
8905
8909
  * @Author: binruan@chatlabs.com
8906
8910
  * @Date: 2024-03-26 16:50:25
8907
8911
  * @LastEditors: binruan@chatlabs.com
8908
- * @LastEditTime: 2024-03-29 17:03:07
8912
+ * @LastEditTime: 2024-04-03 15:51:15
8909
8913
  * @FilePath: \pb-sxp-ui\src\materials\sxp\template\components\settingRender.tsx
8910
8914
  *
8911
8915
  */
8912
- var settingRender = [
8916
+ var settingRender$1 = [
8913
8917
  {
8914
8918
  title: '主题样式',
8915
8919
  child: [
@@ -9069,6 +9073,23 @@ Made in Italy` })));
9069
9073
  }
9070
9074
  ]
9071
9075
  },
9076
+ {
9077
+ type: 'Group',
9078
+ label: '圆角',
9079
+ child: [
9080
+ {
9081
+ type: 'Slider',
9082
+ name: ['props', 'ctaTempStyles', 'ctaTitle', 'borderRadius'],
9083
+ max: 100
9084
+ },
9085
+ {
9086
+ type: 'Number',
9087
+ name: ['props', 'ctaTempStyles', 'ctaTitle', 'borderRadius'],
9088
+ addonAfter: 'px',
9089
+ max: 100
9090
+ }
9091
+ ]
9092
+ },
9072
9093
  {
9073
9094
  type: 'Color',
9074
9095
  label: '背景色',
@@ -9217,7 +9238,7 @@ Made in Italy` })));
9217
9238
  related: {
9218
9239
  interactionRender: interactionRender$6,
9219
9240
  bindableProps: [],
9220
- settingRender
9241
+ settingRender: settingRender$1
9221
9242
  },
9222
9243
  defaulSetting: {
9223
9244
  props: {
@@ -9295,7 +9316,7 @@ Made in Italy` })));
9295
9316
  type: 'Appoint',
9296
9317
  related: {
9297
9318
  interactionRender: interactionRender$5,
9298
- settingRender: settingRender === null || settingRender === void 0 ? void 0 : settingRender.filter((i) => i.type !== 'commodityTitle'),
9319
+ settingRender: settingRender$1 === null || settingRender$1 === void 0 ? void 0 : settingRender$1.filter((i) => i.type !== 'commodityTitle'),
9299
9320
  bindableProps: []
9300
9321
  },
9301
9322
  defaulSetting: {
@@ -9371,7 +9392,7 @@ Made in Italy` })));
9371
9392
  category: 'template',
9372
9393
  type: 'Link',
9373
9394
  related: {
9374
- settingRender: settingRender === null || settingRender === void 0 ? void 0 : settingRender.filter((i) => i.type !== 'commodityTitle'),
9395
+ settingRender: settingRender$1 === null || settingRender$1 === void 0 ? void 0 : settingRender$1.filter((i) => i.type !== 'commodityTitle'),
9375
9396
  bindableProps: []
9376
9397
  },
9377
9398
  defaulSetting: {
@@ -9456,7 +9477,7 @@ Made in Italy` })));
9456
9477
  type: 'CommodityDiro',
9457
9478
  related: {
9458
9479
  interactionRender: interactionRender$4,
9459
- settingRender,
9480
+ settingRender: settingRender$1,
9460
9481
  bindableProps: []
9461
9482
  },
9462
9483
  defaulSetting: {
@@ -9548,7 +9569,7 @@ Made in Italy` })));
9548
9569
  related: {
9549
9570
  interactionRender: interactionRender$3,
9550
9571
  bindableProps: [],
9551
- settingRender
9572
+ settingRender: settingRender$1
9552
9573
  },
9553
9574
  defaulSetting: {
9554
9575
  props: {
@@ -9680,7 +9701,7 @@ Made in Italy` })));
9680
9701
  related: {
9681
9702
  interactionRender: interactionRender$2,
9682
9703
  bindableProps: [],
9683
- settingRender
9704
+ settingRender: settingRender$1
9684
9705
  },
9685
9706
  defaulSetting: {
9686
9707
  props: {
@@ -9782,7 +9803,7 @@ Made in Italy` })));
9782
9803
  type: 'MultiCommodity',
9783
9804
  related: {
9784
9805
  interactionRender: interactionRender$1,
9785
- settingRender,
9806
+ settingRender: settingRender$1,
9786
9807
  bindableProps: []
9787
9808
  },
9788
9809
  defaulSetting: {
@@ -9886,7 +9907,7 @@ Made in Italy` })));
9886
9907
  related: {
9887
9908
  interactionRender,
9888
9909
  bindableProps: [],
9889
- settingRender
9910
+ settingRender: settingRender$1
9890
9911
  },
9891
9912
  defaulSetting: {
9892
9913
  props: {
@@ -9928,898 +9949,2424 @@ Made in Italy` })));
9928
9949
 
9929
9950
  /*
9930
9951
  * @Author: binruan@chatlabs.com
9931
- * @Date: 2023-07-25 14:56:49
9952
+ * @Date: 2024-04-07 14:07:12
9932
9953
  * @LastEditors: binruan@chatlabs.com
9933
- * @LastEditTime: 2024-03-20 13:46:06
9934
- * @FilePath: \pb-sxp-ui\src\materials\index.ts
9954
+ * @LastEditTime: 2024-04-07 14:54:11
9955
+ * @FilePath: \pb-sxp-ui\src\materials\sxp\HashTag\settingRender.tsx
9935
9956
  *
9936
9957
  */
9937
-
9938
- var _materials_ = /*#__PURE__*/Object.freeze({
9939
- __proto__: null,
9940
- Appoint: Appoint,
9941
- AppointForm: AppointForm,
9942
- Commodity: Commodity,
9943
- CommodityDetail: CommodityDetail,
9944
- CommodityDetailDiroNew: CommodityDetailDiroNew,
9945
- CommodityDiro: CommodityDiro,
9946
- CommodityDiroNew: CommodityDiroNew,
9947
- Link: Link,
9948
- MultiCommodity: MultiCommodity,
9949
- MultiCommodityDiro: MultiCommodityDiro,
9950
- MultiCommodityDiroNew: MultiCommodityDiroNew,
9951
- Prompt: Prompt
9952
- });
9953
-
9954
- const defaultUnLikeIconPath = '/pb_static/f71266d2c64446c5ae6a5a7f5489cc0a.png';
9955
- const defaultLikeIconPath = '/pb_static/f07900fe3f0f4ae188ea1611d4801a44.png';
9956
- const LikeButton = (_a) => {
9957
- var { active, activeIcon, unActicveIcon, recData } = _a, props = __rest(_a, ["active", "activeIcon", "unActicveIcon", "recData"]);
9958
- const { mutateLike, mutateUnlike, bffEventReport } = useSxpDataSource();
9959
- const [state, setState] = React.useState(active);
9960
- const likeIcon = useIconLink(defaultLikeIconPath);
9961
- const unlikeIcon = useIconLink(defaultUnLikeIconPath);
9962
- const handleClick = lodash.debounce(() => __awaiter(void 0, void 0, void 0, function* () {
9963
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
9964
- if (state) {
9965
- // 先设置状态
9966
- setState(false);
9967
- 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;
9968
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
9969
- eventInfo: {
9970
- eventSubject: 'favoriteContentCanceled',
9971
- eventDescription: 'This content was unfavorite by the user',
9972
- contentId: (_f = (_e = recData.video) === null || _e === void 0 ? void 0 : _e.itemId) !== null && _f !== void 0 ? _f : '',
9973
- contentName: (_h = (_g = recData.video) === null || _g === void 0 ? void 0 : _g.title) !== null && _h !== void 0 ? _h : '',
9974
- contentTags: JSON.stringify((_k = (_j = recData.video) === null || _j === void 0 ? void 0 : _j.tags) !== null && _k !== void 0 ? _k : []),
9975
- position: recData.position,
9976
- contentFormat: ((_l = recData.video) === null || _l === void 0 ? void 0 : _l.url) ? 'video' : 'image',
9977
- traceInfo: (_m = recData.video) === null || _m === void 0 ? void 0 : _m.traceInfo
9978
- }
9979
- });
9980
- // 如果接口调用失败,则回滚状态
9981
- if (!result) {
9982
- setState(true);
9958
+ var settingRender = [
9959
+ {
9960
+ title: '卡片样式',
9961
+ child: [
9962
+ {
9963
+ type: 'Number',
9964
+ label: '文本行数',
9965
+ name: ['props', 'lineClamp']
9966
+ },
9967
+ {
9968
+ type: 'Number',
9969
+ label: '上下边距',
9970
+ name: ['props', 'space'],
9971
+ addonAfter: 'px'
9983
9972
  }
9984
- }
9985
- else {
9986
- setState(true);
9987
- const result = (_o = (yield (mutateLike === null || mutateLike === void 0 ? void 0 : mutateLike({ content: JSON.stringify(recData) })))) !== null && _o !== void 0 ? _o : false;
9988
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
9989
- eventInfo: {
9990
- eventSubject: 'favoriteContent',
9991
- eventDescription: 'This content was favorite by the user',
9992
- contentId: (_q = (_p = recData.video) === null || _p === void 0 ? void 0 : _p.itemId) !== null && _q !== void 0 ? _q : '',
9993
- contentName: (_s = (_r = recData.video) === null || _r === void 0 ? void 0 : _r.title) !== null && _s !== void 0 ? _s : '',
9994
- contentTags: JSON.stringify((_u = (_t = recData.video) === null || _t === void 0 ? void 0 : _t.tags) !== null && _u !== void 0 ? _u : []),
9995
- position: recData.position,
9996
- contentFormat: ((_v = recData.video) === null || _v === void 0 ? void 0 : _v.url) ? 'video' : 'image',
9997
- traceInfo: (_w = recData.video) === null || _w === void 0 ? void 0 : _w.traceInfo
9998
- }
9999
- });
10000
- if (!result) {
10001
- setState(false);
9973
+ ]
9974
+ },
9975
+ {
9976
+ title: '文本设置',
9977
+ child: [
9978
+ {
9979
+ name: ['props', 'textStyles'],
9980
+ type: 'SelectLinkage',
9981
+ child: [
9982
+ {
9983
+ label: '字段',
9984
+ type: 'Select',
9985
+ options: [
9986
+ {
9987
+ label: 'hashtag标题',
9988
+ value: 'hashTagTitle'
9989
+ },
9990
+ {
9991
+ label: 'hashtag描述',
9992
+ value: 'hashTagDesc'
9993
+ },
9994
+ {
9995
+ label: '标题',
9996
+ value: 'title'
9997
+ },
9998
+ {
9999
+ label: '价格',
10000
+ value: 'price'
10001
+ }
10002
+ ],
10003
+ name: ['props', 'textStyles', 'field'],
10004
+ initialValue: 'title'
10005
+ },
10006
+ {
10007
+ type: 'Group',
10008
+ label: '标题字体',
10009
+ child: [
10010
+ {
10011
+ type: 'Color',
10012
+ name: ['color']
10013
+ },
10014
+ {
10015
+ type: 'Select',
10016
+ options: [{ label: '黑体', value: '黑体' }],
10017
+ name: ['fontFamily']
10018
+ },
10019
+ {
10020
+ type: 'Number',
10021
+ addonAfter: 'px',
10022
+ name: ['fontSize']
10023
+ }
10024
+ ]
10025
+ },
10026
+ {
10027
+ label: '标题样式',
10028
+ type: 'TextStyle'
10029
+ },
10030
+ {
10031
+ label: '标题对齐',
10032
+ type: 'TextAlign'
10033
+ }
10034
+ ]
10002
10035
  }
10003
- }
10004
- }), 200);
10005
- return (React.createElement("button", Object.assign({}, props, { onClick: handleClick }),
10006
- React.createElement("img", { style: { width: '100%', height: '100%', objectFit: 'contain' }, src: state ? activeIcon || likeIcon : unActicveIcon || unlikeIcon, alt: 'icon' })));
10036
+ ]
10037
+ },
10038
+ {
10039
+ title: '按钮样式',
10040
+ child: [
10041
+ {
10042
+ type: 'Color',
10043
+ label: '背景色',
10044
+ name: ['props', 'buttonStyle', 'backgroundColor'],
10045
+ initialValue: '#000'
10046
+ },
10047
+ {
10048
+ type: 'Group',
10049
+ label: '尺寸',
10050
+ child: [
10051
+ {
10052
+ type: 'Number',
10053
+ name: ['props', 'buttonStyle', 'height'],
10054
+ addonAfter: 'H'
10055
+ }
10056
+ ]
10057
+ },
10058
+ {
10059
+ type: 'Group',
10060
+ label: '圆角',
10061
+ child: [
10062
+ {
10063
+ type: 'Slider',
10064
+ name: ['props', 'buttonStyle', 'borderRadius'],
10065
+ max: 100
10066
+ },
10067
+ {
10068
+ type: 'Number',
10069
+ name: ['props', 'buttonStyle', 'borderRadius'],
10070
+ addonAfter: 'px',
10071
+ max: 100
10072
+ }
10073
+ ]
10074
+ },
10075
+ {
10076
+ type: 'TextMargin',
10077
+ name: ['props', 'buttonStyle']
10078
+ },
10079
+ {
10080
+ type: 'Group',
10081
+ label: '字体',
10082
+ child: [
10083
+ {
10084
+ type: 'Color',
10085
+ name: ['props', 'buttonStyle', 'color'],
10086
+ initialValue: '#fff'
10087
+ },
10088
+ {
10089
+ type: 'Select',
10090
+ name: ['props', 'buttonStyle', 'fontFamily'],
10091
+ options: [{ label: '黑体', value: '黑体' }]
10092
+ },
10093
+ {
10094
+ type: 'Number',
10095
+ name: ['props', 'buttonStyle', 'fontSize'],
10096
+ addonAfter: 'px'
10097
+ }
10098
+ ]
10099
+ },
10100
+ {
10101
+ type: 'TextStyle',
10102
+ name: ['props', 'buttonStyle']
10103
+ },
10104
+ {
10105
+ type: 'TextAlign',
10106
+ name: ['props', 'buttonStyle']
10107
+ }
10108
+ ]
10109
+ }
10110
+ ];
10111
+
10112
+ /*
10113
+ * @Author: binruan@chatlabs.com
10114
+ * @Date: 2023-12-26 16:11:34
10115
+ * @LastEditors: binruan@chatlabs.com
10116
+ * @LastEditTime: 2024-04-08 11:53:47
10117
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Navbar.tsx
10118
+ *
10119
+ */
10120
+ const Navbar = ({ icon, styles, textStyle, onClose }) => {
10121
+ var _a;
10122
+ const { waterFallData, setOpenHashtag } = useSxpDataSource();
10123
+ return (React.createElement("div", { className: 'clc-sxp-nav', style: styles },
10124
+ React.createElement("img", { className: 'clc-sxp-nav-left', src: icon, alt: '', onClick: onClose }),
10125
+ 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 : '标题'}`)));
10007
10126
  };
10008
- var LikeButton$1 = React.memo(LikeButton);
10127
+ var Navbar$1 = React.memo(Navbar);
10009
10128
 
10010
- const SXP_EVENT_BUS = new EventEmitter();
10011
- var SXP_EVENT_TYPE;
10012
- (function (SXP_EVENT_TYPE) {
10013
- SXP_EVENT_TYPE["PAGE_DID_SHOW"] = "pageDidShow";
10014
- SXP_EVENT_TYPE["PAGE_DID_HIDE"] = "pageDidHide";
10015
- })(SXP_EVENT_TYPE || (SXP_EVENT_TYPE = {}));
10129
+ var productUserId = null;
10130
+ var requestId = "3d989325-e7d6-4a74-8a97-98febdf5b567";
10131
+ var channel = null;
10132
+ var rtc = null;
10133
+ var tag = {
10134
+ 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.",
10135
+ link: "www.baidu.com",
10136
+ linkTitle: null,
10137
+ linkType: "WEB"
10138
+ };
10139
+ var recList = [
10140
+ {
10141
+ position: "0",
10142
+ isCollected: null,
10143
+ video: {
10144
+ itemId: "VIDEOY2BMu1710323630175",
10145
+ 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.",
10146
+ tags: [
10147
+ "Dior Toujours Bag",
10148
+ "Casual",
10149
+ "Leather Strap",
10150
+ "Handbags"
10151
+ ],
10152
+ weight: null,
10153
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOY2BMu1710323630175:default:3::branch:Handbags:0",
10154
+ bindCta: null,
10155
+ bindProduct: {
10156
+ itemId: "M2821SNIOM900",
10157
+ title: "Medium Dior Toujours Bag Black Macrocannage Crinkled Leather",
10158
+ tags: [
10159
+ "Medium",
10160
+ "Black",
10161
+ "Women",
10162
+ "Handbags",
10163
+ "Bucket Bag"
10164
+ ],
10165
+ weight: null,
10166
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2821SNIOM900:default:3::branch:Handbags:0",
10167
+ bindCta: {
10168
+ itemId: "CTAzgoPn1709005149328",
10169
+ title: "立即购买",
10170
+ tags: [
10171
+ ],
10172
+ weight: null,
10173
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:0",
10174
+ enTitle: "Shop now",
10175
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10176
+ link: null,
10177
+ linkTitle: null,
10178
+ linkType: null,
10179
+ menuCategoryId: "65966478d19caa37afe3603f"
10180
+ },
10181
+ homePage: [
10182
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsy6AN0OWw3rj8Luw3RTSP9n2kDLq1710497237677.jpg",
10183
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fszTc3uEUrtppdN9QVVU2XBnaaaBY1710497237986.jpg",
10184
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKbBMTRa0tTTX661wu7DzLw9OP0r1710497237980.jpg",
10185
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsOYHlYCwgzalxzmIJcsZmIsJ2L3g1710497237145.jpg",
10186
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKJqNVm1ZBlrgZ8XLC0YAaO6ws2F1710497237650.jpg",
10187
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsm2VoVancBQ20nDHceESUPNLyrUy1710497238312.jpg",
10188
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs2B5YYmv8OztP3d9rlM2a9KmYswl1710497237339.jpg"
10189
+ ],
10190
+ collection: "Eté 2024",
10191
+ 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",
10192
+ linkTitle: null,
10193
+ linkType: "WEB",
10194
+ 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.",
10195
+ price: 4400,
10196
+ currency: "USD-$"
10197
+ },
10198
+ bindProducts: [
10199
+ ],
10200
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fswbY3wT0hCmrYkrqDzFKnHb3NMux1710323481052.png",
10201
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fs3Ifqv7fk2Tn9nPtwOTO2YjxAuRO1710323470472.mp4",
10202
+ imgUrls: null,
10203
+ hashTags: [
10204
+ "Dior Toujours Bag",
10205
+ "Casual",
10206
+ "Leather Strap",
10207
+ "Handbags"
10208
+ ]
10209
+ },
10210
+ product: null,
10211
+ cta: null
10212
+ },
10213
+ {
10214
+ position: "1",
10215
+ isCollected: null,
10216
+ video: {
10217
+ itemId: "VIDEO6JCOb1710323364018",
10218
+ 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.",
10219
+ tags: [
10220
+ "Handbags",
10221
+ "Manufacturing Craftsmanship",
10222
+ "Dior Book Tote"
10223
+ ],
10224
+ weight: null,
10225
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEO6JCOb1710323364018:default:3::branch:Handbags:1",
10226
+ bindCta: null,
10227
+ bindProduct: {
10228
+ itemId: "M1296ZRIWM828",
10229
+ title: "Medium Dior Book Tote",
10230
+ tags: [
10231
+ "Maria Grazia Chiuri",
10232
+ "Hand",
10233
+ "Shoulder",
10234
+ "Handbags",
10235
+ "Blue",
10236
+ "Women"
10237
+ ],
10238
+ weight: null,
10239
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:1",
10240
+ bindCta: {
10241
+ itemId: "CTAzgoPn1709005149328",
10242
+ title: "立即购买",
10243
+ tags: [
10244
+ ],
10245
+ weight: null,
10246
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:1",
10247
+ enTitle: "Shop now",
10248
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10249
+ link: null,
10250
+ linkTitle: null,
10251
+ linkType: null,
10252
+ menuCategoryId: "65966478d19caa37afe3603f"
10253
+ },
10254
+ homePage: [
10255
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10256
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10257
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10258
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10259
+ ],
10260
+ collection: "Eté 2024",
10261
+ 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",
10262
+ linkTitle: null,
10263
+ linkType: "WEB",
10264
+ 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.",
10265
+ price: 3350,
10266
+ currency: "USD-$"
10267
+ },
10268
+ bindProducts: [
10269
+ ],
10270
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsAHlkdbqYj5F84o2faRzU1E3AvG11710323339209.png",
10271
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fs7KIGk2IB0MsoDL1ANWB1Mb2hqu41710323314146.mp4",
10272
+ imgUrls: null,
10273
+ hashTags: [
10274
+ "Handbags",
10275
+ "Dior Book Tote"
10276
+ ]
10277
+ },
10278
+ product: null,
10279
+ cta: null
10280
+ },
10281
+ {
10282
+ position: "2",
10283
+ isCollected: null,
10284
+ video: null,
10285
+ product: {
10286
+ itemId: "M2820OTKVM911",
10287
+ title: "Large Dior Toujours Bag Black Cannage Tweed",
10288
+ tags: [
10289
+ "Black",
10290
+ "Women",
10291
+ "Handbags",
10292
+ "Bucket Bag",
10293
+ "Dior Toujours Bag"
10294
+ ],
10295
+ weight: null,
10296
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2820OTKVM911:default:3::branch:Handbags:2",
10297
+ bindCta: {
10298
+ itemId: "CTAzgoPn1709005149328",
10299
+ title: "立即购买",
10300
+ tags: [
10301
+ ],
10302
+ weight: null,
10303
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:2",
10304
+ enTitle: "Shop now",
10305
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10306
+ link: null,
10307
+ linkTitle: null,
10308
+ linkType: null,
10309
+ menuCategoryId: "65966478d19caa37afe3603f"
10310
+ },
10311
+ homePage: [
10312
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fsJTjyFchOFEJSTRYxXvL2XPU1dP61710238469418.jpg",
10313
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fstdFA1dFT55QjtQPU2qHNENo5peF1710836061716.jpg",
10314
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fs9xf8AlIApbHezVL3BsxjUGIrN231710836061181.jpg",
10315
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fs9iZ20MjLAPkXmFKvD8HzhLaBJ671710238470272.jpg",
10316
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fsSSodev3wicDfE1DYNWPQVeRjErt1710238464035.jpg",
10317
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fs3YAOuN6Pd9NFvH1Rdooj6eLI18S1710238465296.jpg",
10318
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240312/fsBwIEp6OzI49isvHgiKD0cPSFtrD1710238459007.jpg"
10319
+ ],
10320
+ collection: "Eté 2024",
10321
+ link: "https://www.dior.com/en_us/fashion/products/M2820OTKV_M911-large-dior-toujours-bag",
10322
+ linkTitle: null,
10323
+ linkType: "WEB",
10324
+ 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.",
10325
+ price: 4200,
10326
+ currency: "USD-$"
10327
+ },
10328
+ cta: null
10329
+ },
10330
+ {
10331
+ position: "3",
10332
+ isCollected: null,
10333
+ video: {
10334
+ itemId: "VIDEOOL1qU1709616182569",
10335
+ 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",
10336
+ tags: [
10337
+ "Maria Grazia Chiuri",
10338
+ "Saddle Bags",
10339
+ "Removable Shoulder Strap",
10340
+ "Shoulder",
10341
+ "Crossbody",
10342
+ "Cross-body & Shoulder Bags",
10343
+ "Handbags"
10344
+ ],
10345
+ weight: null,
10346
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOOL1qU1709616182569:default:3::branch:Handbags:3",
10347
+ bindCta: null,
10348
+ bindProduct: {
10349
+ itemId: "M0455CBAAM900",
10350
+ title: "Saddle Bag with Strap",
10351
+ tags: [
10352
+ "Saddle Bags",
10353
+ "Handbags",
10354
+ "Maria Grazia Chiuri"
10355
+ ],
10356
+ weight: null,
10357
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0455CBAAM900:default:3::branch:Handbags:3",
10358
+ bindCta: {
10359
+ itemId: "CTAzgoPn1709005149328",
10360
+ title: "立即购买",
10361
+ tags: [
10362
+ ],
10363
+ weight: null,
10364
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:3",
10365
+ enTitle: "Shop now",
10366
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10367
+ link: null,
10368
+ linkTitle: null,
10369
+ linkType: null,
10370
+ menuCategoryId: "65966478d19caa37afe3603f"
10371
+ },
10372
+ homePage: [
10373
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsiwfgnCrVBGcGPh6gaFsvbYBIpxX1709285334896.png",
10374
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsXpilTgUS4u4oFWr0hUew8DQITi11709285353202.png",
10375
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsWxJm6YIeRYmDtDoB5WtYMjRX8bm1709285366208.png",
10376
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsj69PxKh1SAZ6p0902FbBT0vg2at1709285373714.png",
10377
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fs78nKueByU2cNulReOw8gJ1ZsieF1709285412981.png",
10378
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsmAEriTIohZAUMUE6gUCWvXwbbRE1709285429332.png"
10379
+ ],
10380
+ collection: "Eté 2024",
10381
+ 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",
10382
+ linkTitle: null,
10383
+ linkType: "WEB",
10384
+ 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.",
10385
+ price: 4400,
10386
+ currency: "USD-$"
10387
+ },
10388
+ bindProducts: [
10389
+ ],
10390
+ cover: null,
10391
+ url: null,
10392
+ imgUrls: [
10393
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsvbBN3IRfwctVIhdqgq3doWmhbb21710399187965.jpg"
10394
+ ],
10395
+ hashTags: [
10396
+ "Maria Grazia Chiuri",
10397
+ "Saddle Bags",
10398
+ "Handbags"
10399
+ ]
10400
+ },
10401
+ product: null,
10402
+ cta: null
10403
+ },
10404
+ {
10405
+ position: "4",
10406
+ isCollected: null,
10407
+ video: null,
10408
+ product: {
10409
+ itemId: "S5909CTZQM928",
10410
+ title: "Saddle Shoulder Pouch Blue Dior Oblique Jacquard ",
10411
+ tags: [
10412
+ "Saddle Bags",
10413
+ "Handbags",
10414
+ "Small-Leather-Goods",
10415
+ "Small",
10416
+ "Mini Bags"
10417
+ ],
10418
+ weight: null,
10419
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:S5909CTZQM928:default:3::branch:Handbags:4",
10420
+ bindCta: {
10421
+ itemId: "CTAzgoPn1709005149328",
10422
+ title: "立即购买",
10423
+ tags: [
10424
+ ],
10425
+ weight: null,
10426
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:4",
10427
+ enTitle: "Shop now",
10428
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10429
+ link: null,
10430
+ linkTitle: null,
10431
+ linkType: null,
10432
+ menuCategoryId: "65966478d19caa37afe3603f"
10433
+ },
10434
+ homePage: [
10435
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fs34CpwKJOyjEDgoHypoLYakF8oR31710316280669.png",
10436
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsLOSOEf9pmz7wKnFaifWNw3TZ7Gy1710316287874.png",
10437
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsWHmVcrzHKKj6EfhfnQkxYIOt20a1710316295683.png",
10438
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fslyBNMyQwjpjY4EKzyrqzTMlOGRQ1710316313161.png"
10439
+ ],
10440
+ collection: "Eté 2024",
10441
+ link: "https://www.dior.com/en_us/fashion/products/S5909CTZQ",
10442
+ linkTitle: null,
10443
+ linkType: "WEB",
10444
+ info: null,
10445
+ price: 4900,
10446
+ currency: "USD-$"
10447
+ },
10448
+ cta: null
10449
+ },
10450
+ {
10451
+ position: "5",
10452
+ isCollected: null,
10453
+ video: {
10454
+ itemId: "VIDEOrZguC1710324513737",
10455
+ 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.",
10456
+ tags: [
10457
+ "Handbags",
10458
+ "Dior Book Tote"
10459
+ ],
10460
+ weight: null,
10461
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOrZguC1710324513737:default:3::branch:Handbags:5",
10462
+ bindCta: null,
10463
+ bindProduct: {
10464
+ itemId: "M1296ZRIWM828",
10465
+ title: "Medium Dior Book Tote",
10466
+ tags: [
10467
+ "Maria Grazia Chiuri",
10468
+ "Hand",
10469
+ "Shoulder",
10470
+ "Handbags",
10471
+ "Blue",
10472
+ "Women"
10473
+ ],
10474
+ weight: null,
10475
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:5",
10476
+ bindCta: {
10477
+ itemId: "CTAzgoPn1709005149328",
10478
+ title: "立即购买",
10479
+ tags: [
10480
+ ],
10481
+ weight: null,
10482
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:5",
10483
+ enTitle: "Shop now",
10484
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10485
+ link: null,
10486
+ linkTitle: null,
10487
+ linkType: null,
10488
+ menuCategoryId: "65966478d19caa37afe3603f"
10489
+ },
10490
+ homePage: [
10491
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10492
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10493
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10494
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10495
+ ],
10496
+ collection: "Eté 2024",
10497
+ 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",
10498
+ linkTitle: null,
10499
+ linkType: "WEB",
10500
+ 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.",
10501
+ price: 3350,
10502
+ currency: "USD-$"
10503
+ },
10504
+ bindProducts: [
10505
+ ],
10506
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fstXNWStczbY8HbIKEqMwfCkv5CI51710324494939.png",
10507
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsOqu34FxaJTdascLcj6DHoYIIAs01710324439851.mp4",
10508
+ imgUrls: null,
10509
+ hashTags: [
10510
+ "Handbags",
10511
+ "Dior Book Tote"
10512
+ ]
10513
+ },
10514
+ product: null,
10515
+ cta: null
10516
+ },
10517
+ {
10518
+ position: "6",
10519
+ isCollected: null,
10520
+ video: null,
10521
+ product: {
10522
+ itemId: "M1296ZRIWM828",
10523
+ title: "Medium Dior Book Tote",
10524
+ tags: [
10525
+ "Maria Grazia Chiuri",
10526
+ "Hand",
10527
+ "Shoulder",
10528
+ "Handbags",
10529
+ "Blue",
10530
+ "Women"
10531
+ ],
10532
+ weight: null,
10533
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:6",
10534
+ bindCta: {
10535
+ itemId: "CTAzgoPn1709005149328",
10536
+ title: "立即购买",
10537
+ tags: [
10538
+ ],
10539
+ weight: null,
10540
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:6",
10541
+ enTitle: "Shop now",
10542
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10543
+ link: null,
10544
+ linkTitle: null,
10545
+ linkType: null,
10546
+ menuCategoryId: "65966478d19caa37afe3603f"
10547
+ },
10548
+ homePage: [
10549
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10550
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10551
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10552
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10553
+ ],
10554
+ collection: "Eté 2024",
10555
+ 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",
10556
+ linkTitle: null,
10557
+ linkType: "WEB",
10558
+ 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.",
10559
+ price: 3350,
10560
+ currency: "USD-$"
10561
+ },
10562
+ cta: null
10563
+ },
10564
+ {
10565
+ position: "7",
10566
+ isCollected: null,
10567
+ video: {
10568
+ itemId: "VIDEOEtr621710300614047",
10569
+ 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",
10570
+ tags: [
10571
+ "Handbags",
10572
+ "Leather Strap",
10573
+ "Spring-Summer 2024 Fashion Show",
10574
+ "Backstage",
10575
+ "Dior Toujours Bag"
10576
+ ],
10577
+ weight: null,
10578
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOEtr621710300614047:default:3::branch:Handbags:7",
10579
+ bindCta: null,
10580
+ bindProduct: null,
10581
+ bindProducts: [
10582
+ ],
10583
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fshkOldZwfsSqTgvxHJzNBwS66ySc1710300910103.jpg",
10584
+ url: null,
10585
+ imgUrls: [
10586
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsryDXTtPWXjYFWoSUEBUi48RHZCh1710398617300.jpg"
10587
+ ],
10588
+ hashTags: [
10589
+ "Backstage",
10590
+ "Handbags",
10591
+ "Spring-Summer 2024 Fashion Show",
10592
+ "Dior Toujours Bag"
10593
+ ]
10594
+ },
10595
+ product: null,
10596
+ cta: null
10597
+ },
10598
+ {
10599
+ position: "8",
10600
+ isCollected: null,
10601
+ video: {
10602
+ itemId: "VIDEOO8Zjt1709616802987",
10603
+ 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.",
10604
+ tags: [
10605
+ "Blue",
10606
+ "Medium",
10607
+ "Shoulder",
10608
+ "Hand",
10609
+ "Handbags",
10610
+ "Dior Book Tote"
10611
+ ],
10612
+ weight: null,
10613
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOO8Zjt1709616802987:default:3::branch:Handbags:8",
10614
+ bindCta: null,
10615
+ bindProduct: {
10616
+ itemId: "M1296ZRIWM828",
10617
+ title: "Medium Dior Book Tote",
10618
+ tags: [
10619
+ "Maria Grazia Chiuri",
10620
+ "Hand",
10621
+ "Shoulder",
10622
+ "Handbags",
10623
+ "Blue",
10624
+ "Women"
10625
+ ],
10626
+ weight: null,
10627
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1296ZRIWM828:default:3::branch:Handbags:8",
10628
+ bindCta: {
10629
+ itemId: "CTAzgoPn1709005149328",
10630
+ title: "立即购买",
10631
+ tags: [
10632
+ ],
10633
+ weight: null,
10634
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:8",
10635
+ enTitle: "Shop now",
10636
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10637
+ link: null,
10638
+ linkTitle: null,
10639
+ linkType: null,
10640
+ menuCategoryId: "65966478d19caa37afe3603f"
10641
+ },
10642
+ homePage: [
10643
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fs69g46K9wPCwi5VRAP2QAgRHM0Pc1709696901624.jpg",
10644
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsAIliGV0ZJP8MNa8DECYtwsK4ker1709696900761.jpg",
10645
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsMJ4JfZ0Vhzq6H71NdIPg6YozbIz1709696897845.jpg",
10646
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240306/fsWXI06zGOmACXn9wD3EegRLkB7dg1709696911033.jpg"
10647
+ ],
10648
+ collection: "Eté 2024",
10649
+ 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",
10650
+ linkTitle: null,
10651
+ linkType: "WEB",
10652
+ 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.",
10653
+ price: 3350,
10654
+ currency: "USD-$"
10655
+ },
10656
+ bindProducts: [
10657
+ ],
10658
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsmS72zfInwmblYTnuYzRuZKAOlhr1709616742898.jpg",
10659
+ url: null,
10660
+ imgUrls: [
10661
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsU2gDw28XFd1nOAqlUjb1r1h6mpT1710400349981.jpg"
10662
+ ],
10663
+ hashTags: [
10664
+ "Dior Book Tote",
10665
+ "Handbags"
10666
+ ]
10667
+ },
10668
+ product: null,
10669
+ cta: null
10670
+ },
10671
+ {
10672
+ position: "9",
10673
+ isCollected: null,
10674
+ video: null,
10675
+ product: {
10676
+ itemId: "M2821SNIOM900",
10677
+ title: "Medium Dior Toujours Bag Black Macrocannage Crinkled Leather",
10678
+ tags: [
10679
+ "Medium",
10680
+ "Black",
10681
+ "Women",
10682
+ "Handbags",
10683
+ "Bucket Bag"
10684
+ ],
10685
+ weight: null,
10686
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2821SNIOM900:default:3::branch:Handbags:9",
10687
+ bindCta: {
10688
+ itemId: "CTAzgoPn1709005149328",
10689
+ title: "立即购买",
10690
+ tags: [
10691
+ ],
10692
+ weight: null,
10693
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:9",
10694
+ enTitle: "Shop now",
10695
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10696
+ link: null,
10697
+ linkTitle: null,
10698
+ linkType: null,
10699
+ menuCategoryId: "65966478d19caa37afe3603f"
10700
+ },
10701
+ homePage: [
10702
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsy6AN0OWw3rj8Luw3RTSP9n2kDLq1710497237677.jpg",
10703
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fszTc3uEUrtppdN9QVVU2XBnaaaBY1710497237986.jpg",
10704
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKbBMTRa0tTTX661wu7DzLw9OP0r1710497237980.jpg",
10705
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsOYHlYCwgzalxzmIJcsZmIsJ2L3g1710497237145.jpg",
10706
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKJqNVm1ZBlrgZ8XLC0YAaO6ws2F1710497237650.jpg",
10707
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsm2VoVancBQ20nDHceESUPNLyrUy1710497238312.jpg",
10708
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs2B5YYmv8OztP3d9rlM2a9KmYswl1710497237339.jpg"
10709
+ ],
10710
+ collection: "Eté 2024",
10711
+ 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",
10712
+ linkTitle: null,
10713
+ linkType: "WEB",
10714
+ 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.",
10715
+ price: 4400,
10716
+ currency: "USD-$"
10717
+ },
10718
+ cta: null
10719
+ },
10720
+ {
10721
+ position: "10",
10722
+ isCollected: null,
10723
+ video: {
10724
+ itemId: "VIDEOesZlV1710323980494",
10725
+ 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.",
10726
+ tags: [
10727
+ "Lady Dior",
10728
+ "Removable Shoulder Strap",
10729
+ "Medium",
10730
+ "Handbags",
10731
+ "Crossbody"
10732
+ ],
10733
+ weight: null,
10734
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOesZlV1710323980494:default:3::branch:Handbags:10",
10735
+ bindCta: null,
10736
+ bindProduct: {
10737
+ itemId: "M0565SDBRM900",
10738
+ title: "Medium Lady Dior Bag",
10739
+ tags: [
10740
+ "Women",
10741
+ "Black",
10742
+ "Handbags",
10743
+ "Hand",
10744
+ "Lady Dior",
10745
+ "Crossbody"
10746
+ ],
10747
+ weight: null,
10748
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565SDBRM900:default:3::branch:Handbags:10",
10749
+ bindCta: {
10750
+ itemId: "CTAzgoPn1709005149328",
10751
+ title: "立即购买",
10752
+ tags: [
10753
+ ],
10754
+ weight: null,
10755
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:10",
10756
+ enTitle: "Shop now",
10757
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10758
+ link: null,
10759
+ linkTitle: null,
10760
+ linkType: null,
10761
+ menuCategoryId: "65966478d19caa37afe3603f"
10762
+ },
10763
+ homePage: [
10764
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsnyiCm9oirbXLqmqY7231O8O2Yhb1710498970982.jpg",
10765
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fskwIRRKCtuw9cb9btuubt2D5bXfB1710498970676.jpg",
10766
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqXFTCyhxspeYCD3uo4UiuN5vQ7w1710498970671.jpg",
10767
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8rDRSKJmWUNI42MjrMWVlI0D9Fz1710498970729.jpg",
10768
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsca9Cjqo3WMJVU0OL0OjQo8xOoMx1710498972076.jpg",
10769
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsjl1bxi56X0QrKwfvl8YocBVJ2N81710498971352.jpg"
10770
+ ],
10771
+ collection: null,
10772
+ 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",
10773
+ linkTitle: null,
10774
+ linkType: "WEB",
10775
+ 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.",
10776
+ price: 7100,
10777
+ currency: "USD-$"
10778
+ },
10779
+ bindProducts: [
10780
+ ],
10781
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsiwMQ88zO5Xdnl939krMyBMbz7Js1710323763013.png",
10782
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsxyS8nr7nn0LMe7EqOt3ETXqLu7d1710323753073.mp4",
10783
+ imgUrls: null,
10784
+ hashTags: [
10785
+ "Lady Dior",
10786
+ "Handbags"
10787
+ ]
10788
+ },
10789
+ product: null,
10790
+ cta: null
10791
+ },
10792
+ {
10793
+ position: "11",
10794
+ isCollected: null,
10795
+ video: {
10796
+ itemId: "VIDEOdvsXq1710324342942",
10797
+ 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.",
10798
+ tags: [
10799
+ "Summer 2024",
10800
+ "Lady Dior",
10801
+ "Casual",
10802
+ "Lightweight",
10803
+ "Medium",
10804
+ "Handbags"
10805
+ ],
10806
+ weight: null,
10807
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOdvsXq1710324342942:default:3::branch:Handbags:11",
10808
+ bindCta: null,
10809
+ bindProduct: {
10810
+ itemId: "M1151OTRLM900",
10811
+ title: "Medium Lady D-Sire My ABCDior Bag",
10812
+ tags: [
10813
+ "Handbags",
10814
+ "Summer 2024",
10815
+ "Lady Dior",
10816
+ "Black",
10817
+ "Medium",
10818
+ "Women",
10819
+ "Lady D-Sire"
10820
+ ],
10821
+ weight: null,
10822
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M1151OTRLM900:default:3::branch:Handbags:11",
10823
+ bindCta: {
10824
+ itemId: "CTAzgoPn1709005149328",
10825
+ title: "立即购买",
10826
+ tags: [
10827
+ ],
10828
+ weight: null,
10829
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:11",
10830
+ enTitle: "Shop now",
10831
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10832
+ link: null,
10833
+ linkTitle: null,
10834
+ linkType: null,
10835
+ menuCategoryId: "65966478d19caa37afe3603f"
10836
+ },
10837
+ homePage: [
10838
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsBvqPYhaE9Ct1JzBd4gm8g9YOiAZ1710499102900.jpg",
10839
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs6sf9nB7WpJuLNIZT3c8O8Fmf3Gu1710499102936.jpg",
10840
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsSxYBxyVx2yRrUgEaYmarWhlUbk41710499102531.jpg",
10841
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsyhykK1B7W9613MAfipfIuE1foim1710499102345.jpg",
10842
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs6FXJdaXib8lP0NPloe1XQGpoiKc1710499103268.jpg",
10843
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsCRx7T4ejNvgKNensH6LT4dPt6251710499103615.jpg"
10844
+ ],
10845
+ collection: null,
10846
+ 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",
10847
+ linkTitle: null,
10848
+ linkType: "WEB",
10849
+ 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",
10850
+ price: 6100,
10851
+ currency: "USD-$"
10852
+ },
10853
+ bindProducts: [
10854
+ ],
10855
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsOsdUSXr57U5Twhhkv17th3yHqBJ1710324292456.png",
10856
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsZyr3slVtlsParX6D0DqsM0QEx8d1710324283147.mp4",
10857
+ imgUrls: null,
10858
+ hashTags: [
10859
+ "Summer 2024",
10860
+ "Lady Dior",
10861
+ "Handbags"
10862
+ ]
10863
+ },
10864
+ product: null,
10865
+ cta: null
10866
+ },
10867
+ {
10868
+ position: "12",
10869
+ isCollected: null,
10870
+ video: {
10871
+ itemId: "VIDEOy76Fr1710324746846",
10872
+ 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",
10873
+ tags: [
10874
+ "Maria Grazia Chiuri",
10875
+ "Saddle Bags",
10876
+ "Removable Shoulder Strap",
10877
+ "Hand",
10878
+ "Shoulder",
10879
+ "Crossbody",
10880
+ "Handbags"
10881
+ ],
10882
+ weight: null,
10883
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOy76Fr1710324746846:default:3::branch:Handbags:12",
10884
+ bindCta: null,
10885
+ bindProduct: {
10886
+ itemId: "M0455CBAAM900",
10887
+ title: "Saddle Bag with Strap",
10888
+ tags: [
10889
+ "Saddle Bags",
10890
+ "Handbags",
10891
+ "Maria Grazia Chiuri"
10892
+ ],
10893
+ weight: null,
10894
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0455CBAAM900:default:3::branch:Handbags:12",
10895
+ bindCta: {
10896
+ itemId: "CTAzgoPn1709005149328",
10897
+ title: "立即购买",
10898
+ tags: [
10899
+ ],
10900
+ weight: null,
10901
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:12",
10902
+ enTitle: "Shop now",
10903
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10904
+ link: null,
10905
+ linkTitle: null,
10906
+ linkType: null,
10907
+ menuCategoryId: "65966478d19caa37afe3603f"
10908
+ },
10909
+ homePage: [
10910
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsiwfgnCrVBGcGPh6gaFsvbYBIpxX1709285334896.png",
10911
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsXpilTgUS4u4oFWr0hUew8DQITi11709285353202.png",
10912
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsWxJm6YIeRYmDtDoB5WtYMjRX8bm1709285366208.png",
10913
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsj69PxKh1SAZ6p0902FbBT0vg2at1709285373714.png",
10914
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fs78nKueByU2cNulReOw8gJ1ZsieF1709285412981.png",
10915
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsmAEriTIohZAUMUE6gUCWvXwbbRE1709285429332.png"
10916
+ ],
10917
+ collection: "Eté 2024",
10918
+ 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",
10919
+ linkTitle: null,
10920
+ linkType: "WEB",
10921
+ 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.",
10922
+ price: 4400,
10923
+ currency: "USD-$"
10924
+ },
10925
+ bindProducts: [
10926
+ ],
10927
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsqwogfFahvNml7vmATxwfKLcNlh91710324602536.png",
10928
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsVRd4z4V8UScNc7Wc96xv4xDVByb1710324589932.mp4",
10929
+ imgUrls: null,
10930
+ hashTags: [
10931
+ "Maria Grazia Chiuri",
10932
+ "Saddle Bags",
10933
+ "Handbags"
10934
+ ]
10935
+ },
10936
+ product: null,
10937
+ cta: null
10938
+ },
10939
+ {
10940
+ position: "13",
10941
+ isCollected: null,
10942
+ video: {
10943
+ itemId: "VIDEOvqhF71709609258469",
10944
+ 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.",
10945
+ tags: [
10946
+ "Thin",
10947
+ "Removable Shoulder Strap",
10948
+ "Medium",
10949
+ "Lady Dior",
10950
+ "Crossbody",
10951
+ "Handbags",
10952
+ "Cross-body & Shoulder Bags"
10953
+ ],
10954
+ weight: null,
10955
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOvqhF71709609258469:default:3::branch:Handbags:13",
10956
+ bindCta: null,
10957
+ bindProduct: {
10958
+ itemId: "M0565SDBRM900",
10959
+ title: "Medium Lady Dior Bag",
10960
+ tags: [
10961
+ "Women",
10962
+ "Black",
10963
+ "Handbags",
10964
+ "Hand",
10965
+ "Lady Dior",
10966
+ "Crossbody"
10967
+ ],
10968
+ weight: null,
10969
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565SDBRM900:default:3::branch:Handbags:13",
10970
+ bindCta: {
10971
+ itemId: "CTAzgoPn1709005149328",
10972
+ title: "立即购买",
10973
+ tags: [
10974
+ ],
10975
+ weight: null,
10976
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:13",
10977
+ enTitle: "Shop now",
10978
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
10979
+ link: null,
10980
+ linkTitle: null,
10981
+ linkType: null,
10982
+ menuCategoryId: "65966478d19caa37afe3603f"
10983
+ },
10984
+ homePage: [
10985
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsnyiCm9oirbXLqmqY7231O8O2Yhb1710498970982.jpg",
10986
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fskwIRRKCtuw9cb9btuubt2D5bXfB1710498970676.jpg",
10987
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqXFTCyhxspeYCD3uo4UiuN5vQ7w1710498970671.jpg",
10988
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8rDRSKJmWUNI42MjrMWVlI0D9Fz1710498970729.jpg",
10989
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsca9Cjqo3WMJVU0OL0OjQo8xOoMx1710498972076.jpg",
10990
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsjl1bxi56X0QrKwfvl8YocBVJ2N81710498971352.jpg"
10991
+ ],
10992
+ collection: null,
10993
+ 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",
10994
+ linkTitle: null,
10995
+ linkType: "WEB",
10996
+ 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.",
10997
+ price: 7100,
10998
+ currency: "USD-$"
10999
+ },
11000
+ bindProducts: [
11001
+ ],
11002
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsHmNyOcNdgB9Y8aIFYWCHlEZVl4x1709608981919.jpg",
11003
+ url: null,
11004
+ imgUrls: [
11005
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fslhMX6mwCM4i5XFY6dpcMZdPocYv1710398865153.jpg",
11006
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsJQCe9rZmsEjuIUpdck9Hs2gpNU81710398856427.jpg",
11007
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsnHUJufSHptF88bNsyUGmSSKYH4A1710398855734.jpg"
11008
+ ],
11009
+ hashTags: [
11010
+ "Lady Dior",
11011
+ "Handbags"
11012
+ ]
11013
+ },
11014
+ product: null,
11015
+ cta: null
11016
+ },
11017
+ {
11018
+ position: "14",
11019
+ isCollected: null,
11020
+ video: null,
11021
+ product: {
11022
+ itemId: "M0455CBAAM900",
11023
+ title: "Saddle Bag with Strap",
11024
+ tags: [
11025
+ "Saddle Bags",
11026
+ "Handbags",
11027
+ "Maria Grazia Chiuri"
11028
+ ],
11029
+ weight: null,
11030
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0455CBAAM900:default:3::branch:Handbags:14",
11031
+ bindCta: {
11032
+ itemId: "CTAzgoPn1709005149328",
11033
+ title: "立即购买",
11034
+ tags: [
11035
+ ],
11036
+ weight: null,
11037
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:14",
11038
+ enTitle: "Shop now",
11039
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11040
+ link: null,
11041
+ linkTitle: null,
11042
+ linkType: null,
11043
+ menuCategoryId: "65966478d19caa37afe3603f"
11044
+ },
11045
+ homePage: [
11046
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsiwfgnCrVBGcGPh6gaFsvbYBIpxX1709285334896.png",
11047
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsXpilTgUS4u4oFWr0hUew8DQITi11709285353202.png",
11048
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsWxJm6YIeRYmDtDoB5WtYMjRX8bm1709285366208.png",
11049
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsj69PxKh1SAZ6p0902FbBT0vg2at1709285373714.png",
11050
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fs78nKueByU2cNulReOw8gJ1ZsieF1709285412981.png",
11051
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240301/fsmAEriTIohZAUMUE6gUCWvXwbbRE1709285429332.png"
11052
+ ],
11053
+ collection: "Eté 2024",
11054
+ 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",
11055
+ linkTitle: null,
11056
+ linkType: "WEB",
11057
+ 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.",
11058
+ price: 4400,
11059
+ currency: "USD-$"
11060
+ },
11061
+ cta: null
11062
+ },
11063
+ {
11064
+ position: "15",
11065
+ isCollected: null,
11066
+ video: {
11067
+ itemId: "VIDEO693hq1709628690318",
11068
+ 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.",
11069
+ tags: [
11070
+ "Ready-To-Wear",
11071
+ "Handbags",
11072
+ "Signature Hardware Design",
11073
+ "Monogram/Logo Print",
11074
+ "Calfskin Leather",
11075
+ "Summer 2024",
11076
+ "Black"
11077
+ ],
11078
+ weight: null,
11079
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEO693hq1709628690318:default:3::branch:Handbags:15",
11080
+ bindCta: null,
11081
+ bindProduct: {
11082
+ itemId: "M3352UBHMM900",
11083
+ title: "Small Dior Caro Top Handle Camera Bag Black Macrocannage Calfskin ",
11084
+ tags: [
11085
+ "Summer 2024",
11086
+ "Black",
11087
+ "Women",
11088
+ "Handbags",
11089
+ "Dior Caro"
11090
+ ],
11091
+ weight: null,
11092
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M3352UBHMM900:default:3::branch:Handbags:15",
11093
+ bindCta: {
11094
+ itemId: "CTAzgoPn1709005149328",
11095
+ title: "立即购买",
11096
+ tags: [
11097
+ ],
11098
+ weight: null,
11099
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:15",
11100
+ enTitle: "Shop now",
11101
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11102
+ link: null,
11103
+ linkTitle: null,
11104
+ linkType: null,
11105
+ menuCategoryId: "65966478d19caa37afe3603f"
11106
+ },
11107
+ homePage: [
11108
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsx3wufMP9P6ovvCrXL58eVVA61gI1710499528917.jpg",
11109
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs82a414vXXhbgMXsw3Zm8TWyDMvI1710499528543.jpg",
11110
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsJaZoFhur3jfMEciQdk5GMV8O2un1710499528346.jpg",
11111
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fstO8CRKfBzpJUmAMyCDHDo23ji9N1710499528346.jpg",
11112
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsagaUiox7KECRhbPn6MScg3s4Nwd1710499528602.jpg",
11113
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsBsyFADiYBLWHaAIQfNRsgweVOWj1710499529947.jpg",
11114
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqJEwfvOLpXQ6nQt76o92XdLwzs11710499529939.jpg"
11115
+ ],
11116
+ collection: "Eté 2024",
11117
+ link: "https://www.dior.com/en_us/fashion/products/M3352UBHM_M900",
11118
+ linkTitle: null,
11119
+ linkType: "WEB",
11120
+ 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. ",
11121
+ price: 3350,
11122
+ currency: "USD-$"
11123
+ },
11124
+ bindProducts: [
11125
+ ],
11126
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsZhMDVzP6kuh9Qt86c11whAMglMU1709628656988.jpg",
11127
+ url: null,
11128
+ imgUrls: [
11129
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsWrEKA6oRWUmOY14D1POTJjgiks51710401973577.jpg"
11130
+ ],
11131
+ hashTags: [
11132
+ "Ready-To-Wear"
11133
+ ]
11134
+ },
11135
+ product: null,
11136
+ cta: null
11137
+ },
11138
+ {
11139
+ position: "16",
11140
+ isCollected: null,
11141
+ video: {
11142
+ itemId: "VIDEO2rUuG1709617832960",
11143
+ 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.",
11144
+ tags: [
11145
+ "Dior Toujours Bag",
11146
+ "Casual",
11147
+ "Leather Strap",
11148
+ "Handbags"
11149
+ ],
11150
+ weight: null,
11151
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEO2rUuG1709617832960:default:3::branch:Handbags:16",
11152
+ bindCta: null,
11153
+ bindProduct: {
11154
+ itemId: "M2821SNIOM900",
11155
+ title: "Medium Dior Toujours Bag Black Macrocannage Crinkled Leather",
11156
+ tags: [
11157
+ "Medium",
11158
+ "Black",
11159
+ "Women",
11160
+ "Handbags",
11161
+ "Bucket Bag"
11162
+ ],
11163
+ weight: null,
11164
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M2821SNIOM900:default:3::branch:Handbags:16",
11165
+ bindCta: {
11166
+ itemId: "CTAzgoPn1709005149328",
11167
+ title: "立即购买",
11168
+ tags: [
11169
+ ],
11170
+ weight: null,
11171
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:16",
11172
+ enTitle: "Shop now",
11173
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11174
+ link: null,
11175
+ linkTitle: null,
11176
+ linkType: null,
11177
+ menuCategoryId: "65966478d19caa37afe3603f"
11178
+ },
11179
+ homePage: [
11180
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsy6AN0OWw3rj8Luw3RTSP9n2kDLq1710497237677.jpg",
11181
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fszTc3uEUrtppdN9QVVU2XBnaaaBY1710497237986.jpg",
11182
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKbBMTRa0tTTX661wu7DzLw9OP0r1710497237980.jpg",
11183
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsOYHlYCwgzalxzmIJcsZmIsJ2L3g1710497237145.jpg",
11184
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsKJqNVm1ZBlrgZ8XLC0YAaO6ws2F1710497237650.jpg",
11185
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsm2VoVancBQ20nDHceESUPNLyrUy1710497238312.jpg",
11186
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs2B5YYmv8OztP3d9rlM2a9KmYswl1710497237339.jpg"
11187
+ ],
11188
+ collection: "Eté 2024",
11189
+ 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",
11190
+ linkTitle: null,
11191
+ linkType: "WEB",
11192
+ 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.",
11193
+ price: 4400,
11194
+ currency: "USD-$"
11195
+ },
11196
+ bindProducts: [
11197
+ ],
11198
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fs0BUtn8TYp4l8gWsg5WD9Ht8AP7R1709617796077.jpg",
11199
+ url: null,
11200
+ imgUrls: [
11201
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsmecPfhI3OtZwJmKAXLv8scBSSdK1710399333565.jpg",
11202
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsfsWBLxbC36B7Pm7Ae1uL98EmoaH1710399333017.jpg"
11203
+ ],
11204
+ hashTags: [
11205
+ "Handbags",
11206
+ "Dior Toujours Bag"
11207
+ ]
11208
+ },
11209
+ product: null,
11210
+ cta: null
11211
+ },
11212
+ {
11213
+ position: "17",
11214
+ isCollected: null,
11215
+ video: {
11216
+ itemId: "VIDEOGZGZI1709629679782",
11217
+ 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",
11218
+ tags: [
11219
+ "Handbags"
11220
+ ],
11221
+ weight: null,
11222
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOGZGZI1709629679782:default:3::branch:Handbags:17",
11223
+ bindCta: null,
11224
+ bindProduct: {
11225
+ itemId: "M0565OZEDM928",
11226
+ title: "Medium Lady Dior Bag",
11227
+ tags: [
11228
+ "Lady Dior",
11229
+ "Medium",
11230
+ "Handbags",
11231
+ "Crossbody"
11232
+ ],
11233
+ weight: null,
11234
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565OZEDM928:default:3::branch:Handbags:17",
11235
+ bindCta: {
11236
+ itemId: "CTAzgoPn1709005149328",
11237
+ title: "立即购买",
11238
+ tags: [
11239
+ ],
11240
+ weight: null,
11241
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:17",
11242
+ enTitle: "Shop now",
11243
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11244
+ link: null,
11245
+ linkTitle: null,
11246
+ linkType: null,
11247
+ menuCategoryId: "65966478d19caa37afe3603f"
11248
+ },
11249
+ homePage: [
11250
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsbVwOx4grEmqCNmvOnKpIS0vTPPc1710499656033.jpg",
11251
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsJrpY9R8uGenvzM7NnzI4lPMCF8g1710836215790.jpg",
11252
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsYQG9gipUNt6UbzFPXTwLTNgj5BF1710836214937.jpg",
11253
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsqPEXjWl7l3wPAxJIZbnnhZPXDCw1710836216838.jpg",
11254
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsNHlPmAsNYPsGDJ5w0G213wJkwFf1710499654946.jpg",
11255
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8dAObnEoAYe1V6pwJOGTs4vCBJO1710499655963.jpg",
11256
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsJpaBPC8OxQ4aYwxsMcqZpGtPWnq1710499655730.jpg"
11257
+ ],
11258
+ collection: "Eté 2024",
11259
+ link: "https://www.dior.com/en_us/fashion/products/M0565OZED_M928",
11260
+ linkTitle: null,
11261
+ linkType: "WEB",
11262
+ 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",
11263
+ price: 6500,
11264
+ currency: "USD-$"
11265
+ },
11266
+ bindProducts: [
11267
+ ],
11268
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240305/fsG1IT2gcB5iabcTL89Xs9bRHISMb1709629659698.jpg",
11269
+ url: null,
11270
+ imgUrls: [
11271
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240314/fsJB1txgzSsQLBBJSTzqGI40BvLkr1710399454552.jpg"
11272
+ ],
11273
+ hashTags: [
11274
+ "Handbags"
11275
+ ]
11276
+ },
11277
+ product: null,
11278
+ cta: null
11279
+ },
11280
+ {
11281
+ position: "18",
11282
+ isCollected: null,
11283
+ video: {
11284
+ itemId: "VIDEOC2IMa1710324169054",
11285
+ 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.",
11286
+ tags: [
11287
+ "Lady Dior",
11288
+ "Removable Shoulder Strap",
11289
+ "Medium",
11290
+ "Handbags",
11291
+ "Crossbody"
11292
+ ],
11293
+ weight: null,
11294
+ traceInfo: "VECTOReVssi1704360966770:VIDEO:VIDEOC2IMa1710324169054:default:3::branch:Handbags:18",
11295
+ bindCta: null,
11296
+ bindProduct: {
11297
+ itemId: "M0565SDBRM900",
11298
+ title: "Medium Lady Dior Bag",
11299
+ tags: [
11300
+ "Women",
11301
+ "Black",
11302
+ "Handbags",
11303
+ "Hand",
11304
+ "Lady Dior",
11305
+ "Crossbody"
11306
+ ],
11307
+ weight: null,
11308
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565SDBRM900:default:3::branch:Handbags:18",
11309
+ bindCta: {
11310
+ itemId: "CTAzgoPn1709005149328",
11311
+ title: "立即购买",
11312
+ tags: [
11313
+ ],
11314
+ weight: null,
11315
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:18",
11316
+ enTitle: "Shop now",
11317
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11318
+ link: null,
11319
+ linkTitle: null,
11320
+ linkType: null,
11321
+ menuCategoryId: "65966478d19caa37afe3603f"
11322
+ },
11323
+ homePage: [
11324
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsnyiCm9oirbXLqmqY7231O8O2Yhb1710498970982.jpg",
11325
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fskwIRRKCtuw9cb9btuubt2D5bXfB1710498970676.jpg",
11326
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsqXFTCyhxspeYCD3uo4UiuN5vQ7w1710498970671.jpg",
11327
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8rDRSKJmWUNI42MjrMWVlI0D9Fz1710498970729.jpg",
11328
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsca9Cjqo3WMJVU0OL0OjQo8xOoMx1710498972076.jpg",
11329
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsjl1bxi56X0QrKwfvl8YocBVJ2N81710498971352.jpg"
11330
+ ],
11331
+ collection: null,
11332
+ 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",
11333
+ linkTitle: null,
11334
+ linkType: "WEB",
11335
+ 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.",
11336
+ price: 7100,
11337
+ currency: "USD-$"
11338
+ },
11339
+ bindProducts: [
11340
+ ],
11341
+ cover: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsuF6sqlC9LCBLTgxHwMRinXwB6bF1710324135846.png",
11342
+ url: "https://dior-sxp-cdn.chatlabs.net/prod/sound/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240313/fsFwNsGElWR2SXQ2tWwHkaiqMZN5H1710324095954.mp4",
11343
+ imgUrls: null,
11344
+ hashTags: [
11345
+ "Lady Dior",
11346
+ "Handbags"
11347
+ ]
11348
+ },
11349
+ product: null,
11350
+ cta: null
11351
+ },
11352
+ {
11353
+ position: "19",
11354
+ isCollected: null,
11355
+ video: null,
11356
+ product: {
11357
+ itemId: "M0565OZEDM928",
11358
+ title: "Medium Lady Dior Bag",
11359
+ tags: [
11360
+ "Lady Dior",
11361
+ "Medium",
11362
+ "Handbags",
11363
+ "Crossbody"
11364
+ ],
11365
+ weight: null,
11366
+ traceInfo: "VECTOReVssi1704360966770:PRODUCT:M0565OZEDM928:default:3::branch:Handbags:19",
11367
+ bindCta: {
11368
+ itemId: "CTAzgoPn1709005149328",
11369
+ title: "立即购买",
11370
+ tags: [
11371
+ ],
11372
+ weight: null,
11373
+ traceInfo: "VECTOReVssi1704360966770:CTA:CTAzgoPn1709005149328:default:3::branch:Handbags:19",
11374
+ enTitle: "Shop now",
11375
+ icon: "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240227/fsIkhOh3SihCkTDQ3oI41kwCsjq6A1709005134510.png",
11376
+ link: null,
11377
+ linkTitle: null,
11378
+ linkType: null,
11379
+ menuCategoryId: "65966478d19caa37afe3603f"
11380
+ },
11381
+ homePage: [
11382
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsbVwOx4grEmqCNmvOnKpIS0vTPPc1710499656033.jpg",
11383
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsJrpY9R8uGenvzM7NnzI4lPMCF8g1710836215790.jpg",
11384
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsYQG9gipUNt6UbzFPXTwLTNgj5BF1710836214937.jpg",
11385
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240319/fsqPEXjWl7l3wPAxJIZbnnhZPXDCw1710836216838.jpg",
11386
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsNHlPmAsNYPsGDJ5w0G213wJkwFf1710499654946.jpg",
11387
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fs8dAObnEoAYe1V6pwJOGTs4vCBJO1710499655963.jpg",
11388
+ "https://dior-sxp-cdn.chatlabs.net/prod/img/edc1a0de-330e-40e4-bdf3-17d57d57c19b/sxp-portal/20240315/fsJpaBPC8OxQ4aYwxsMcqZpGtPWnq1710499655730.jpg"
11389
+ ],
11390
+ collection: "Eté 2024",
11391
+ link: "https://www.dior.com/en_us/fashion/products/M0565OZED_M928",
11392
+ linkTitle: null,
11393
+ linkType: "WEB",
11394
+ 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",
11395
+ price: 6500,
11396
+ currency: "USD-$"
11397
+ },
11398
+ cta: null
11399
+ }
11400
+ ];
11401
+ var hashTag = "Handbags";
11402
+ var previewData = {
11403
+ productUserId: productUserId,
11404
+ requestId: requestId,
11405
+ channel: channel,
11406
+ rtc: rtc,
11407
+ tag: tag,
11408
+ recList: recList,
11409
+ hashTag: hashTag
11410
+ };
10016
11411
 
10017
- const VideoWidget = ({ rec, index, height, data, muted, activeIndex }) => {
10018
- const [isPauseVideo, setIsPauseVideo] = React.useState(false);
10019
- const videoRef = React.useRef(null);
10020
- const { bffEventReport, sxpParameter, waterFallData, openHashtag } = useSxpDataSource();
10021
- const videoStartTime = React.useRef(0);
10022
- const [isLoad, setIsLoad] = React.useState(false);
10023
- const { isActive } = useSwiperSlide();
10024
- React.useEffect(() => {
10025
- if (!videoRef.current)
10026
- return;
10027
- videoRef.current.muted = muted;
10028
- }, [muted]);
10029
- const handleVideoStart = React.useCallback(() => {
10030
- var _a, _b;
10031
- 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)
10032
- return;
10033
- (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
10034
- }, []);
10035
- const PAUSE_ICON = useIconLink('/pb_static/06f28a2025c74c1cb49be6767316d827.png');
10036
- const handlePlaying = React.useCallback(() => {
10037
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
10038
- setIsPauseVideo(false);
10039
- const item = data[index];
10040
- if (item && isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
10041
- videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
10042
- const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
10043
- const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
10044
- const playType = '1';
10045
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10046
- eventInfo: {
10047
- eventSubject: 'playVideo',
10048
- eventDescription: 'User played the video',
10049
- contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
10050
- contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
10051
- playType,
10052
- startTime: videoCurrentTime,
10053
- videoDuration,
10054
- contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
10055
- position: item.position,
10056
- contentFormat: 'video',
10057
- traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10058
- }
10059
- });
10060
- }
10061
- if (!isLoad) {
10062
- setIsLoad(true);
11412
+ const WaterfallFlowItem = (props) => {
11413
+ const { rec, index, list, reportTagsView, textStyles, space } = props;
11414
+ const { swiperRef, setRtcList, setOpenHashtag, bffEventReport, sxpParameter } = useSxpDataSource();
11415
+ const [showVideo, setShowVideo] = React.useState(false);
11416
+ const imgDom = React.useRef(null);
11417
+ const videoDom = React.useRef(null);
11418
+ const canvasRef = React.useRef(null);
11419
+ const [firstFrameSrc, setFirstFrameSrc] = React.useState('');
11420
+ const src = React.useMemo(() => {
11421
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
11422
+ if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.cover) {
11423
+ return (_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.cover;
10063
11424
  }
10064
- }, [bffEventReport, data, index, isLoad]);
10065
- const handleLoadedMetadata = React.useCallback(() => {
10066
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
10067
- const item = data[index];
10068
- if (item && !isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
10069
- videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
10070
- const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
10071
- const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
10072
- const playType = '0';
10073
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10074
- eventInfo: {
10075
- eventSubject: 'playVideo',
10076
- eventDescription: 'User played the video',
10077
- contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
10078
- contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
10079
- playType,
10080
- startTime: videoCurrentTime,
10081
- videoDuration,
10082
- contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
10083
- position: item.position,
10084
- contentFormat: 'video',
10085
- traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10086
- }
10087
- });
11425
+ else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.url) {
11426
+ setShowVideo(true);
11427
+ return (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.url;
10088
11428
  }
10089
- setTimeout(() => {
10090
- var _a, _b;
10091
- 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)
10092
- return;
10093
- (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
10094
- }, 0);
10095
- }, [index, bffEventReport, data, isLoad]);
10096
- const handleClickVideo = React.useCallback((type) => () => {
10097
- var _a, _b, _c, _d, _e, _f;
10098
- 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)
10099
- return;
10100
- if (!isLoad)
10101
- return;
10102
- const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
10103
- switch (type) {
10104
- case 'start':
10105
- if (!isPause)
10106
- return;
10107
- (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.play();
10108
- setIsPauseVideo(false);
10109
- break;
10110
- case 'pause':
10111
- if (isPause)
10112
- return;
10113
- (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.pause();
10114
- setIsPauseVideo(true);
10115
- break;
10116
- default:
10117
- if (isPause) {
10118
- (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.play();
10119
- }
10120
- else {
10121
- (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.pause();
10122
- }
10123
- setIsPauseVideo(!isPause);
10124
- break;
11429
+ 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) {
11430
+ 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];
10125
11431
  }
10126
- }, [data, index, isLoad]);
10127
- const onPause = React.useCallback(() => {
10128
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
10129
- const item = data[index];
10130
- const videoDuration = ((_b = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.duration) !== null && _b !== void 0 ? _b : 0).toFixed(2);
10131
- const videoCurrentTime = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.currentTime) !== null && _d !== void 0 ? _d : 0).toFixed(2);
10132
- if ((_e = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _e === void 0 ? void 0 : _e.duration) {
10133
- const playDuration = (((_f = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _f === void 0 ? void 0 : _f.currentTime) - videoStartTime.current).toFixed(2);
10134
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10135
- eventInfo: {
10136
- eventSubject: 'playOverVideo',
10137
- eventDescription: 'User finished playing the video',
10138
- contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
10139
- contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
10140
- endTime: videoCurrentTime,
10141
- videoDuration,
10142
- playDuration,
10143
- contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
10144
- position: item.position,
10145
- contentFormat: 'video',
10146
- traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10147
- }
10148
- });
11432
+ 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) {
11433
+ 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];
10149
11434
  }
10150
- }, [data, index, bffEventReport]);
10151
- React.useEffect(() => {
10152
- var _a, _b, _c, _d, _e, _f;
10153
- if (data.length <= 0)
10154
- return;
10155
- if (!videoRef.current)
10156
- return;
10157
- const isPause = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.paused;
10158
- setIsPauseVideo(false);
10159
- if (!isActive) {
10160
- if (!isPause && ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.readyState) >= 2)
10161
- (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
10162
- return;
11435
+ else {
11436
+ return (sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image) || '';
10163
11437
  }
10164
- if (!videoRef.current.src) {
10165
- const videoSrc = rec.video.url;
10166
- // if (videoSrc.includes('.m3u8')) {
10167
- // if (Hls.isSupported()) {
10168
- // const hls = new Hls();
10169
- // hls.loadSource(videoSrc);
10170
- // hls.attachMedia(videoRef.current);
10171
- // } else if (videoRef.current.canPlayType('application/vnd.apple.mpegurl')) {
10172
- // videoRef.current.src = videoSrc;
10173
- // } else {
10174
- // videoRef.current.src = videoSrc;
10175
- // }
10176
- // } else {
10177
- // videoRef.current.src = videoSrc;
10178
- // }
10179
- videoRef.current.src = videoSrc;
10180
- videoRef.current.setAttribute('x5-playsinline', 'true');
10181
- videoRef.current.setAttribute('webkit-playsinline', 'true');
11438
+ }, [rec, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image]);
11439
+ const title = React.useMemo(() => {
11440
+ var _a, _b;
11441
+ 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;
11442
+ }, [rec]);
11443
+ const priceText = React.useMemo(() => {
11444
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
11445
+ 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)) {
11446
+ 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', {
11447
+ minimumFractionDigits: 0
11448
+ })) !== null && _j !== void 0 ? _j : ''}`;
10182
11449
  }
10183
11450
  else {
10184
- if (((_d = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _d === void 0 ? void 0 : _d.readyState) < 2)
10185
- return;
10186
- videoRef.current.play();
11451
+ return null;
10187
11452
  }
10188
- (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener('canplay', handleLoadedMetadata);
10189
- (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.addEventListener('playing', handlePlaying);
11453
+ }, [rec]);
11454
+ // useEffect(() => {
11455
+ // if (imgDom.current === null || src === '') {
11456
+ // return;
11457
+ // }
11458
+ // const img = new Image();
11459
+ // if (showVideo && firstFrameSrc) {
11460
+ // img.src = firstFrameSrc;
11461
+ // } else {
11462
+ // img.src = src;
11463
+ // }
11464
+ // // img.onload = () => {
11465
+ // // setIsLoading(true);
11466
+ // // };
11467
+ // imgDom.current.src = img.src;
11468
+ // }, [src, showVideo, firstFrameSrc]);
11469
+ React.useEffect(() => {
11470
+ const observer = new IntersectionObserver((entries) => {
11471
+ entries.forEach((entry) => {
11472
+ if (entry.isIntersecting) {
11473
+ if (imgDom.current === null || src === '') {
11474
+ return;
11475
+ }
11476
+ if (showVideo && firstFrameSrc) {
11477
+ imgDom.current.src = firstFrameSrc;
11478
+ }
11479
+ else {
11480
+ imgDom.current.src = src;
11481
+ }
11482
+ observer.unobserve(imgDom.current);
11483
+ }
11484
+ });
11485
+ });
11486
+ observer.observe(imgDom.current);
10190
11487
  return () => {
10191
- var _a, _b;
10192
- (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('canplay', handleLoadedMetadata);
10193
- (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener('playing', handlePlaying);
11488
+ observer.disconnect();
10194
11489
  };
10195
- }, [data, handleLoadedMetadata, handlePlaying, isActive, isLoad, rec.video]);
10196
- /*
10197
- 打开/关闭hashtag暂停/播放视频
10198
- */
11490
+ }, [src, showVideo, firstFrameSrc]);
11491
+ const calculateHeightForWidth = (videoWidth, videoHeight, targetWidth) => {
11492
+ const aspectRatio = videoWidth / videoHeight;
11493
+ const targetHeight = targetWidth / aspectRatio;
11494
+ return targetHeight;
11495
+ };
10199
11496
  React.useEffect(() => {
10200
- var _a, _b, _c, _d;
10201
- 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)
10202
- return;
10203
- const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
10204
- if (!isActive)
11497
+ const video = videoDom === null || videoDom === void 0 ? void 0 : videoDom.current;
11498
+ if (video === null || src === '' || !showVideo) {
10205
11499
  return;
10206
- if (!isPause && openHashtag) {
10207
- (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
10208
- }
10209
- else if (!openHashtag) {
10210
- (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.play();
10211
11500
  }
10212
- }, [openHashtag, isActive]);
10213
- React.useEffect(() => {
10214
- if (!isActive)
10215
- return;
10216
- const onShow = handleClickVideo('start');
10217
- const onHide = handleClickVideo('pause');
10218
- SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
10219
- SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
10220
- return () => {
10221
- SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
10222
- SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
11501
+ video.src = src;
11502
+ video.currentTime = 1;
11503
+ video.crossOrigin = 'anonymous';
11504
+ video.onloadeddata = () => {
11505
+ const canvas = canvasRef === null || canvasRef === void 0 ? void 0 : canvasRef.current;
11506
+ if (!canvas)
11507
+ return;
11508
+ const ctx = canvas.getContext('2d');
11509
+ const targetWidth = (window === null || window === void 0 ? void 0 : window.innerWidth) / 2;
11510
+ const targetHeight = calculateHeightForWidth(video.videoWidth, video.videoHeight, targetWidth);
11511
+ canvas.height = targetHeight;
11512
+ canvas.width = targetWidth;
11513
+ ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
11514
+ setFirstFrameSrc(canvas.toDataURL());
11515
+ video.remove();
11516
+ canvas.remove();
10223
11517
  };
10224
- }, [handleClickVideo, isActive]);
10225
- const renderPoster = React.useMemo(() => {
10226
- if (!(sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image)) {
10227
- return null;
11518
+ }, [src, showVideo]);
11519
+ const handleClickToDetail = () => {
11520
+ reportTagsView();
11521
+ setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(list);
11522
+ setTimeout(() => {
11523
+ var _a;
11524
+ (_a = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _a === void 0 ? void 0 : _a.swiper.slideTo(index, 0, false);
11525
+ setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
11526
+ }, 0);
11527
+ };
11528
+ return (React.createElement("div", { className: 'list-content-listItem', key: index, onClick: handleClickToDetail, style: { marginBottom: space } },
11529
+ React.createElement("div", { className: 'list-content-listItem-picture' },
11530
+ showVideo && (React.createElement("div", { style: { display: 'none' } },
11531
+ React.createElement("video", { ref: videoDom, crossOrigin: 'anonymous', className: 'list-content-listItem-picture-img' }),
11532
+ React.createElement("canvas", { ref: canvasRef }))),
11533
+ React.createElement("img", { className: 'list-content-listItem-picture-img', loading: 'lazy', ref: imgDom })),
11534
+ React.createElement("div", { className: 'list-content-listItem-info' },
11535
+ 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),
11536
+ React.createElement("div", { className: 'list-content-listItem-info-price', style: textStyles.price, hidden: !priceText }, priceText))));
11537
+ };
11538
+ function WaterfallList(_a) {
11539
+ var _b, _c, _d, _e, _f, _g, _h;
11540
+ var { reportTagsView } = _a, props = __rest(_a, ["reportTagsView"]);
11541
+ const { waterFallData, getRecommendVideos, hashTagSize, loadingImage, isOpenHashTag } = useSxpDataSource();
11542
+ const [list, setList] = React.useState();
11543
+ const [data, setData] = React.useState();
11544
+ const [isLoadingData, setIsLoadingData] = React.useState(false);
11545
+ const containerRef = React.useRef(null);
11546
+ const [isLoadMore, setIsLoadMore] = React.useState(false);
11547
+ React.useCallback(() => {
11548
+ if (isLoadMore)
11549
+ return;
11550
+ setIsLoadMore(true);
11551
+ waterFallData &&
11552
+ (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
11553
+ hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
11554
+ 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
11555
+ 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType
11556
+ }).then((res) => {
11557
+ var _a;
11558
+ 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 : []));
11559
+ setIsLoadMore(false);
11560
+ }));
11561
+ }, [waterFallData, getRecommendVideos, list, isLoadMore]);
11562
+ React.useEffect(() => {
11563
+ var _a, _b;
11564
+ setIsLoadingData(true);
11565
+ waterFallData &&
11566
+ (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
11567
+ hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
11568
+ 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
11569
+ 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType,
11570
+ defaultSize: hashTagSize
11571
+ }).then((res) => {
11572
+ var _a, _b;
11573
+ setData(res);
11574
+ 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 : []);
11575
+ setIsLoadingData(false);
11576
+ }));
11577
+ if (isOpenHashTag) {
11578
+ const res = previewData;
11579
+ setData(res);
11580
+ 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 : []);
11581
+ setIsLoadingData(false);
10228
11582
  }
10229
- 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 }));
10230
- }, [isLoad, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image]);
11583
+ }, [waterFallData, getRecommendVideos, hashTagSize, isOpenHashTag]);
11584
+ // useEffect(() => {
11585
+ // const container = containerRef?.current;
11586
+ // if (!container) return;
11587
+ // const handleScroll = () => {
11588
+ // const top = (container as any)?.scrollTop;
11589
+ // const clientHeight = (container as any)?.clientHeight;
11590
+ // const scrollHeight = (container as any)?.scrollHeight;
11591
+ // if (scrollHeight <= top + clientHeight && !isLoadingData) {
11592
+ // loadMoreData();
11593
+ // }
11594
+ // };
11595
+ // container?.addEventListener('scroll', handleScroll);
11596
+ // return () => {
11597
+ // container?.removeEventListener('scroll', handleScroll); // 在组件卸载时移除事件监听器
11598
+ // };
11599
+ // }, [isLoadingData, containerRef, loadMoreData]);
11600
+ const handleClickLink = () => {
11601
+ var _a, _b;
11602
+ if ((_a = data === null || data === void 0 ? void 0 : data.tag) === null || _a === void 0 ? void 0 : _a.link) {
11603
+ reportTagsView();
11604
+ window.location.href = (_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.link;
11605
+ }
11606
+ };
11607
+ return (React.createElement(React.Fragment, null, isLoadingData ? (React.createElement("div", { style: { height: '100%', width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' } },
11608
+ React.createElement("img", { width: 64, height: 64, src: loadingImage, alt: 'loading...', style: { objectFit: 'contain' } }))) : (React.createElement("div", { className: 'list' },
11609
+ React.createElement("div", { className: 'list-scroll', ref: containerRef, style: {
11610
+ bottom: ((_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.link) ? '100px' : 0
11611
+ } },
11612
+ 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),
11613
+ 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'),
11614
+ React.createElement("div", { className: 'list-content' }, list === null || list === void 0 ? void 0 : list.map((item, ind) => {
11615
+ return (React.createElement(WaterfallFlowItem, Object.assign({ key: ind, index: ind, rec: item, list: list, reportTagsView: reportTagsView }, props)));
11616
+ })),
11617
+ React.createElement("div", { hidden: !isLoadMore, style: { textAlign: 'center' } }, "loading...")),
11618
+ 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) },
11619
+ 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'))))));
11620
+ }
11621
+
11622
+ var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAaZJREFUeF7t2jFKBEEQRuG3mSJeQTARURDMTL2EqXfwAnoKD6FHMDEzNVIw2tzQC2gFggyDrExX1V92T7wz9PumFnqbXdH5teq8nwEwJqBzgfEVKDYAW8Ae8NZq3ZUm4Aa4AnaBR+C8BUIVAIu/ngSfAs9LESoAWLgB/LzWwP7SeLtfHWAu3tZ9Adz/dwD3eOUJCIlXBQiLVwQIjVcDCI9XAkiJVwFIi1cASI3PBpjb3jbd5GyyUcraCUrEZ02ATHwGgFR8NIBcfCSAZHwUgGx8BIB0vDeAfLwnQIl4L4Ay8R4ApeJbA2wD78DOZA/e7ABzk739Xz/T8rfAIfA6WYCd3BqA7NUSwCKfgLNKCK0BjoC7rzP74yoIrQGsuxSCB0ApBC+AMgieACUQvAHkESIApBGiAGQRIgEkEaIB5BAyAKQQsgBkEDIBJBCyAdIRFABSEVQA0hCUAFIQ1ADCERQBQhFUAcIQlAFCENQBfkOwg9eXpeftFQDmEOzv8ifARy8A3wiXwAHwANwujbf7q0xAi9bZZwwAN9oiDx4TUORFuS2z+wn4BAiAaEHnKChjAAAAAElFTkSuQmCC";
11623
+
11624
+ /*
11625
+ * @Author: binruan@chatlabs.com
11626
+ * @Date: 2024-01-10 10:58:24
11627
+ * @LastEditors: binruan@chatlabs.com
11628
+ * @LastEditTime: 2024-04-07 15:18:35
11629
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\WaterFall\index.tsx
11630
+ *
11631
+ */
11632
+ const WaterFall = (props) => {
11633
+ var _a;
11634
+ const { waterFallData, setOpenHashtag, openHashtag, swiperRef, setWaterFallData, cacheRtcList, setRtcList, cacheActiveIndex, rtcList, setCacheRtcList, setIsFromHashtag, isFromHashtag, bffEventReport } = useSxpDataSource();
11635
+ React.useRef(null);
11636
+ const modalEleRef = React.useRef(null);
11637
+ const [viewTime, setViewTime] = React.useState();
10231
11638
  React.useEffect(() => {
10232
- const handleBeforeUnload = () => {
11639
+ const parentNode = document.getElementById('sxp-render');
11640
+ const node = document.getElementById('water-fall');
11641
+ if (node) {
11642
+ modalEleRef.current = node;
11643
+ }
11644
+ else {
11645
+ modalEleRef.current = document.createElement('div');
11646
+ modalEleRef.current.setAttribute('id', 'water-fall');
11647
+ parentNode === null || parentNode === void 0 ? void 0 : parentNode.appendChild(modalEleRef.current);
11648
+ }
11649
+ }, []);
11650
+ const handleClose = () => {
11651
+ const isEq = lodash.isEqual(rtcList, cacheRtcList);
11652
+ if (!isEq && cacheRtcList && (cacheRtcList === null || cacheRtcList === void 0 ? void 0 : cacheRtcList.length)) {
11653
+ setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(cacheRtcList);
11654
+ }
11655
+ reportTagsView();
11656
+ setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData(undefined);
11657
+ setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(false);
11658
+ setTimeout(() => {
10233
11659
  var _a, _b;
10234
- 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) {
10235
- handleClickVideo('pause')();
11660
+ if (!isEq) {
11661
+ (_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);
11662
+ }
11663
+ setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
11664
+ }, 0);
11665
+ };
11666
+ const [recData, setRecData] = React.useState();
11667
+ React.useEffect(() => {
11668
+ if (waterFallData) {
11669
+ setRecData(waterFallData);
11670
+ }
11671
+ }, [waterFallData]);
11672
+ const reportTagsView = React.useCallback(() => {
11673
+ var _a, _b, _c, _d, _e, _f;
11674
+ const rec = recData === null || recData === void 0 ? void 0 : recData.rec;
11675
+ if (!rec)
11676
+ return;
11677
+ let fromKName = '';
11678
+ if (isFromHashtag) {
11679
+ fromKName = 'hashTagPage';
11680
+ }
11681
+ else if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.url) {
11682
+ fromKName = 'videoPage';
11683
+ }
11684
+ 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) {
11685
+ fromKName = 'imagePage';
11686
+ }
11687
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11688
+ eventInfo: {
11689
+ relatedContentId: (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.itemId,
11690
+ position: rec === null || rec === void 0 ? void 0 : rec.position,
11691
+ contentTags: JSON.stringify((_e = rec === null || rec === void 0 ? void 0 : rec.video) === null || _e === void 0 ? void 0 : _e.tags),
11692
+ traceInfo: JSON.stringify((_f = rec === null || rec === void 0 ? void 0 : rec.video) === null || _f === void 0 ? void 0 : _f.traceInfo),
11693
+ hashTags: JSON.stringify([recData === null || recData === void 0 ? void 0 : recData.hashTag]),
11694
+ fromKName,
11695
+ fromKPage: location === null || location === void 0 ? void 0 : location.href,
11696
+ timeOnSite: Math.floor((new Date() - viewTime) / 1000) + '',
11697
+ eventSubject: 'clickTagsViewContents',
11698
+ eventDescription: 'User click tags view contents'
10236
11699
  }
11700
+ });
11701
+ }, [recData, bffEventReport, viewTime, isFromHashtag]);
11702
+ React.useEffect(() => {
11703
+ if (openHashtag) {
11704
+ setViewTime(new Date());
11705
+ }
11706
+ }, [openHashtag]);
11707
+ React.useEffect(() => {
11708
+ const initTime = () => {
11709
+ setViewTime(new Date());
10237
11710
  };
10238
- window.addEventListener('beforeunload', handleBeforeUnload);
11711
+ window.addEventListener('pageshow', initTime);
10239
11712
  return () => {
10240
- window.removeEventListener('beforeunload', handleBeforeUnload);
11713
+ window.removeEventListener('pageshow', initTime);
10241
11714
  };
10242
- }, [activeIndex, index, rec, videoRef, handleClickVideo, isPauseVideo]);
10243
- if (!rec.video) {
11715
+ }, []);
11716
+ if (!modalEleRef.current)
10244
11717
  return null;
10245
- }
10246
- return (React.createElement("div", { className: 'video-container', key: rec.video.itemId, onClick: handleClickVideo(), style: {
10247
- position: 'relative',
10248
- width: '100%',
10249
- height
11718
+ return ReactDOM__namespace.createPortal(React.createElement("div", { className: 'waterfall', style: {
11719
+ display: openHashtag ? 'block' : 'none'
10250
11720
  } },
10251
- 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 }),
10252
- renderPoster,
10253
- React.createElement("img", { hidden: !isPauseVideo, className: 'clc-pb-video-pause', src: PAUSE_ICON })));
11721
+ 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 }),
11722
+ React.createElement(WaterfallList, Object.assign({ reportTagsView: reportTagsView }, props))), modalEleRef.current);
10254
11723
  };
10255
- var VideoWidget$1 = React.memo(VideoWidget);
11724
+ var WaterFall$1 = React.memo(WaterFall);
10256
11725
 
10257
11726
  /*
10258
11727
  * @Author: binruan@chatlabs.com
10259
- * @Date: 2023-12-27 19:02:59
11728
+ * @Date: 2024-01-15 19:03:09
10260
11729
  * @LastEditors: binruan@chatlabs.com
10261
- * @LastEditTime: 2024-01-24 10:30:13
10262
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\ToggleButton\index.tsx
11730
+ * @LastEditTime: 2024-04-07 15:42:10
11731
+ * @FilePath: \pb-sxp-ui\src\materials\sxp\HashTag\index.tsx
10263
11732
  *
10264
11733
  */
10265
- const ToggleButton = ({ defaultValue, activeIcon, unactiveIcon, onChange, style }) => {
10266
- const [isTrue, setIsTure] = React.useState(defaultValue);
10267
- const handleClick = (e) => {
10268
- e.stopPropagation();
10269
- const result = !isTrue;
10270
- setIsTure(result);
10271
- onChange === null || onChange === void 0 ? void 0 : onChange(result);
10272
- };
10273
- return (React.createElement("button", { style: style, className: 'pb-toggle-button', onClick: handleClick },
10274
- React.createElement("img", { className: 'pb-toggle-button-icon', src: isTrue ? activeIcon : unactiveIcon })));
11734
+ const HashTag$1 = (props) => {
11735
+ return React.createElement(WaterFall$1, Object.assign({}, props));
10275
11736
  };
10276
- var ToggleButton$1 = React.memo(ToggleButton);
11737
+ var HashTagComponent = React.memo(HashTag$1);
10277
11738
 
10278
11739
  /*
10279
11740
  * @Author: binruan@chatlabs.com
10280
- * @Date: 2024-01-15 19:03:09
11741
+ * @Date: 2023-07-28 18:29:57
10281
11742
  * @LastEditors: binruan@chatlabs.com
10282
- * @LastEditTime: 2024-03-13 10:53:56
10283
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\FingerSwipeTip\index.tsx
11743
+ * @LastEditTime: 2024-04-07 16:22:28
11744
+ * @FilePath: \pb-sxp-ui\src\materials\sxp\HashTag\material.tsx
10284
11745
  *
10285
11746
  */
10286
- const FingerSwipeTip = ({ imageUrl }) => {
10287
- const [show, setShow] = React.useState(true);
10288
- useEditor();
10289
- React.useEffect(() => {
10290
- setTimeout(() => {
10291
- setShow(false);
10292
- }, 2000);
10293
- }, []);
10294
- const FINGER_SWIPE_ICON = useIconLink('/pb_static/finger-swipe-tip.29dc3a48a3c746c906ea..png');
10295
- const animationCls = React.useMemo(() => {
10296
- return show ? 'pb-fadeIn' : 'pb-fadeOut';
10297
- }, [show]);
10298
- return (React.createElement("div", { hidden: !show, className: `pb-finger-wrap ${animationCls}` },
10299
- React.createElement("img", { src: imageUrl || FINGER_SWIPE_ICON })));
10300
- };
10301
-
10302
- const Picture = (props) => {
10303
- const { src, height, width } = props;
10304
- const imgDom = React.useRef(null);
10305
- const { sxpParameter } = useSxpDataSource();
10306
- return (React.createElement("div", { style: {
10307
- overflow: 'hidden',
10308
- height,
10309
- width: '100%',
10310
- position: 'relative'
10311
- } },
10312
- 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: {
10313
- height: '100%',
10314
- width: '100%',
10315
- objectFit: 'cover'
10316
- } })));
10317
- };
10318
-
10319
- /*
10320
- * @Author: lewinlu@chatlabs.com
10321
- * @Date: 2024-01-03 14:39:09
10322
- * @LastEditors: binruan@chatlabs.com
10323
- * @LastEditTime: 2024-03-25 15:08:11
10324
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\PictureGroup\index.tsx
10325
- */
10326
- const PictureGroup = ({ imgUrls, width, height, rec, index, onReportViewImageEnd, onViewImageStartEvent }) => {
10327
- const { isActive } = useSwiperSlide();
10328
- const { sxpParameter, openHashtag } = useSxpDataSource();
10329
- const [isLoad, setIsLoad] = React.useState(false);
10330
- React.useEffect(() => {
10331
- if (isLoad && isActive) {
10332
- if (openHashtag) {
10333
- onReportViewImageEnd(rec);
10334
- }
10335
- else {
10336
- onViewImageStartEvent(index);
11747
+ const HashTag = createMaterial(HashTagComponent, {
11748
+ displayName: '',
11749
+ icon: '',
11750
+ category: 'base',
11751
+ type: 'HashTag',
11752
+ related: {
11753
+ settingRender,
11754
+ bindableProps: []
11755
+ },
11756
+ defaulSetting: {
11757
+ props: {
11758
+ lineClamp: 1,
11759
+ space: 40,
11760
+ textStyles: {
11761
+ hashTagTitle: {
11762
+ fontSize: 16,
11763
+ color: '#000'
11764
+ },
11765
+ hashTagDesc: {
11766
+ fontSize: 12,
11767
+ textAlign: 'center',
11768
+ color: '#000'
11769
+ },
11770
+ title: {
11771
+ fontSize: 12,
11772
+ color: '#000'
11773
+ },
11774
+ price: {
11775
+ fontSize: 12,
11776
+ fontWeight: 'bold',
11777
+ color: '#000'
11778
+ }
11779
+ },
11780
+ buttonStyle: {
11781
+ backgroundColor: '#000',
11782
+ fontSize: 12,
11783
+ height: 52,
11784
+ fontWeight: 'bold',
11785
+ textAlign: 'center',
11786
+ color: '#fff',
11787
+ borderRadius: 25
10337
11788
  }
10338
11789
  }
10339
- else {
10340
- setIsLoad(true);
10341
- }
10342
- }, [rec, isActive, onReportViewImageEnd, openHashtag, index, onViewImageStartEvent, isLoad]);
10343
- if (!isActive) {
10344
- return React.createElement("img", { src: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, style: { width, height, objectFit: 'cover' } });
10345
- }
10346
- 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) => {
10347
- return (React.createElement(SwiperSlide, { key: url },
10348
- React.createElement(Picture, { src: url, width: width, height: height })));
10349
- })));
10350
- };
10351
- var PictureGroup$1 = React.memo(PictureGroup);
11790
+ },
11791
+ w: 100,
11792
+ h: 40,
11793
+ sort: 2
11794
+ });
10352
11795
 
10353
11796
  /*
10354
11797
  * @Author: binruan@chatlabs.com
10355
- * @Date: 2024-01-15 19:03:09
11798
+ * @Date: 2023-07-25 14:56:49
10356
11799
  * @LastEditors: binruan@chatlabs.com
10357
- * @LastEditTime: 2024-03-25 10:42:07
10358
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Hashtag\index.tsx
11800
+ * @LastEditTime: 2024-03-20 13:46:06
11801
+ * @FilePath: \pb-sxp-ui\src\materials\index.ts
10359
11802
  *
10360
11803
  */
10361
- const Hashtag = ({ tags, itemId, itemType, index, rec }) => {
10362
- const [isShowMore, setIsShowMore] = React.useState(false);
10363
- const { setWaterFallData, setOpenHashtag, setCacheActiveIndex, waterFallData, setIsFromHashtag } = useSxpDataSource();
10364
- const handleClickTag = (data) => {
10365
- if (!waterFallData) {
10366
- setCacheActiveIndex === null || setCacheActiveIndex === void 0 ? void 0 : setCacheActiveIndex(index);
10367
- }
10368
- else {
10369
- setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(true);
10370
- }
10371
- if (itemType) {
10372
- setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
10373
- hashTag: data,
10374
- itemId,
10375
- itemType,
10376
- rec
11804
+
11805
+ var _materials_ = /*#__PURE__*/Object.freeze({
11806
+ __proto__: null,
11807
+ Appoint: Appoint,
11808
+ AppointForm: AppointForm,
11809
+ Commodity: Commodity,
11810
+ CommodityDetail: CommodityDetail,
11811
+ CommodityDetailDiroNew: CommodityDetailDiroNew,
11812
+ CommodityDiro: CommodityDiro,
11813
+ CommodityDiroNew: CommodityDiroNew,
11814
+ HashTag: HashTag,
11815
+ Link: Link,
11816
+ MultiCommodity: MultiCommodity,
11817
+ MultiCommodityDiro: MultiCommodityDiro,
11818
+ MultiCommodityDiroNew: MultiCommodityDiroNew,
11819
+ Prompt: Prompt
11820
+ });
11821
+
11822
+ const defaultUnLikeIconPath = '/pb_static/f71266d2c64446c5ae6a5a7f5489cc0a.png';
11823
+ const defaultLikeIconPath = '/pb_static/f07900fe3f0f4ae188ea1611d4801a44.png';
11824
+ const LikeButton = (_a) => {
11825
+ var { active, activeIcon, unActicveIcon, recData } = _a, props = __rest(_a, ["active", "activeIcon", "unActicveIcon", "recData"]);
11826
+ const { mutateLike, mutateUnlike, bffEventReport } = useSxpDataSource();
11827
+ const [state, setState] = React.useState(active);
11828
+ const likeIcon = useIconLink(defaultLikeIconPath);
11829
+ const unlikeIcon = useIconLink(defaultUnLikeIconPath);
11830
+ const handleClick = lodash.debounce(() => __awaiter(void 0, void 0, void 0, function* () {
11831
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
11832
+ if (state) {
11833
+ // 先设置状态
11834
+ setState(false);
11835
+ 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;
11836
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11837
+ eventInfo: {
11838
+ eventSubject: 'favoriteContentCanceled',
11839
+ eventDescription: 'This content was unfavorite by the user',
11840
+ contentId: (_f = (_e = recData.video) === null || _e === void 0 ? void 0 : _e.itemId) !== null && _f !== void 0 ? _f : '',
11841
+ contentName: (_h = (_g = recData.video) === null || _g === void 0 ? void 0 : _g.title) !== null && _h !== void 0 ? _h : '',
11842
+ contentTags: JSON.stringify((_k = (_j = recData.video) === null || _j === void 0 ? void 0 : _j.tags) !== null && _k !== void 0 ? _k : []),
11843
+ position: recData.position,
11844
+ contentFormat: ((_l = recData.video) === null || _l === void 0 ? void 0 : _l.url) ? 'video' : 'image',
11845
+ traceInfo: (_m = recData.video) === null || _m === void 0 ? void 0 : _m.traceInfo
11846
+ }
10377
11847
  });
11848
+ // 如果接口调用失败,则回滚状态
11849
+ if (!result) {
11850
+ setState(true);
11851
+ }
10378
11852
  }
10379
11853
  else {
10380
- setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
10381
- hashTag: data,
10382
- rec
11854
+ setState(true);
11855
+ const result = (_o = (yield (mutateLike === null || mutateLike === void 0 ? void 0 : mutateLike({ content: JSON.stringify(recData) })))) !== null && _o !== void 0 ? _o : false;
11856
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11857
+ eventInfo: {
11858
+ eventSubject: 'favoriteContent',
11859
+ eventDescription: 'This content was favorite by the user',
11860
+ contentId: (_q = (_p = recData.video) === null || _p === void 0 ? void 0 : _p.itemId) !== null && _q !== void 0 ? _q : '',
11861
+ contentName: (_s = (_r = recData.video) === null || _r === void 0 ? void 0 : _r.title) !== null && _s !== void 0 ? _s : '',
11862
+ contentTags: JSON.stringify((_u = (_t = recData.video) === null || _t === void 0 ? void 0 : _t.tags) !== null && _u !== void 0 ? _u : []),
11863
+ position: recData.position,
11864
+ contentFormat: ((_v = recData.video) === null || _v === void 0 ? void 0 : _v.url) ? 'video' : 'image',
11865
+ traceInfo: (_w = recData.video) === null || _w === void 0 ? void 0 : _w.traceInfo
11866
+ }
10383
11867
  });
11868
+ if (!result) {
11869
+ setState(false);
11870
+ }
10384
11871
  }
10385
- setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(true);
10386
- };
10387
- React.useMemo(() => {
10388
- if (tags.length <= 6) {
10389
- return null;
10390
- }
10391
- return (React.createElement("span", { style: { textDecoration: 'underline', cursor: 'pointer', color: '#fff' }, onClick: () => setIsShowMore(!isShowMore) }, isShowMore ? 'show less' : 'show more'));
10392
- }, [isShowMore, tags]);
10393
- return (React.createElement("div", { className: 'clc-sxp-bottom-hashtag' },
10394
- 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}`))))));
10395
- };
10396
- var Hashtag$1 = React.memo(Hashtag);
10397
-
10398
- /*
10399
- * @Author: binruan@chatlabs.com
10400
- * @Date: 2023-12-26 16:11:34
10401
- * @LastEditors: binruan@chatlabs.com
10402
- * @LastEditTime: 2024-03-04 17:35:19
10403
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Navbar.tsx
10404
- *
10405
- */
10406
- const Navbar = ({ icon, styles, onClose }) => {
10407
- const { waterFallData, setOpenHashtag } = useSxpDataSource();
10408
- return (React.createElement("div", { className: 'clc-sxp-nav', style: styles },
10409
- React.createElement("img", { className: 'clc-sxp-nav-left', src: icon, alt: '', onClick: onClose }),
10410
- React.createElement("div", { className: 'clc-sxp-nav-title' }, `#${waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag}`)));
11872
+ }), 200);
11873
+ return (React.createElement("button", Object.assign({}, props, { onClick: handleClick }),
11874
+ React.createElement("img", { style: { width: '100%', height: '100%', objectFit: 'contain' }, src: state ? activeIcon || likeIcon : unActicveIcon || unlikeIcon, alt: 'icon' })));
10411
11875
  };
10412
- var Navbar$1 = React.memo(Navbar);
11876
+ var LikeButton$1 = React.memo(LikeButton);
10413
11877
 
10414
- 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";
11878
+ const SXP_EVENT_BUS = new EventEmitter();
11879
+ var SXP_EVENT_TYPE;
11880
+ (function (SXP_EVENT_TYPE) {
11881
+ SXP_EVENT_TYPE["PAGE_DID_SHOW"] = "pageDidShow";
11882
+ SXP_EVENT_TYPE["PAGE_DID_HIDE"] = "pageDidHide";
11883
+ })(SXP_EVENT_TYPE || (SXP_EVENT_TYPE = {}));
10415
11884
 
10416
- function withBindDataSource(Component) {
10417
- // 处理函数事件中的数据源
10418
- return React.memo(function (props) {
10419
- const { $store } = useDataSource();
10420
- const handleDataSourceByEvent = (value) => {
10421
- let res = value;
10422
- const dataArr = value.match(/{{.*?}}/g);
10423
- if (dataArr === null || dataArr === void 0 ? void 0 : dataArr.length) {
10424
- dataArr.forEach((item) => {
10425
- item.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
10426
- if (p) {
10427
- const v = lodash.get($store, p);
10428
- res = res.replace(item, v);
10429
- return v;
10430
- }
10431
- });
10432
- });
10433
- }
10434
- return res;
10435
- };
10436
- const clonedProps = React.useMemo(() => {
10437
- var _a, _b, _c;
10438
- const { bindDatas } = props, cloneProps = __rest(props, ["bindDatas"]);
10439
- (_a = bindDatas === null || bindDatas === void 0 ? void 0 : bindDatas.forEach) === null || _a === void 0 ? void 0 : _a.call(bindDatas, (d) => {
10440
- if ((d === null || d === void 0 ? void 0 : d.propKey) && (d === null || d === void 0 ? void 0 : d.dataPath)) {
10441
- const { propKey, dataPath } = d;
10442
- dataPath.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
10443
- var _a, _b;
10444
- if (p) {
10445
- const v = (_b = (_a = lodash.get($store, p)) !== null && _a !== void 0 ? _a : props[propKey]) !== null && _b !== void 0 ? _b : '';
10446
- cloneProps[propKey] = v;
10447
- return v;
10448
- }
10449
- });
11885
+ const VideoWidget = ({ rec, index, height, data, muted, activeIndex }) => {
11886
+ const [isPauseVideo, setIsPauseVideo] = React.useState(false);
11887
+ const videoRef = React.useRef(null);
11888
+ const { bffEventReport, sxpParameter, waterFallData, openHashtag } = useSxpDataSource();
11889
+ const videoStartTime = React.useRef(0);
11890
+ const [isLoad, setIsLoad] = React.useState(false);
11891
+ const { isActive } = useSwiperSlide();
11892
+ React.useEffect(() => {
11893
+ if (!videoRef.current)
11894
+ return;
11895
+ videoRef.current.muted = muted;
11896
+ }, [muted]);
11897
+ const handleVideoStart = React.useCallback(() => {
11898
+ var _a, _b;
11899
+ 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)
11900
+ return;
11901
+ (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
11902
+ }, []);
11903
+ const PAUSE_ICON = useIconLink('/pb_static/06f28a2025c74c1cb49be6767316d827.png');
11904
+ const handlePlaying = React.useCallback(() => {
11905
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
11906
+ setIsPauseVideo(false);
11907
+ const item = data[index];
11908
+ if (item && isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
11909
+ videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
11910
+ const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
11911
+ const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
11912
+ const playType = '1';
11913
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11914
+ eventInfo: {
11915
+ eventSubject: 'playVideo',
11916
+ eventDescription: 'User played the video',
11917
+ contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
11918
+ contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
11919
+ playType,
11920
+ startTime: videoCurrentTime,
11921
+ videoDuration,
11922
+ contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
11923
+ position: item.position,
11924
+ contentFormat: 'video',
11925
+ traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
10450
11926
  }
10451
11927
  });
10452
- if (cloneProps) {
10453
- cloneProps.eventMap = {};
10454
- const eventObj = lodash.cloneDeep(cloneProps.event) || {};
10455
- for (const key in eventObj) {
10456
- if (Object.prototype.hasOwnProperty.call(eventObj, key)) {
10457
- try {
10458
- eventObj[key].value = handleDataSourceByEvent(eventObj[key].value);
10459
- cloneProps.eventMap[key] = new Function(eventObj[key].value);
10460
- }
10461
- catch (error) { }
10462
- }
10463
- }
10464
- }
10465
- 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) {
10466
- cloneProps.style.cursor = 'pointer';
10467
- }
10468
- return cloneProps;
10469
- }, [$store, props]);
10470
- return React.createElement(Component, Object.assign({}, clonedProps, clonedProps.eventMap));
10471
- });
10472
- }
10473
-
10474
- /*
10475
- * @Author: binruan@chatlabs.com
10476
- * @Date: 2023-12-26 16:11:34
10477
- * @LastEditors: binruan@chatlabs.com
10478
- * @LastEditTime: 2024-03-04 14:25:27
10479
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\RenderCard.tsx
10480
- *
10481
- */
10482
- const RenderCard = ({ rec, index, tempMap, resolver }) => {
10483
- const { schema } = useEditor();
10484
- const renderComp = React.useMemo(() => {
10485
- 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;
10486
- if (!(rec === null || rec === void 0 ? void 0 : rec.video))
10487
- return null;
10488
- let cta = null;
10489
- 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) {
10490
- cta = '多商品CTA';
10491
- }
10492
- else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.bindProduct) {
10493
- cta = '商品CTA';
10494
- }
10495
- else {
10496
- 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;
10497
- }
10498
- const value = tempMap === null || tempMap === void 0 ? void 0 : tempMap[cta];
10499
- 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)) ||
10500
- (((_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)) ||
10501
- (((_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)) ||
10502
- (((_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)) ||
10503
- (((_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)) ||
10504
- (((_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))) {
10505
- return null;
10506
11928
  }
10507
- if (value && resolver) {
10508
- const Component = withBindDataSource(resolver[(_w = value === null || value === void 0 ? void 0 : value.item) === null || _w === void 0 ? void 0 : _w.type]);
10509
- 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 })));
10510
- }
10511
- else {
10512
- return null;
10513
- }
10514
- }, [rec, resolver, tempMap, schema]);
10515
- return React.createElement(React.Fragment, null, renderComp);
10516
- };
10517
- var RenderCard$1 = React.memo(RenderCard);
10518
-
10519
- const WaterfallFlowItem = (props) => {
10520
- const { rec, index, list, reportTagsView } = props;
10521
- const { swiperRef, setRtcList, setOpenHashtag, bffEventReport, sxpParameter } = useSxpDataSource();
10522
- const [showVideo, setShowVideo] = React.useState(false);
10523
- const imgDom = React.useRef(null);
10524
- const videoDom = React.useRef(null);
10525
- const canvasRef = React.useRef(null);
10526
- const [firstFrameSrc, setFirstFrameSrc] = React.useState('');
10527
- const src = React.useMemo(() => {
10528
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
10529
- if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.cover) {
10530
- return (_b = rec === null || rec === void 0 ? void 0 : rec.video) === null || _b === void 0 ? void 0 : _b.cover;
11929
+ if (!isLoad) {
11930
+ setIsLoad(true);
10531
11931
  }
10532
- else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.url) {
10533
- setShowVideo(true);
10534
- return (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.url;
11932
+ }, [bffEventReport, data, index, isLoad]);
11933
+ const handleLoadedMetadata = React.useCallback(() => {
11934
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
11935
+ const item = data[index];
11936
+ if (item && !isLoad && ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.duration)) {
11937
+ videoStartTime.current = ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.currentTime) || 0;
11938
+ const videoDuration = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.duration) !== null && _d !== void 0 ? _d : 0).toFixed(2);
11939
+ const videoCurrentTime = ((_f = (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.currentTime) !== null && _f !== void 0 ? _f : 0).toFixed(2);
11940
+ const playType = '0';
11941
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
11942
+ eventInfo: {
11943
+ eventSubject: 'playVideo',
11944
+ eventDescription: 'User played the video',
11945
+ contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
11946
+ contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
11947
+ playType,
11948
+ startTime: videoCurrentTime,
11949
+ videoDuration,
11950
+ contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
11951
+ position: item.position,
11952
+ contentFormat: 'video',
11953
+ traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
11954
+ }
11955
+ });
10535
11956
  }
10536
- 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) {
10537
- 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];
11957
+ setTimeout(() => {
11958
+ var _a, _b;
11959
+ 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)
11960
+ return;
11961
+ (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.play();
11962
+ }, 0);
11963
+ }, [index, bffEventReport, data, isLoad]);
11964
+ const handleClickVideo = React.useCallback((type) => () => {
11965
+ var _a, _b, _c, _d, _e, _f;
11966
+ 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)
11967
+ return;
11968
+ if (!isLoad)
11969
+ return;
11970
+ const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
11971
+ switch (type) {
11972
+ case 'start':
11973
+ if (!isPause)
11974
+ return;
11975
+ (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.play();
11976
+ setIsPauseVideo(false);
11977
+ break;
11978
+ case 'pause':
11979
+ if (isPause)
11980
+ return;
11981
+ (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.pause();
11982
+ setIsPauseVideo(true);
11983
+ break;
11984
+ default:
11985
+ if (isPause) {
11986
+ (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.play();
11987
+ }
11988
+ else {
11989
+ (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.pause();
11990
+ }
11991
+ setIsPauseVideo(!isPause);
11992
+ break;
10538
11993
  }
10539
- 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) {
10540
- 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];
11994
+ }, [data, index, isLoad]);
11995
+ const onPause = React.useCallback(() => {
11996
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
11997
+ const item = data[index];
11998
+ const videoDuration = ((_b = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.duration) !== null && _b !== void 0 ? _b : 0).toFixed(2);
11999
+ const videoCurrentTime = ((_d = (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.currentTime) !== null && _d !== void 0 ? _d : 0).toFixed(2);
12000
+ if ((_e = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _e === void 0 ? void 0 : _e.duration) {
12001
+ const playDuration = (((_f = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _f === void 0 ? void 0 : _f.currentTime) - videoStartTime.current).toFixed(2);
12002
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
12003
+ eventInfo: {
12004
+ eventSubject: 'playOverVideo',
12005
+ eventDescription: 'User finished playing the video',
12006
+ contentId: (_h = (_g = item.video) === null || _g === void 0 ? void 0 : _g.itemId) !== null && _h !== void 0 ? _h : '',
12007
+ contentName: (_k = (_j = item.video) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : '',
12008
+ endTime: videoCurrentTime,
12009
+ videoDuration,
12010
+ playDuration,
12011
+ contentTags: JSON.stringify((_m = (_l = item.video) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []),
12012
+ position: item.position,
12013
+ contentFormat: 'video',
12014
+ traceInfo: (_o = item.video) === null || _o === void 0 ? void 0 : _o.traceInfo
12015
+ }
12016
+ });
10541
12017
  }
10542
- else {
10543
- return (sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image) || '';
12018
+ }, [data, index, bffEventReport]);
12019
+ React.useEffect(() => {
12020
+ var _a, _b, _c, _d, _e, _f;
12021
+ if (data.length <= 0)
12022
+ return;
12023
+ if (!videoRef.current)
12024
+ return;
12025
+ const isPause = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.paused;
12026
+ setIsPauseVideo(false);
12027
+ if (!isActive) {
12028
+ if (!isPause && ((_b = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _b === void 0 ? void 0 : _b.readyState) >= 2)
12029
+ (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
12030
+ return;
10544
12031
  }
10545
- }, [rec, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.bottom_image]);
10546
- const title = React.useMemo(() => {
10547
- var _a, _b;
10548
- 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;
10549
- }, [rec]);
10550
- const priceText = React.useMemo(() => {
10551
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
10552
- 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)) {
10553
- 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', {
10554
- minimumFractionDigits: 0
10555
- })) !== null && _j !== void 0 ? _j : ''}`;
12032
+ if (!videoRef.current.src) {
12033
+ const videoSrc = rec.video.url;
12034
+ // if (videoSrc.includes('.m3u8')) {
12035
+ // if (Hls.isSupported()) {
12036
+ // const hls = new Hls();
12037
+ // hls.loadSource(videoSrc);
12038
+ // hls.attachMedia(videoRef.current);
12039
+ // } else if (videoRef.current.canPlayType('application/vnd.apple.mpegurl')) {
12040
+ // videoRef.current.src = videoSrc;
12041
+ // } else {
12042
+ // videoRef.current.src = videoSrc;
12043
+ // }
12044
+ // } else {
12045
+ // videoRef.current.src = videoSrc;
12046
+ // }
12047
+ videoRef.current.src = videoSrc;
12048
+ videoRef.current.setAttribute('x5-playsinline', 'true');
12049
+ videoRef.current.setAttribute('webkit-playsinline', 'true');
10556
12050
  }
10557
12051
  else {
10558
- return null;
12052
+ if (((_d = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _d === void 0 ? void 0 : _d.readyState) < 2)
12053
+ return;
12054
+ videoRef.current.play();
10559
12055
  }
10560
- }, [rec]);
10561
- // useEffect(() => {
10562
- // if (imgDom.current === null || src === '') {
10563
- // return;
10564
- // }
10565
- // const img = new Image();
10566
- // if (showVideo && firstFrameSrc) {
10567
- // img.src = firstFrameSrc;
10568
- // } else {
10569
- // img.src = src;
10570
- // }
10571
- // // img.onload = () => {
10572
- // // setIsLoading(true);
10573
- // // };
10574
- // imgDom.current.src = img.src;
10575
- // }, [src, showVideo, firstFrameSrc]);
10576
- React.useEffect(() => {
10577
- const observer = new IntersectionObserver((entries) => {
10578
- entries.forEach((entry) => {
10579
- if (entry.isIntersecting) {
10580
- if (imgDom.current === null || src === '') {
10581
- return;
10582
- }
10583
- if (showVideo && firstFrameSrc) {
10584
- imgDom.current.src = firstFrameSrc;
10585
- }
10586
- else {
10587
- imgDom.current.src = src;
10588
- }
10589
- observer.unobserve(imgDom.current);
10590
- }
10591
- });
10592
- });
10593
- observer.observe(imgDom.current);
12056
+ (_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener('canplay', handleLoadedMetadata);
12057
+ (_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.addEventListener('playing', handlePlaying);
10594
12058
  return () => {
10595
- observer.disconnect();
12059
+ var _a, _b;
12060
+ (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('canplay', handleLoadedMetadata);
12061
+ (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener('playing', handlePlaying);
10596
12062
  };
10597
- }, [src, showVideo, firstFrameSrc]);
10598
- const calculateHeightForWidth = (videoWidth, videoHeight, targetWidth) => {
10599
- const aspectRatio = videoWidth / videoHeight;
10600
- const targetHeight = targetWidth / aspectRatio;
10601
- return targetHeight;
10602
- };
12063
+ }, [data, handleLoadedMetadata, handlePlaying, isActive, isLoad, rec.video]);
12064
+ /*
12065
+ 打开/关闭hashtag暂停/播放视频
12066
+ */
10603
12067
  React.useEffect(() => {
10604
- const video = videoDom === null || videoDom === void 0 ? void 0 : videoDom.current;
10605
- if (video === null || src === '' || !showVideo) {
12068
+ var _a, _b, _c, _d;
12069
+ 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)
12070
+ return;
12071
+ const isPause = (_b = videoRef.current) === null || _b === void 0 ? void 0 : _b.paused;
12072
+ if (!isActive)
10606
12073
  return;
12074
+ if (!isPause && openHashtag) {
12075
+ (_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.pause();
10607
12076
  }
10608
- video.src = src;
10609
- video.currentTime = 1;
10610
- video.crossOrigin = 'anonymous';
10611
- video.onloadeddata = () => {
10612
- const canvas = canvasRef === null || canvasRef === void 0 ? void 0 : canvasRef.current;
10613
- if (!canvas)
10614
- return;
10615
- const ctx = canvas.getContext('2d');
10616
- const targetWidth = (window === null || window === void 0 ? void 0 : window.innerWidth) / 2;
10617
- const targetHeight = calculateHeightForWidth(video.videoWidth, video.videoHeight, targetWidth);
10618
- canvas.height = targetHeight;
10619
- canvas.width = targetWidth;
10620
- ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
10621
- setFirstFrameSrc(canvas.toDataURL());
10622
- video.remove();
10623
- canvas.remove();
12077
+ else if (!openHashtag) {
12078
+ (_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.play();
12079
+ }
12080
+ }, [openHashtag, isActive]);
12081
+ React.useEffect(() => {
12082
+ if (!isActive)
12083
+ return;
12084
+ const onShow = handleClickVideo('start');
12085
+ const onHide = handleClickVideo('pause');
12086
+ SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
12087
+ SXP_EVENT_BUS.on(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
12088
+ return () => {
12089
+ SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_SHOW, onShow);
12090
+ SXP_EVENT_BUS.off(SXP_EVENT_TYPE.PAGE_DID_HIDE, onHide);
10624
12091
  };
10625
- }, [src, showVideo]);
10626
- const handleClickToDetail = () => {
10627
- reportTagsView();
10628
- setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(list);
10629
- setTimeout(() => {
10630
- var _a;
10631
- (_a = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _a === void 0 ? void 0 : _a.swiper.slideTo(index, 0, false);
10632
- setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
10633
- }, 0);
12092
+ }, [handleClickVideo, isActive]);
12093
+ const renderPoster = React.useMemo(() => {
12094
+ if (!(sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image)) {
12095
+ return null;
12096
+ }
12097
+ 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 }));
12098
+ }, [isLoad, sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image]);
12099
+ React.useEffect(() => {
12100
+ const handleBeforeUnload = () => {
12101
+ var _a, _b;
12102
+ 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) {
12103
+ handleClickVideo('pause')();
12104
+ }
12105
+ };
12106
+ window.addEventListener('beforeunload', handleBeforeUnload);
12107
+ return () => {
12108
+ window.removeEventListener('beforeunload', handleBeforeUnload);
12109
+ };
12110
+ }, [activeIndex, index, rec, videoRef, handleClickVideo, isPauseVideo]);
12111
+ if (!rec.video) {
12112
+ return null;
12113
+ }
12114
+ return (React.createElement("div", { className: 'video-container', key: rec.video.itemId, onClick: handleClickVideo(), style: {
12115
+ position: 'relative',
12116
+ width: '100%',
12117
+ height
12118
+ } },
12119
+ 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 }),
12120
+ renderPoster,
12121
+ React.createElement("img", { hidden: !isPauseVideo, className: 'clc-pb-video-pause', src: PAUSE_ICON })));
12122
+ };
12123
+ var VideoWidget$1 = React.memo(VideoWidget);
12124
+
12125
+ /*
12126
+ * @Author: binruan@chatlabs.com
12127
+ * @Date: 2023-12-27 19:02:59
12128
+ * @LastEditors: binruan@chatlabs.com
12129
+ * @LastEditTime: 2024-01-24 10:30:13
12130
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\ToggleButton\index.tsx
12131
+ *
12132
+ */
12133
+ const ToggleButton = ({ defaultValue, activeIcon, unactiveIcon, onChange, style }) => {
12134
+ const [isTrue, setIsTure] = React.useState(defaultValue);
12135
+ const handleClick = (e) => {
12136
+ e.stopPropagation();
12137
+ const result = !isTrue;
12138
+ setIsTure(result);
12139
+ onChange === null || onChange === void 0 ? void 0 : onChange(result);
10634
12140
  };
10635
- return (React.createElement("div", { className: 'list-content-listItem', key: index, onClick: handleClickToDetail },
10636
- React.createElement("div", { className: 'list-content-listItem-picture' },
10637
- showVideo && (React.createElement("div", { style: { display: 'none' } },
10638
- React.createElement("video", { ref: videoDom, crossOrigin: 'anonymous', className: 'list-content-listItem-picture-img' }),
10639
- React.createElement("canvas", { ref: canvasRef }))),
10640
- React.createElement("img", { className: 'list-content-listItem-picture-img', loading: 'lazy', ref: imgDom })),
10641
- React.createElement("div", { className: 'list-content-listItem-info' },
10642
- React.createElement("div", { className: `${'list-content-listItem-info-title'} ${priceText ? 'list-content-listItem-info-nowrap' : ''}` }, title && title),
10643
- React.createElement("div", { className: 'list-content-listItem-info-price', hidden: !priceText }, priceText))));
12141
+ return (React.createElement("button", { style: style, className: 'pb-toggle-button', onClick: handleClick },
12142
+ React.createElement("img", { className: 'pb-toggle-button-icon', src: isTrue ? activeIcon : unactiveIcon })));
10644
12143
  };
10645
- function WaterfallList({ reportTagsView }) {
10646
- var _a, _b, _c, _d, _e, _f;
10647
- const { waterFallData, getRecommendVideos, hashTagSize, loadingImage } = useSxpDataSource();
10648
- const [list, setList] = React.useState();
10649
- const [data, setData] = React.useState();
10650
- const [isLoadingData, setIsLoadingData] = React.useState(false);
10651
- const containerRef = React.useRef(null);
10652
- const [isLoadMore, setIsLoadMore] = React.useState(false);
10653
- React.useCallback(() => {
10654
- if (isLoadMore)
10655
- return;
10656
- setIsLoadMore(true);
10657
- waterFallData &&
10658
- (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
10659
- hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
10660
- 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
10661
- 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType
10662
- }).then((res) => {
10663
- var _a;
10664
- 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 : []));
10665
- setIsLoadMore(false);
10666
- }));
10667
- }, [waterFallData, getRecommendVideos, list, isLoadMore]);
12144
+ var ToggleButton$1 = React.memo(ToggleButton);
12145
+
12146
+ /*
12147
+ * @Author: binruan@chatlabs.com
12148
+ * @Date: 2024-01-15 19:03:09
12149
+ * @LastEditors: binruan@chatlabs.com
12150
+ * @LastEditTime: 2024-03-13 10:53:56
12151
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\FingerSwipeTip\index.tsx
12152
+ *
12153
+ */
12154
+ const FingerSwipeTip = ({ imageUrl }) => {
12155
+ const [show, setShow] = React.useState(true);
12156
+ useEditor();
10668
12157
  React.useEffect(() => {
10669
- setIsLoadingData(true);
10670
- waterFallData &&
10671
- (getRecommendVideos === null || getRecommendVideos === void 0 ? void 0 : getRecommendVideos({
10672
- hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag,
10673
- 'itemFilter.itemId': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemId,
10674
- 'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType,
10675
- defaultSize: hashTagSize
10676
- }).then((res) => {
10677
- var _a, _b;
10678
- setData(res);
10679
- 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 : []);
10680
- setIsLoadingData(false);
10681
- }));
10682
- }, [waterFallData, getRecommendVideos, hashTagSize]);
10683
- // useEffect(() => {
10684
- // const container = containerRef?.current;
10685
- // if (!container) return;
10686
- // const handleScroll = () => {
10687
- // const top = (container as any)?.scrollTop;
10688
- // const clientHeight = (container as any)?.clientHeight;
10689
- // const scrollHeight = (container as any)?.scrollHeight;
10690
- // if (scrollHeight <= top + clientHeight && !isLoadingData) {
10691
- // loadMoreData();
10692
- // }
10693
- // };
10694
- // container?.addEventListener('scroll', handleScroll);
10695
- // return () => {
10696
- // container?.removeEventListener('scroll', handleScroll); // 在组件卸载时移除事件监听器
10697
- // };
10698
- // }, [isLoadingData, containerRef, loadMoreData]);
10699
- const handleClickLink = () => {
10700
- var _a, _b;
10701
- if ((_a = data === null || data === void 0 ? void 0 : data.tag) === null || _a === void 0 ? void 0 : _a.link) {
10702
- reportTagsView();
10703
- window.location.href = (_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.link;
10704
- }
10705
- };
10706
- return (React.createElement(React.Fragment, null, isLoadingData ? (React.createElement("div", { style: { height: '100%', width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' } },
10707
- React.createElement("img", { width: 64, height: 64, src: loadingImage, alt: 'loading...', style: { objectFit: 'contain' } }))) : (React.createElement("div", { className: 'list' },
10708
- React.createElement("div", { className: 'list-scroll', ref: containerRef, style: {
10709
- bottom: ((_a = data === null || data === void 0 ? void 0 : data.tag) === null || _a === void 0 ? void 0 : _a.link) ? '100px' : 0
10710
- } },
10711
- React.createElement("div", { className: 'list-info' }, (_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.info),
10712
- 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'),
10713
- React.createElement("div", { className: 'list-content' }, list === null || list === void 0 ? void 0 : list.map((item, ind) => {
10714
- return (React.createElement(WaterfallFlowItem, { key: ind, index: ind, rec: item, list: list, reportTagsView: reportTagsView }));
10715
- })),
10716
- React.createElement("div", { hidden: !isLoadMore, style: { textAlign: 'center' } }, "loading...")),
10717
- 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) },
10718
- 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'))))));
10719
- }
12158
+ setTimeout(() => {
12159
+ setShow(false);
12160
+ }, 2000);
12161
+ }, []);
12162
+ const FINGER_SWIPE_ICON = useIconLink('/pb_static/finger-swipe-tip.29dc3a48a3c746c906ea..png');
12163
+ const animationCls = React.useMemo(() => {
12164
+ return show ? 'pb-fadeIn' : 'pb-fadeOut';
12165
+ }, [show]);
12166
+ return (React.createElement("div", { hidden: !show, className: `pb-finger-wrap ${animationCls}` },
12167
+ React.createElement("img", { src: imageUrl || FINGER_SWIPE_ICON })));
12168
+ };
12169
+
12170
+ const Picture = (props) => {
12171
+ const { src, height, width } = props;
12172
+ const imgDom = React.useRef(null);
12173
+ const { sxpParameter } = useSxpDataSource();
12174
+ return (React.createElement("div", { style: {
12175
+ overflow: 'hidden',
12176
+ height,
12177
+ width: '100%',
12178
+ position: 'relative'
12179
+ } },
12180
+ 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: {
12181
+ height: '100%',
12182
+ width: '100%',
12183
+ objectFit: 'cover'
12184
+ } })));
12185
+ };
10720
12186
 
10721
- var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAaZJREFUeF7t2jFKBEEQRuG3mSJeQTARURDMTL2EqXfwAnoKD6FHMDEzNVIw2tzQC2gFggyDrExX1V92T7wz9PumFnqbXdH5teq8nwEwJqBzgfEVKDYAW8Ae8NZq3ZUm4Aa4AnaBR+C8BUIVAIu/ngSfAs9LESoAWLgB/LzWwP7SeLtfHWAu3tZ9Adz/dwD3eOUJCIlXBQiLVwQIjVcDCI9XAkiJVwFIi1cASI3PBpjb3jbd5GyyUcraCUrEZ02ATHwGgFR8NIBcfCSAZHwUgGx8BIB0vDeAfLwnQIl4L4Ay8R4ApeJbA2wD78DOZA/e7ABzk739Xz/T8rfAIfA6WYCd3BqA7NUSwCKfgLNKCK0BjoC7rzP74yoIrQGsuxSCB0ApBC+AMgieACUQvAHkESIApBGiAGQRIgEkEaIB5BAyAKQQsgBkEDIBJBCyAdIRFABSEVQA0hCUAFIQ1ADCERQBQhFUAcIQlAFCENQBfkOwg9eXpeftFQDmEOzv8ifARy8A3wiXwAHwANwujbf7q0xAi9bZZwwAN9oiDx4TUORFuS2z+wn4BAiAaEHnKChjAAAAAElFTkSuQmCC";
12187
+ /*
12188
+ * @Author: lewinlu@chatlabs.com
12189
+ * @Date: 2024-01-03 14:39:09
12190
+ * @LastEditors: binruan@chatlabs.com
12191
+ * @LastEditTime: 2024-03-25 15:08:11
12192
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\PictureGroup\index.tsx
12193
+ */
12194
+ const PictureGroup = ({ imgUrls, width, height, rec, index, onReportViewImageEnd, onViewImageStartEvent }) => {
12195
+ const { isActive } = useSwiperSlide();
12196
+ const { sxpParameter, openHashtag } = useSxpDataSource();
12197
+ const [isLoad, setIsLoad] = React.useState(false);
12198
+ React.useEffect(() => {
12199
+ if (isLoad && isActive) {
12200
+ if (openHashtag) {
12201
+ onReportViewImageEnd(rec);
12202
+ }
12203
+ else {
12204
+ onViewImageStartEvent(index);
12205
+ }
12206
+ }
12207
+ else {
12208
+ setIsLoad(true);
12209
+ }
12210
+ }, [rec, isActive, onReportViewImageEnd, openHashtag, index, onViewImageStartEvent, isLoad]);
12211
+ if (!isActive) {
12212
+ return React.createElement("img", { src: sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image, style: { width, height, objectFit: 'cover' } });
12213
+ }
12214
+ 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) => {
12215
+ return (React.createElement(SwiperSlide, { key: url },
12216
+ React.createElement(Picture, { src: url, width: width, height: height })));
12217
+ })));
12218
+ };
12219
+ var PictureGroup$1 = React.memo(PictureGroup);
10722
12220
 
10723
12221
  /*
10724
12222
  * @Author: binruan@chatlabs.com
10725
- * @Date: 2024-01-10 10:58:24
12223
+ * @Date: 2024-01-15 19:03:09
10726
12224
  * @LastEditors: binruan@chatlabs.com
10727
- * @LastEditTime: 2024-03-12 14:53:22
10728
- * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\WaterFall\index.tsx
12225
+ * @LastEditTime: 2024-04-03 14:51:17
12226
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Hashtag\index.tsx
10729
12227
  *
10730
12228
  */
10731
- const WaterFall = () => {
10732
- const { waterFallData, setOpenHashtag, openHashtag, swiperRef, setWaterFallData, cacheRtcList, setRtcList, cacheActiveIndex, rtcList, setCacheRtcList, setIsFromHashtag, isFromHashtag, bffEventReport } = useSxpDataSource();
10733
- React.useRef(null);
10734
- const modalEleRef = React.useRef(null);
10735
- const [viewTime, setViewTime] = React.useState();
10736
- React.useEffect(() => {
10737
- const parentNode = document.getElementById('sxp-render');
10738
- const node = document.getElementById('water-fall');
10739
- if (node) {
10740
- modalEleRef.current = node;
12229
+ const Hashtag = ({ tags, itemId, itemType, index, rec, hashTagStyle }) => {
12230
+ const [isShowMore, setIsShowMore] = React.useState(false);
12231
+ const { setWaterFallData, setOpenHashtag, setCacheActiveIndex, waterFallData, setIsFromHashtag } = useSxpDataSource();
12232
+ const handleClickTag = (data) => {
12233
+ if (!waterFallData) {
12234
+ setCacheActiveIndex === null || setCacheActiveIndex === void 0 ? void 0 : setCacheActiveIndex(index);
10741
12235
  }
10742
12236
  else {
10743
- modalEleRef.current = document.createElement('div');
10744
- modalEleRef.current.setAttribute('id', 'water-fall');
10745
- parentNode === null || parentNode === void 0 ? void 0 : parentNode.appendChild(modalEleRef.current);
12237
+ setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(true);
10746
12238
  }
10747
- }, []);
10748
- const handleClose = () => {
10749
- const isEq = lodash.isEqual(rtcList, cacheRtcList);
10750
- if (!isEq && cacheRtcList && (cacheRtcList === null || cacheRtcList === void 0 ? void 0 : cacheRtcList.length)) {
10751
- setRtcList === null || setRtcList === void 0 ? void 0 : setRtcList(cacheRtcList);
12239
+ if (itemType) {
12240
+ setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
12241
+ hashTag: data,
12242
+ itemId,
12243
+ itemType,
12244
+ rec
12245
+ });
10752
12246
  }
10753
- reportTagsView();
10754
- setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData(undefined);
10755
- setIsFromHashtag === null || setIsFromHashtag === void 0 ? void 0 : setIsFromHashtag(false);
10756
- setTimeout(() => {
10757
- var _a, _b;
10758
- if (!isEq) {
10759
- (_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);
10760
- }
10761
- setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(false);
10762
- }, 0);
12247
+ else {
12248
+ setWaterFallData === null || setWaterFallData === void 0 ? void 0 : setWaterFallData({
12249
+ hashTag: data,
12250
+ rec
12251
+ });
12252
+ }
12253
+ setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(true);
10763
12254
  };
10764
- const [recData, setRecData] = React.useState();
10765
- React.useEffect(() => {
10766
- if (waterFallData) {
10767
- setRecData(waterFallData);
12255
+ React.useMemo(() => {
12256
+ if (tags.length <= 6) {
12257
+ return null;
10768
12258
  }
10769
- }, [waterFallData]);
10770
- const reportTagsView = React.useCallback(() => {
10771
- var _a, _b, _c, _d, _e, _f;
10772
- const rec = recData === null || recData === void 0 ? void 0 : recData.rec;
10773
- if (!rec)
10774
- return;
10775
- let fromKName = '';
10776
- if (isFromHashtag) {
10777
- fromKName = 'hashTagPage';
12259
+ return (React.createElement("span", { style: { textDecoration: 'underline', cursor: 'pointer', color: '#fff' }, onClick: () => setIsShowMore(!isShowMore) }, isShowMore ? 'show less' : 'show more'));
12260
+ }, [isShowMore, tags]);
12261
+ return (React.createElement("div", { className: 'clc-sxp-bottom-hashtag' },
12262
+ 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}`))))));
12263
+ };
12264
+ var Hashtag$1 = React.memo(Hashtag);
12265
+
12266
+ 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";
12267
+
12268
+ function withBindDataSource(Component) {
12269
+ // 处理函数事件中的数据源
12270
+ return React.memo(function (props) {
12271
+ const { $store } = useDataSource();
12272
+ const handleDataSourceByEvent = (value) => {
12273
+ let res = value;
12274
+ const dataArr = value.match(/{{.*?}}/g);
12275
+ if (dataArr === null || dataArr === void 0 ? void 0 : dataArr.length) {
12276
+ dataArr.forEach((item) => {
12277
+ item.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
12278
+ if (p) {
12279
+ const v = lodash.get($store, p);
12280
+ res = res.replace(item, v);
12281
+ return v;
12282
+ }
12283
+ });
12284
+ });
12285
+ }
12286
+ return res;
12287
+ };
12288
+ const clonedProps = React.useMemo(() => {
12289
+ var _a, _b, _c;
12290
+ const { bindDatas } = props, cloneProps = __rest(props, ["bindDatas"]);
12291
+ (_a = bindDatas === null || bindDatas === void 0 ? void 0 : bindDatas.forEach) === null || _a === void 0 ? void 0 : _a.call(bindDatas, (d) => {
12292
+ if ((d === null || d === void 0 ? void 0 : d.propKey) && (d === null || d === void 0 ? void 0 : d.dataPath)) {
12293
+ const { propKey, dataPath } = d;
12294
+ dataPath.replace(/{{\s*([\w.]+)\s*}}/g, (match, p) => {
12295
+ var _a, _b;
12296
+ if (p) {
12297
+ const v = (_b = (_a = lodash.get($store, p)) !== null && _a !== void 0 ? _a : props[propKey]) !== null && _b !== void 0 ? _b : '';
12298
+ cloneProps[propKey] = v;
12299
+ return v;
12300
+ }
12301
+ });
12302
+ }
12303
+ });
12304
+ if (cloneProps) {
12305
+ cloneProps.eventMap = {};
12306
+ const eventObj = lodash.cloneDeep(cloneProps.event) || {};
12307
+ for (const key in eventObj) {
12308
+ if (Object.prototype.hasOwnProperty.call(eventObj, key)) {
12309
+ try {
12310
+ eventObj[key].value = handleDataSourceByEvent(eventObj[key].value);
12311
+ cloneProps.eventMap[key] = new Function(eventObj[key].value);
12312
+ }
12313
+ catch (error) { }
12314
+ }
12315
+ }
12316
+ }
12317
+ 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) {
12318
+ cloneProps.style.cursor = 'pointer';
12319
+ }
12320
+ return cloneProps;
12321
+ }, [$store, props]);
12322
+ return React.createElement(Component, Object.assign({}, clonedProps, clonedProps.eventMap));
12323
+ });
12324
+ }
12325
+
12326
+ /*
12327
+ * @Author: binruan@chatlabs.com
12328
+ * @Date: 2023-12-26 16:11:34
12329
+ * @LastEditors: binruan@chatlabs.com
12330
+ * @LastEditTime: 2024-03-04 14:25:27
12331
+ * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\RenderCard.tsx
12332
+ *
12333
+ */
12334
+ const RenderCard = ({ rec, index, tempMap, resolver }) => {
12335
+ const { schema } = useEditor();
12336
+ const renderComp = React.useMemo(() => {
12337
+ 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;
12338
+ if (!(rec === null || rec === void 0 ? void 0 : rec.video))
12339
+ return null;
12340
+ let cta = null;
12341
+ 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) {
12342
+ cta = '多商品CTA';
10778
12343
  }
10779
- else if ((_a = rec === null || rec === void 0 ? void 0 : rec.video) === null || _a === void 0 ? void 0 : _a.url) {
10780
- fromKName = 'videoPage';
12344
+ else if ((_c = rec === null || rec === void 0 ? void 0 : rec.video) === null || _c === void 0 ? void 0 : _c.bindProduct) {
12345
+ cta = '商品CTA';
10781
12346
  }
10782
- 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) {
10783
- fromKName = 'imagePage';
12347
+ else {
12348
+ 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;
10784
12349
  }
10785
- bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
10786
- eventInfo: {
10787
- relatedContentId: (_d = rec === null || rec === void 0 ? void 0 : rec.video) === null || _d === void 0 ? void 0 : _d.itemId,
10788
- position: rec === null || rec === void 0 ? void 0 : rec.position,
10789
- contentTags: JSON.stringify((_e = rec === null || rec === void 0 ? void 0 : rec.video) === null || _e === void 0 ? void 0 : _e.tags),
10790
- traceInfo: JSON.stringify((_f = rec === null || rec === void 0 ? void 0 : rec.video) === null || _f === void 0 ? void 0 : _f.traceInfo),
10791
- hashTags: JSON.stringify([recData === null || recData === void 0 ? void 0 : recData.hashTag]),
10792
- fromKName,
10793
- fromKPage: location === null || location === void 0 ? void 0 : location.href,
10794
- timeOnSite: Math.floor((new Date() - viewTime) / 1000) + '',
10795
- eventSubject: 'clickTagsViewContents',
10796
- eventDescription: 'User click tags view contents'
10797
- }
10798
- });
10799
- }, [recData, bffEventReport, viewTime, isFromHashtag]);
10800
- React.useEffect(() => {
10801
- if (openHashtag) {
10802
- setViewTime(new Date());
12350
+ const value = tempMap === null || tempMap === void 0 ? void 0 : tempMap[cta];
12351
+ 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)) ||
12352
+ (((_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)) ||
12353
+ (((_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)) ||
12354
+ (((_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)) ||
12355
+ (((_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)) ||
12356
+ (((_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))) {
12357
+ return null;
10803
12358
  }
10804
- }, [openHashtag]);
10805
- React.useEffect(() => {
10806
- const initTime = () => {
10807
- setViewTime(new Date());
10808
- };
10809
- window.addEventListener('pageshow', initTime);
10810
- return () => {
10811
- window.removeEventListener('pageshow', initTime);
10812
- };
10813
- }, []);
10814
- if (!modalEleRef.current)
10815
- return null;
10816
- return ReactDOM__namespace.createPortal(React.createElement("div", { className: 'waterfall', style: {
10817
- display: openHashtag ? 'block' : 'none'
10818
- } },
10819
- React.createElement(Navbar$1, { icon: img, styles: { top: '32px' }, onClose: handleClose }),
10820
- React.createElement(WaterfallList, { reportTagsView: reportTagsView })), modalEleRef.current);
12359
+ if (value && resolver) {
12360
+ const Component = withBindDataSource(resolver[(_w = value === null || value === void 0 ? void 0 : value.item) === null || _w === void 0 ? void 0 : _w.type]);
12361
+ 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 })));
12362
+ }
12363
+ else {
12364
+ return null;
12365
+ }
12366
+ }, [rec, resolver, tempMap, schema]);
12367
+ return React.createElement(React.Fragment, null, renderComp);
10821
12368
  };
10822
- var WaterFall$1 = React.memo(WaterFall);
12369
+ var RenderCard$1 = React.memo(RenderCard);
10823
12370
 
10824
12371
  const Nudge = ({ nudge }) => {
10825
12372
  return (React.createElement("div", { hidden: !(nudge === null || nudge === void 0 ? void 0 : nudge.isOpen), className: 'clc-sxp-bottom-nudge', style: {
@@ -10837,12 +12384,12 @@ Made in Italy` })));
10837
12384
  * @Author: binruan@chatlabs.com
10838
12385
  * @Date: 2024-01-15 19:03:09
10839
12386
  * @LastEditors: binruan@chatlabs.com
10840
- * @LastEditTime: 2024-04-02 10:42:58
12387
+ * @LastEditTime: 2024-04-07 17:06:06
10841
12388
  * @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\index.tsx
10842
12389
  *
10843
12390
  */
10844
- const SxpPageRender = ({ globalConfig, descStyle, containerHeight = window.innerHeight, containerWidth = window.innerWidth, tempMap, resolver, data = [], ctaType, tipText, nudge, _schema }) => {
10845
- var _a, _b, _c, _d;
12391
+ const SxpPageRender = ({ globalConfig, descStyle, containerHeight = window.innerHeight, containerWidth = window.innerWidth, tempMap, resolver, data = [], ctaType, tipText, nudge, _schema, hashTagStyle }) => {
12392
+ var _a, _b, _c, _d, _e, _f, _g;
10846
12393
  const { schema } = useEditor();
10847
12394
  const [activeIndex, setActiveIndex] = React.useState(0);
10848
12395
  const viewImageStartTime = React.useRef(0);
@@ -11022,10 +12569,10 @@ Made in Italy` })));
11022
12569
  React.createElement(RenderCard$1, { rec: rec, index: index, tempMap: tempMap, resolver: resolver })),
11023
12570
  React.createElement("div", { className: 'clc-sxp-bottom-text' },
11024
12571
  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 })),
11025
- 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 }))));
12572
+ 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 }))));
11026
12573
  }
11027
12574
  return null;
11028
- }, [descStyle, activeIndex, tempMap, resolver, tipText, nudge]);
12575
+ }, [descStyle, activeIndex, tempMap, resolver, tipText, nudge, hashTagStyle]);
11029
12576
  const renderLikeButton = React.useCallback((rec) => {
11030
12577
  var _a, _b;
11031
12578
  if (!(globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.isShowLike))
@@ -11164,7 +12711,7 @@ Made in Italy` })));
11164
12711
  const mutedIcon = useIconLink('/pb_static/5beaaa5ce7f3477b99db3838619cc471.png');
11165
12712
  const unmutedIcon = useIconLink('/pb_static/fea8668a8a894e4aa3a86bcc775e895e.png');
11166
12713
  return (React.createElement("div", { id: 'sxp-render', className: 'clc-sxp-container' },
11167
- waterFallData && (React.createElement(Navbar$1, { icon: img$1, styles: { background: 'rgba(0,0,0,.3)', color: '#fff' }, onClose: () => {
12714
+ waterFallData && (React.createElement(Navbar$1, { icon: img, styles: { background: 'rgba(0,0,0,.3)', color: '#fff' }, onClose: () => {
11168
12715
  setOpenHashtag === null || setOpenHashtag === void 0 ? void 0 : setOpenHashtag(true);
11169
12716
  } })),
11170
12717
  renderLogo,
@@ -11208,7 +12755,7 @@ Made in Italy` })));
11208
12755
  zIndex: 999
11209
12756
  }, 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 }),
11210
12757
  renderView),
11211
- React.createElement(WaterFall$1, null)));
12758
+ 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))));
11212
12759
  };
11213
12760
 
11214
12761
  /*
@@ -11315,13 +12862,14 @@ Made in Italy` })));
11315
12862
  * @Author: binruan@chatlabs.com
11316
12863
  * @Date: 2023-12-26 10:38:53
11317
12864
  * @LastEditors: binruan@chatlabs.com
11318
- * @LastEditTime: 2024-03-14 15:13:36
12865
+ * @LastEditTime: 2024-04-08 10:53:29
11319
12866
  * @FilePath: \pb-sxp-ui\src\core\context\EditorDataProvider.tsx
11320
12867
  *
11321
12868
  */
11322
12869
  const EditorDataContext = React.createContext({});
11323
12870
  const EditorDataProvider = ({ children, data }) => {
11324
12871
  var _a, _b, _c, _d, _e, _f;
12872
+ const [openHashtag, setOpenHashtag] = React.useState(false);
11325
12873
  return (React.createElement(EditorDataContext.Provider, { value: {
11326
12874
  sxpPrameter: {
11327
12875
  bottomImage: (_a = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _a === void 0 ? void 0 : _a.bottom_image,
@@ -11331,7 +12879,9 @@ Made in Italy` })));
11331
12879
  hashTagSize: (_e = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _e === void 0 ? void 0 : _e.hash_tag_size,
11332
12880
  loadingImage: (_f = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _f === void 0 ? void 0 : _f.loading_image
11333
12881
  },
11334
- appDomain: data === null || data === void 0 ? void 0 : data.appDomain
12882
+ appDomain: data === null || data === void 0 ? void 0 : data.appDomain,
12883
+ openHashtag,
12884
+ setOpenHashtag
11335
12885
  } }, children));
11336
12886
  };
11337
12887
  function useEditorDataProvider() {