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