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.
- package/dist/index.cjs +2373 -823
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +115 -112
- package/dist/index.js +2374 -824
- package/dist/index.js.map +1 -1
- package/dist/index.min.cjs +3 -3
- package/dist/index.min.cjs.map +1 -1
- package/dist/index.min.js +3 -3
- package/dist/index.min.js.map +1 -1
- package/dist/pb-ui.js +2373 -823
- package/dist/pb-ui.js.map +1 -1
- package/dist/pb-ui.min.js +3 -3
- package/dist/pb-ui.min.js.map +1 -1
- package/es/core/components/SxpPageRender/Hashtag/index.d.ts +2 -1
- package/es/core/components/SxpPageRender/Hashtag/index.js +2 -2
- package/es/core/components/SxpPageRender/Navbar.d.ts +1 -0
- package/es/core/components/SxpPageRender/Navbar.js +3 -2
- package/es/core/components/SxpPageRender/WaterFall/List.d.ts +2 -1
- package/es/core/components/SxpPageRender/WaterFall/List.js +24 -14
- package/es/core/components/SxpPageRender/WaterFall/WaterfallList.d.ts +2 -1
- package/es/core/components/SxpPageRender/WaterFall/WaterfallList.js +13 -11
- package/es/core/components/SxpPageRender/WaterFall/index.d.ts +2 -1
- package/es/core/components/SxpPageRender/WaterFall/index.js +4 -3
- package/es/core/components/SxpPageRender/WaterFall/preview.json +1242 -0
- package/es/core/components/SxpPageRender/index.d.ts +2 -0
- package/es/core/components/SxpPageRender/index.js +5 -5
- package/es/core/context/EditorDataProvider.d.ts +3 -1
- package/es/core/context/EditorDataProvider.js +5 -2
- package/es/core/context/SxpDataSourceProvider.d.ts +2 -0
- package/es/core/context/SxpDataSourceProvider.js +7 -3
- package/es/materials/sxp/HashTag/index.d.ts +14 -0
- package/es/materials/sxp/HashTag/index.js +6 -0
- package/es/materials/sxp/HashTag/material.d.ts +2 -0
- package/es/materials/sxp/HashTag/material.js +52 -0
- package/es/materials/sxp/HashTag/settingRender.d.ts +122 -0
- package/es/materials/sxp/HashTag/settingRender.js +153 -0
- package/es/materials/sxp/index.d.ts +1 -0
- package/es/materials/sxp/index.js +1 -0
- package/es/materials/sxp/template/components/settingRender.d.ts +15 -0
- package/es/materials/sxp/template/components/settingRender.js +17 -0
- package/lib/core/components/SxpPageRender/Hashtag/index.d.ts +2 -1
- package/lib/core/components/SxpPageRender/Hashtag/index.js +2 -2
- package/lib/core/components/SxpPageRender/Navbar.d.ts +1 -0
- package/lib/core/components/SxpPageRender/Navbar.js +3 -2
- package/lib/core/components/SxpPageRender/WaterFall/List.d.ts +2 -1
- package/lib/core/components/SxpPageRender/WaterFall/List.js +23 -14
- package/lib/core/components/SxpPageRender/WaterFall/WaterfallList.d.ts +2 -1
- package/lib/core/components/SxpPageRender/WaterFall/WaterfallList.js +12 -11
- package/lib/core/components/SxpPageRender/WaterFall/index.d.ts +2 -1
- package/lib/core/components/SxpPageRender/WaterFall/index.js +4 -3
- package/lib/core/components/SxpPageRender/WaterFall/preview.json +1242 -0
- package/lib/core/components/SxpPageRender/index.d.ts +2 -0
- package/lib/core/components/SxpPageRender/index.js +5 -5
- package/lib/core/context/EditorDataProvider.d.ts +3 -1
- package/lib/core/context/EditorDataProvider.js +4 -1
- package/lib/core/context/SxpDataSourceProvider.d.ts +2 -0
- package/lib/core/context/SxpDataSourceProvider.js +7 -3
- package/lib/materials/sxp/HashTag/index.d.ts +14 -0
- package/lib/materials/sxp/HashTag/index.js +9 -0
- package/lib/materials/sxp/HashTag/material.d.ts +2 -0
- package/lib/materials/sxp/HashTag/material.js +56 -0
- package/lib/materials/sxp/HashTag/settingRender.d.ts +122 -0
- package/lib/materials/sxp/HashTag/settingRender.js +155 -0
- package/lib/materials/sxp/index.d.ts +1 -0
- package/lib/materials/sxp/index.js +1 -0
- package/lib/materials/sxp/template/components/settingRender.d.ts +15 -0
- package/lib/materials/sxp/template/components/settingRender.js +17 -0
- 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(
|
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$
|
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$
|
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$
|
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$
|
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$
|
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$
|
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$
|
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$
|
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
|
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:
|
9952
|
+
* @Date: 2024-04-07 14:07:12
|
9932
9953
|
* @LastEditors: binruan@chatlabs.com
|
9933
|
-
* @LastEditTime: 2024-
|
9934
|
-
* @FilePath: \pb-sxp-ui\src\materials\
|
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
|
-
|
9939
|
-
|
9940
|
-
|
9941
|
-
|
9942
|
-
|
9943
|
-
|
9944
|
-
|
9945
|
-
|
9946
|
-
|
9947
|
-
|
9948
|
-
|
9949
|
-
|
9950
|
-
|
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
|
-
|
9986
|
-
|
9987
|
-
|
9988
|
-
|
9989
|
-
|
9990
|
-
|
9991
|
-
|
9992
|
-
|
9993
|
-
|
9994
|
-
|
9995
|
-
|
9996
|
-
|
9997
|
-
|
9998
|
-
|
9999
|
-
|
10000
|
-
|
10001
|
-
|
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
|
-
}
|
10005
|
-
|
10006
|
-
|
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
|
10127
|
+
var Navbar$1 = React.memo(Navbar);
|
10009
10128
|
|
10010
|
-
|
10011
|
-
var
|
10012
|
-
|
10013
|
-
|
10014
|
-
|
10015
|
-
|
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
|
10018
|
-
const
|
10019
|
-
const
|
10020
|
-
const
|
10021
|
-
const
|
10022
|
-
const
|
10023
|
-
const
|
10024
|
-
React.
|
10025
|
-
|
10026
|
-
|
10027
|
-
|
10028
|
-
|
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
|
-
|
10065
|
-
|
10066
|
-
|
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
|
-
|
10090
|
-
|
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
|
-
|
10127
|
-
|
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
|
-
|
10151
|
-
|
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
|
-
|
10165
|
-
|
10166
|
-
|
10167
|
-
|
10168
|
-
|
10169
|
-
|
10170
|
-
|
10171
|
-
|
10172
|
-
|
10173
|
-
|
10174
|
-
|
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
|
-
|
10185
|
-
return;
|
10186
|
-
videoRef.current.play();
|
11451
|
+
return null;
|
10187
11452
|
}
|
10188
|
-
|
10189
|
-
|
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
|
-
|
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
|
-
}, [
|
10196
|
-
|
10197
|
-
|
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
|
-
|
10201
|
-
if (
|
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
|
-
|
10213
|
-
|
10214
|
-
|
10215
|
-
|
10216
|
-
|
10217
|
-
|
10218
|
-
|
10219
|
-
|
10220
|
-
|
10221
|
-
|
10222
|
-
|
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
|
-
}, [
|
10225
|
-
const
|
10226
|
-
|
10227
|
-
|
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
|
-
|
10230
|
-
|
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
|
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 (
|
10235
|
-
|
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('
|
11711
|
+
window.addEventListener('pageshow', initTime);
|
10239
11712
|
return () => {
|
10240
|
-
window.removeEventListener('
|
11713
|
+
window.removeEventListener('pageshow', initTime);
|
10241
11714
|
};
|
10242
|
-
}, [
|
10243
|
-
if (!
|
11715
|
+
}, []);
|
11716
|
+
if (!modalEleRef.current)
|
10244
11717
|
return null;
|
10245
|
-
|
10246
|
-
|
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(
|
10252
|
-
|
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
|
11724
|
+
var WaterFall$1 = React.memo(WaterFall);
|
10256
11725
|
|
10257
11726
|
/*
|
10258
11727
|
* @Author: binruan@chatlabs.com
|
10259
|
-
* @Date:
|
11728
|
+
* @Date: 2024-01-15 19:03:09
|
10260
11729
|
* @LastEditors: binruan@chatlabs.com
|
10261
|
-
* @LastEditTime: 2024-
|
10262
|
-
* @FilePath: \pb-sxp-ui\src\
|
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
|
10266
|
-
|
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
|
11737
|
+
var HashTagComponent = React.memo(HashTag$1);
|
10277
11738
|
|
10278
11739
|
/*
|
10279
11740
|
* @Author: binruan@chatlabs.com
|
10280
|
-
* @Date:
|
11741
|
+
* @Date: 2023-07-28 18:29:57
|
10281
11742
|
* @LastEditors: binruan@chatlabs.com
|
10282
|
-
* @LastEditTime: 2024-
|
10283
|
-
* @FilePath: \pb-sxp-ui\src\
|
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
|
10287
|
-
|
10288
|
-
|
10289
|
-
|
10290
|
-
|
10291
|
-
|
10292
|
-
|
10293
|
-
|
10294
|
-
|
10295
|
-
|
10296
|
-
|
10297
|
-
|
10298
|
-
|
10299
|
-
|
10300
|
-
|
10301
|
-
|
10302
|
-
|
10303
|
-
|
10304
|
-
|
10305
|
-
|
10306
|
-
|
10307
|
-
|
10308
|
-
|
10309
|
-
|
10310
|
-
|
10311
|
-
|
10312
|
-
|
10313
|
-
|
10314
|
-
|
10315
|
-
|
10316
|
-
|
10317
|
-
|
10318
|
-
|
10319
|
-
|
10320
|
-
|
10321
|
-
|
10322
|
-
|
10323
|
-
|
10324
|
-
|
10325
|
-
|
10326
|
-
|
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
|
-
|
10340
|
-
|
10341
|
-
|
10342
|
-
|
10343
|
-
|
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:
|
11798
|
+
* @Date: 2023-07-25 14:56:49
|
10356
11799
|
* @LastEditors: binruan@chatlabs.com
|
10357
|
-
* @LastEditTime: 2024-03-
|
10358
|
-
* @FilePath: \pb-sxp-ui\src\
|
11800
|
+
* @LastEditTime: 2024-03-20 13:46:06
|
11801
|
+
* @FilePath: \pb-sxp-ui\src\materials\index.ts
|
10359
11802
|
*
|
10360
11803
|
*/
|
10361
|
-
|
10362
|
-
|
10363
|
-
|
10364
|
-
|
10365
|
-
|
10366
|
-
|
10367
|
-
|
10368
|
-
|
10369
|
-
|
10370
|
-
|
10371
|
-
|
10372
|
-
|
10373
|
-
|
10374
|
-
|
10375
|
-
|
10376
|
-
|
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
|
-
|
10381
|
-
|
10382
|
-
|
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
|
-
|
10386
|
-
}
|
10387
|
-
|
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
|
11876
|
+
var LikeButton$1 = React.memo(LikeButton);
|
10413
11877
|
|
10414
|
-
|
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
|
-
|
10417
|
-
|
10418
|
-
|
10419
|
-
|
10420
|
-
|
10421
|
-
|
10422
|
-
|
10423
|
-
|
10424
|
-
|
10425
|
-
|
10426
|
-
|
10427
|
-
|
10428
|
-
|
10429
|
-
|
10430
|
-
|
10431
|
-
|
10432
|
-
|
10433
|
-
|
10434
|
-
|
10435
|
-
|
10436
|
-
|
10437
|
-
|
10438
|
-
|
10439
|
-
|
10440
|
-
|
10441
|
-
|
10442
|
-
|
10443
|
-
|
10444
|
-
|
10445
|
-
|
10446
|
-
|
10447
|
-
|
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 (
|
10508
|
-
|
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
|
-
|
10533
|
-
|
10534
|
-
|
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
|
-
|
10537
|
-
|
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
|
-
|
10540
|
-
|
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
|
-
|
10543
|
-
|
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
|
-
|
10546
|
-
|
10547
|
-
|
10548
|
-
|
10549
|
-
|
10550
|
-
|
10551
|
-
|
10552
|
-
|
10553
|
-
|
10554
|
-
|
10555
|
-
|
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
|
-
|
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
|
-
|
10561
|
-
|
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
|
-
|
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
|
-
}, [
|
10598
|
-
|
10599
|
-
|
10600
|
-
|
10601
|
-
return targetHeight;
|
10602
|
-
};
|
12063
|
+
}, [data, handleLoadedMetadata, handlePlaying, isActive, isLoad, rec.video]);
|
12064
|
+
/*
|
12065
|
+
打开/关闭hashtag暂停/播放视频
|
12066
|
+
*/
|
10603
12067
|
React.useEffect(() => {
|
10604
|
-
|
10605
|
-
if (
|
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
|
-
|
10609
|
-
|
10610
|
-
|
10611
|
-
|
10612
|
-
|
10613
|
-
|
10614
|
-
|
10615
|
-
|
10616
|
-
|
10617
|
-
|
10618
|
-
|
10619
|
-
|
10620
|
-
|
10621
|
-
|
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
|
-
}, [
|
10626
|
-
const
|
10627
|
-
|
10628
|
-
|
10629
|
-
|
10630
|
-
|
10631
|
-
|
10632
|
-
|
10633
|
-
|
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("
|
10636
|
-
React.createElement("
|
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
|
-
|
10646
|
-
|
10647
|
-
|
10648
|
-
|
10649
|
-
|
10650
|
-
|
10651
|
-
|
10652
|
-
|
10653
|
-
|
10654
|
-
|
10655
|
-
|
10656
|
-
|
10657
|
-
|
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
|
-
|
10670
|
-
|
10671
|
-
|
10672
|
-
|
10673
|
-
|
10674
|
-
|
10675
|
-
|
10676
|
-
|
10677
|
-
|
10678
|
-
|
10679
|
-
|
10680
|
-
|
10681
|
-
|
10682
|
-
|
10683
|
-
|
10684
|
-
|
10685
|
-
|
10686
|
-
|
10687
|
-
|
10688
|
-
|
10689
|
-
|
10690
|
-
|
10691
|
-
|
10692
|
-
|
10693
|
-
|
10694
|
-
|
10695
|
-
|
10696
|
-
|
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
|
-
|
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-
|
12223
|
+
* @Date: 2024-01-15 19:03:09
|
10726
12224
|
* @LastEditors: binruan@chatlabs.com
|
10727
|
-
* @LastEditTime: 2024-03
|
10728
|
-
* @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\
|
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
|
10732
|
-
const
|
10733
|
-
|
10734
|
-
const
|
10735
|
-
|
10736
|
-
|
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
|
-
|
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
|
-
|
10749
|
-
|
10750
|
-
|
10751
|
-
|
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
|
-
|
10754
|
-
|
10755
|
-
|
10756
|
-
|
10757
|
-
|
10758
|
-
|
10759
|
-
|
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
|
-
|
10765
|
-
|
10766
|
-
|
10767
|
-
setRecData(waterFallData);
|
12255
|
+
React.useMemo(() => {
|
12256
|
+
if (tags.length <= 6) {
|
12257
|
+
return null;
|
10768
12258
|
}
|
10769
|
-
|
10770
|
-
|
10771
|
-
|
10772
|
-
|
10773
|
-
|
10774
|
-
|
10775
|
-
|
10776
|
-
|
10777
|
-
|
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 ((
|
10780
|
-
|
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
|
10783
|
-
|
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
|
-
|
10786
|
-
|
10787
|
-
|
10788
|
-
|
10789
|
-
|
10790
|
-
|
10791
|
-
|
10792
|
-
|
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
|
-
|
10805
|
-
|
10806
|
-
|
10807
|
-
|
10808
|
-
|
10809
|
-
|
10810
|
-
|
10811
|
-
|
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
|
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-
|
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
|
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-
|
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() {
|