pb-sxp-ui 1.15.13-alpha.3 → 1.15.13-alpha.5
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 +203 -112
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +203 -112
- package/dist/index.js.map +1 -1
- package/dist/index.min.cjs +6 -6
- package/dist/index.min.cjs.map +1 -1
- package/dist/index.min.js +6 -6
- package/dist/index.min.js.map +1 -1
- package/dist/pb-ui.js +203 -112
- package/dist/pb-ui.js.map +1 -1
- package/dist/pb-ui.min.js +6 -6
- package/dist/pb-ui.min.js.map +1 -1
- package/es/core/components/DiyStoryPreview/VideoWidget.d.ts +10 -2
- package/es/core/components/DiyStoryPreview/VideoWidget.js +68 -24
- package/es/core/components/DiyStoryPreview/index.d.ts +20 -1
- package/es/core/components/DiyStoryPreview/index.js +51 -20
- package/es/core/components/SxpPageCore/index.js +5 -5
- package/es/core/context/EditorContext.js +1 -1
- package/es/core/context/SxpDataSourceProvider.d.ts +1 -1
- package/es/core/context/SxpDataSourceProvider.js +21 -22
- package/lib/core/components/DiyStoryPreview/VideoWidget.d.ts +10 -2
- package/lib/core/components/DiyStoryPreview/VideoWidget.js +67 -23
- package/lib/core/components/DiyStoryPreview/index.d.ts +20 -1
- package/lib/core/components/DiyStoryPreview/index.js +49 -18
- package/lib/core/components/SxpPageCore/index.js +5 -5
- package/lib/core/context/EditorContext.js +1 -1
- package/lib/core/context/SxpDataSourceProvider.d.ts +1 -1
- package/lib/core/context/SxpDataSourceProvider.js +21 -22
- package/package.json +1 -1
package/dist/index.js
CHANGED
@@ -429,39 +429,6 @@ const Pagebuilder = {
|
|
429
429
|
})
|
430
430
|
};
|
431
431
|
|
432
|
-
function useEditor() {
|
433
|
-
return useContext(EditorContext);
|
434
|
-
}
|
435
|
-
|
436
|
-
function useDataSource() {
|
437
|
-
return useContext(DataSourceContext);
|
438
|
-
}
|
439
|
-
|
440
|
-
const feRealSessionIdKey = 'feRealSessionIdKey';
|
441
|
-
const generateFeSessionId = () => {
|
442
|
-
const uid = getUid(); // 32位长度
|
443
|
-
const timestamp = Date.now(); // 13位长度
|
444
|
-
const result = `${timestamp}${uid}`; // 总共45位长度的唯一ID
|
445
|
-
return result;
|
446
|
-
};
|
447
|
-
// 生成或者获取sessionID
|
448
|
-
const storeAndLoadFeSessionId = () => {
|
449
|
-
let result = getFeSessionId();
|
450
|
-
if (!result) {
|
451
|
-
result = generateFeSessionId();
|
452
|
-
window.localStorage.setItem(feRealSessionIdKey, result);
|
453
|
-
}
|
454
|
-
return result;
|
455
|
-
};
|
456
|
-
const refreshFeSessionId = () => {
|
457
|
-
const result = generateFeSessionId();
|
458
|
-
window.localStorage.setItem(feRealSessionIdKey, result);
|
459
|
-
};
|
460
|
-
// 获取 sessionID
|
461
|
-
const getFeSessionId = () => {
|
462
|
-
return window.localStorage.getItem(feRealSessionIdKey);
|
463
|
-
};
|
464
|
-
|
465
432
|
/*
|
466
433
|
* @Author: binruan@chatlabs.com
|
467
434
|
* @Date: 2024-03-20 10:27:31
|
@@ -513,6 +480,39 @@ const setUserConsentResult = () => {
|
|
513
480
|
window.localStorage.setItem(USER_CONSENT_RESULT_KEY, 'true');
|
514
481
|
};
|
515
482
|
|
483
|
+
function useEditor() {
|
484
|
+
return useContext(EditorContext);
|
485
|
+
}
|
486
|
+
|
487
|
+
function useDataSource() {
|
488
|
+
return useContext(DataSourceContext);
|
489
|
+
}
|
490
|
+
|
491
|
+
const feRealSessionIdKey = 'feRealSessionIdKey';
|
492
|
+
const generateFeSessionId = () => {
|
493
|
+
const uid = getUid(); // 32位长度
|
494
|
+
const timestamp = Date.now(); // 13位长度
|
495
|
+
const result = `${timestamp}${uid}`; // 总共45位长度的唯一ID
|
496
|
+
return result;
|
497
|
+
};
|
498
|
+
// 生成或者获取sessionID
|
499
|
+
const storeAndLoadFeSessionId = () => {
|
500
|
+
let result = getFeSessionId();
|
501
|
+
if (!result) {
|
502
|
+
result = generateFeSessionId();
|
503
|
+
window.localStorage.setItem(feRealSessionIdKey, result);
|
504
|
+
}
|
505
|
+
return result;
|
506
|
+
};
|
507
|
+
const refreshFeSessionId = () => {
|
508
|
+
const result = generateFeSessionId();
|
509
|
+
window.localStorage.setItem(feRealSessionIdKey, result);
|
510
|
+
};
|
511
|
+
// 获取 sessionID
|
512
|
+
const getFeSessionId = () => {
|
513
|
+
return window.localStorage.getItem(feRealSessionIdKey);
|
514
|
+
};
|
515
|
+
|
516
516
|
/*
|
517
517
|
* @Author: binruan@chatlabs.com
|
518
518
|
* @Date: 2024-03-20 10:27:31
|
@@ -757,16 +757,16 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
757
757
|
}, [bffDataSource]);
|
758
758
|
// 获取推荐视频数据
|
759
759
|
const getRecommendVideos = useCallback((query) => __awaiter(void 0, void 0, void 0, function* () {
|
760
|
-
var _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s
|
761
|
-
query = Object.assign({ maxSize:
|
760
|
+
var _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
761
|
+
query = Object.assign({ maxSize: 50, defaultSize: 50, hashTag: query === null || query === void 0 ? void 0 : query.hashTag, traceInfo: query === null || query === void 0 ? void 0 : query.traceInfo, themeTag: query === null || query === void 0 ? void 0 : query.themeTag, pageNum: query === null || query === void 0 ? void 0 : query.pageNum, contentFilter: query === null || query === void 0 ? void 0 : query.contentFilter, productFilter: query === null || query === void 0 ? void 0 : query.productFilter }, (chatlabsId && { chatlabsId }));
|
762
762
|
if (channel) {
|
763
763
|
query = Object.assign(Object.assign({}, query), { channel: decodeURIComponent(channel) });
|
764
764
|
}
|
765
765
|
else if (utmVal) {
|
766
|
-
const val = (
|
766
|
+
const val = (_h = (_g = (_f = splitUrlParams(utmVal)) === null || _f === void 0 ? void 0 : _f.filter((val) => {
|
767
767
|
const key = val.split('=')[0];
|
768
768
|
return key;
|
769
|
-
})) === null ||
|
769
|
+
})) === null || _g === void 0 ? void 0 : _g.join('&')) !== null && _h !== void 0 ? _h : '';
|
770
770
|
if (val)
|
771
771
|
query = Object.assign(Object.assign({}, query), { channel: decodeURIComponent(val) });
|
772
772
|
}
|
@@ -780,19 +780,19 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
780
780
|
let list = [];
|
781
781
|
let result = null;
|
782
782
|
const recurveRecList = (query) => __awaiter(void 0, void 0, void 0, function* () {
|
783
|
-
var _v, _w, _x, _y
|
783
|
+
var _t, _u, _v, _w, _x, _y;
|
784
784
|
query.pageNum = pageNum;
|
785
785
|
result = yield (bffFetchAdmin === null || bffFetchAdmin === void 0 ? void 0 : bffFetchAdmin('recommend/direct_page', { method: 'POST', body: query }));
|
786
786
|
if (!(result === null || result === void 0 ? void 0 : result.success)) {
|
787
787
|
return undefined;
|
788
788
|
}
|
789
789
|
setLoading(false);
|
790
|
-
list = list.concat((
|
790
|
+
list = list.concat((_w = (_v = (_u = (_t = result === null || result === void 0 ? void 0 : result.data) === null || _t === void 0 ? void 0 : _t.recList) === null || _u === void 0 ? void 0 : _u.filter) === null || _v === void 0 ? void 0 : _v.call(_u, (item) => (item === null || item === void 0 ? void 0 : item.product) || (item === null || item === void 0 ? void 0 : item.video))) !== null && _w !== void 0 ? _w : []);
|
791
791
|
if ((rtcList === null || rtcList === void 0 ? void 0 : rtcList.length) === 0) {
|
792
792
|
setRtcList(getFilterRecList(Object.assign(Object.assign({}, result === null || result === void 0 ? void 0 : result.data), { recList: list })));
|
793
793
|
setCacheRtcList(getFilterRecList(Object.assign(Object.assign({}, result === null || result === void 0 ? void 0 : result.data), { recList: list })));
|
794
794
|
}
|
795
|
-
const isNotNullList = (
|
795
|
+
const isNotNullList = (_y = (_x = result === null || result === void 0 ? void 0 : result.data) === null || _x === void 0 ? void 0 : _x.recList) === null || _y === void 0 ? void 0 : _y.some((item) => (item === null || item === void 0 ? void 0 : item.product) || (item === null || item === void 0 ? void 0 : item.video));
|
796
796
|
if (isNotNullList) {
|
797
797
|
pageNum = pageNum + 1;
|
798
798
|
yield recurveRecList(query);
|
@@ -800,11 +800,11 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
800
800
|
});
|
801
801
|
yield recurveRecList(query);
|
802
802
|
if (!(query === null || query === void 0 ? void 0 : query.hashTag) && result)
|
803
|
-
setCurReqInfo({ rtc: (
|
803
|
+
setCurReqInfo({ rtc: (_j = result === null || result === void 0 ? void 0 : result.data) === null || _j === void 0 ? void 0 : _j.rtc, requestId: (_k = result === null || result === void 0 ? void 0 : result.data) === null || _k === void 0 ? void 0 : _k.requestId });
|
804
804
|
return Object.assign(Object.assign({}, result === null || result === void 0 ? void 0 : result.data), { recList: list });
|
805
805
|
}
|
806
806
|
if (globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.enablePreview) {
|
807
|
-
query = Object.assign(Object.assign({}, query), { directPage: true, level: 1, pageNum: (
|
807
|
+
query = Object.assign(Object.assign({}, query), { directPage: true, level: 1, pageNum: (_l = query === null || query === void 0 ? void 0 : query.pageNum) !== null && _l !== void 0 ? _l : 1 });
|
808
808
|
}
|
809
809
|
const result = yield (bffFetch === null || bffFetch === void 0 ? void 0 : bffFetch('v3/recommend/direct', { method: 'POST', body: query }));
|
810
810
|
if (!(result === null || result === void 0 ? void 0 : result.success)) {
|
@@ -814,8 +814,8 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
814
814
|
setCurReqInfo({ rtc: result.data.rtc, requestId: result.data.requestId });
|
815
815
|
if ((globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.enablePreview) && !isEditor) {
|
816
816
|
let list = [];
|
817
|
-
list = list.concat((
|
818
|
-
const isNotNullList = (
|
817
|
+
list = list.concat((_q = (_p = (_o = (_m = result === null || result === void 0 ? void 0 : result.data) === null || _m === void 0 ? void 0 : _m.recList) === null || _o === void 0 ? void 0 : _o.filter) === null || _p === void 0 ? void 0 : _p.call(_o, (item) => (item === null || item === void 0 ? void 0 : item.product) || (item === null || item === void 0 ? void 0 : item.video))) !== null && _q !== void 0 ? _q : []);
|
818
|
+
const isNotNullList = (_s = (_r = result === null || result === void 0 ? void 0 : result.data) === null || _r === void 0 ? void 0 : _r.recList) === null || _s === void 0 ? void 0 : _s.some((item) => (item === null || item === void 0 ? void 0 : item.product) || (item === null || item === void 0 ? void 0 : item.video));
|
819
819
|
if (!isNotNullList) {
|
820
820
|
setIsNoMoreData(true);
|
821
821
|
}
|
@@ -824,12 +824,12 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
824
824
|
return result === null || result === void 0 ? void 0 : result.data;
|
825
825
|
}), [bffFetch, utmVal, maxSize, defaultSize, channelQueryList, channel, chatlabsId, bffFetchAdmin]);
|
826
826
|
const loadVideos = useCallback((pageNum) => __awaiter(void 0, void 0, void 0, function* () {
|
827
|
-
var
|
827
|
+
var _z, _0, _1, _2;
|
828
828
|
if (rtcList.length <= 0) {
|
829
829
|
return;
|
830
830
|
}
|
831
831
|
const lastItem = rtcList === null || rtcList === void 0 ? void 0 : rtcList[(rtcList === null || rtcList === void 0 ? void 0 : rtcList.length) - 1];
|
832
|
-
const data = yield getRecommendVideos(Object.assign(Object.assign(Object.assign(Object.assign({ hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag }, (((
|
832
|
+
const data = yield getRecommendVideos(Object.assign(Object.assign(Object.assign(Object.assign({ hashTag: waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.hashTag }, (((_z = lastItem === null || lastItem === void 0 ? void 0 : lastItem.product) === null || _z === void 0 ? void 0 : _z.itemId) && { productFilter: [(_0 = lastItem === null || lastItem === void 0 ? void 0 : lastItem.product) === null || _0 === void 0 ? void 0 : _0.itemId] })), (((_1 = lastItem === null || lastItem === void 0 ? void 0 : lastItem.video) === null || _1 === void 0 ? void 0 : _1.itemId) && { contentFilter: [(_2 = lastItem === null || lastItem === void 0 ? void 0 : lastItem.video) === null || _2 === void 0 ? void 0 : _2.itemId] })), { themeTag: themeTag.current }), ((globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.enablePreview) && !isEditor && { pageNum })));
|
833
833
|
setRtcList(rtcList.concat(getFilterRecList(data)));
|
834
834
|
setCacheRtcList(cacheRtcList.concat(getFilterRecList(data)));
|
835
835
|
return data;
|
@@ -994,18 +994,18 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
994
994
|
}), [bffFetch]);
|
995
995
|
// 获取 Tag
|
996
996
|
const bffGetTagList = useCallback((data) => __awaiter(void 0, void 0, void 0, function* () {
|
997
|
-
var _5, _6, _7, _8, _9, _10
|
998
|
-
const isShowTag = !!((
|
997
|
+
var _3, _4, _5, _6, _7, _8, _9, _10;
|
998
|
+
const isShowTag = !!((_5 = (_4 = (_3 = data === null || data === void 0 ? void 0 : data.data) === null || _3 === void 0 ? void 0 : _3.sxpPageConf) === null || _4 === void 0 ? void 0 : _4.globalConfig) === null || _5 === void 0 ? void 0 : _5.isShowTag);
|
999
999
|
if (!utmVal || !isShowTag)
|
1000
1000
|
return;
|
1001
1001
|
try {
|
1002
|
-
const val = (
|
1002
|
+
const val = (_8 = (_7 = (_6 = splitUrlParams(utmVal)) === null || _6 === void 0 ? void 0 : _6.filter((val) => {
|
1003
1003
|
var _a, _b;
|
1004
1004
|
const key = val.split('=')[0];
|
1005
1005
|
return (_b = ((_a = utmParameter === null || utmParameter === void 0 ? void 0 : utmParameter.channels) !== null && _a !== void 0 ? _a : [])) === null || _b === void 0 ? void 0 : _b.includes(key);
|
1006
|
-
})) === null ||
|
1006
|
+
})) === null || _7 === void 0 ? void 0 : _7.join('&')) !== null && _8 !== void 0 ? _8 : '';
|
1007
1007
|
const result = yield (bffFetch === null || bffFetch === void 0 ? void 0 : bffFetch('v1/tag/list', { method: 'GET', query: { channel: decodeURIComponent(val) } }));
|
1008
|
-
setTagList((
|
1008
|
+
setTagList((_10 = (_9 = result === null || result === void 0 ? void 0 : result.data) === null || _9 === void 0 ? void 0 : _9.tags) !== null && _10 !== void 0 ? _10 : []);
|
1009
1009
|
}
|
1010
1010
|
catch (e) {
|
1011
1011
|
console.log('e', e);
|
@@ -1065,10 +1065,10 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
1065
1065
|
});
|
1066
1066
|
}, [bffEventReport]);
|
1067
1067
|
const getAccount = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
|
1068
|
-
var
|
1068
|
+
var _11, _12;
|
1069
1069
|
const res = yield (bffFetch === null || bffFetch === void 0 ? void 0 : bffFetch('v1/account', { method: 'GET' }));
|
1070
|
-
setChatlabsId((
|
1071
|
-
return ((
|
1070
|
+
setChatlabsId((_11 = res === null || res === void 0 ? void 0 : res.data) === null || _11 === void 0 ? void 0 : _11.chatLabsId);
|
1071
|
+
return ((_12 = res === null || res === void 0 ? void 0 : res.data) === null || _12 === void 0 ? void 0 : _12.consentResult) === 'true';
|
1072
1072
|
}), [bffFetch]);
|
1073
1073
|
const accountSonsent = useCallback((consentResult) => __awaiter(void 0, void 0, void 0, function* () {
|
1074
1074
|
const res = yield (bffFetch === null || bffFetch === void 0 ? void 0 : bffFetch('v1/account/consent', {
|
@@ -1083,7 +1083,6 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
|
|
1083
1083
|
if (!isShowConsent)
|
1084
1084
|
h5EnterLink();
|
1085
1085
|
}, [isShowConsent]);
|
1086
|
-
console.log(data, '111');
|
1087
1086
|
useEffect(() => {
|
1088
1087
|
if (isShowConsent || isPreview)
|
1089
1088
|
return;
|
@@ -18299,7 +18298,7 @@ function withBindDataSource(Component) {
|
|
18299
18298
|
* @Author: binruan@chatlabs.com
|
18300
18299
|
* @Date: 2023-12-26 16:11:34
|
18301
18300
|
* @LastEditors: binruan@chatlabs.com
|
18302
|
-
* @LastEditTime: 2025-03-
|
18301
|
+
* @LastEditTime: 2025-03-28 14:46:08
|
18303
18302
|
* @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\RenderCard.tsx
|
18304
18303
|
*
|
18305
18304
|
*/
|
@@ -19461,7 +19460,7 @@ const PictureGroup = ({ imgUrls, width, height, imgUrlsPostConfig, rec, index, s
|
|
19461
19460
|
};
|
19462
19461
|
var PictureGroup$1 = memo(PictureGroup);
|
19463
19462
|
|
19464
|
-
const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostConfig, width, swiperRef, loopPlay }) => {
|
19463
|
+
const VideoWidget = forwardRef(({ rec, index, height, data, muted, activeIndex, videoPostConfig, width, swiperRef, videoPlayIcon, handleUpdateTimeline, loopPlay }, ref) => {
|
19465
19464
|
const { isActive } = useSwiperSlide();
|
19466
19465
|
const [isPauseVideo, setIsPauseVideo] = useState(false);
|
19467
19466
|
const videoRef = useRef(null);
|
@@ -19473,6 +19472,38 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19473
19472
|
const [firstFrameSrc, setFirstFrameSrc] = useState('');
|
19474
19473
|
const videoId = `pb-cache-video-${index}`;
|
19475
19474
|
const hlsRef = useRef(null);
|
19475
|
+
const loopPlayRef = useRef(loopPlay);
|
19476
|
+
useEffect(() => {
|
19477
|
+
loopPlayRef.current = loopPlay;
|
19478
|
+
}, [loopPlay]);
|
19479
|
+
useImperativeHandle(ref, () => {
|
19480
|
+
return {
|
19481
|
+
play() {
|
19482
|
+
var _a;
|
19483
|
+
if (!videoRef.current)
|
19484
|
+
return;
|
19485
|
+
handleTimeUpload();
|
19486
|
+
(_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.play();
|
19487
|
+
setIsPauseVideo(false);
|
19488
|
+
},
|
19489
|
+
pause() {
|
19490
|
+
var _a;
|
19491
|
+
if (!videoRef.current)
|
19492
|
+
return;
|
19493
|
+
(_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.pause();
|
19494
|
+
setIsPauseVideo(true);
|
19495
|
+
},
|
19496
|
+
setLoopPlay(v) {
|
19497
|
+
if (!videoRef.current)
|
19498
|
+
return;
|
19499
|
+
loopPlayRef.current = v;
|
19500
|
+
},
|
19501
|
+
isPlaying() {
|
19502
|
+
var _a;
|
19503
|
+
return !((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.paused);
|
19504
|
+
}
|
19505
|
+
};
|
19506
|
+
});
|
19476
19507
|
useEffect(() => {
|
19477
19508
|
if (!videoRef.current)
|
19478
19509
|
return;
|
@@ -19482,8 +19513,8 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19482
19513
|
var _a;
|
19483
19514
|
(_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.play();
|
19484
19515
|
}, []);
|
19485
|
-
useIconLink('/pb_static/06f28a2025c74c1cb49be6767316d827.png');
|
19486
|
-
|
19516
|
+
const PAUSE_ICON = useIconLink('/pb_static/06f28a2025c74c1cb49be6767316d827.png');
|
19517
|
+
useCallback(() => {
|
19487
19518
|
var _a, _b, _c, _d, _e, _f;
|
19488
19519
|
setIsPauseVideo(false);
|
19489
19520
|
const item = data[index];
|
@@ -19500,9 +19531,9 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19500
19531
|
(_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.play();
|
19501
19532
|
setIsLoadFinish(true);
|
19502
19533
|
}, []);
|
19503
|
-
useCallback((type) => () => {
|
19504
|
-
var _a, _b, _c, _d, _e;
|
19505
|
-
if (!isLoadFinish)
|
19534
|
+
const handleClickVideo = useCallback((type) => () => {
|
19535
|
+
var _a, _b, _c, _d, _e, _f;
|
19536
|
+
if (!isActive || !(videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) || !isLoadFinish)
|
19506
19537
|
return;
|
19507
19538
|
const isPause = (_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.paused;
|
19508
19539
|
switch (type) {
|
@@ -19520,10 +19551,13 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19520
19551
|
break;
|
19521
19552
|
default:
|
19522
19553
|
if (isPause) {
|
19523
|
-
(_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.
|
19554
|
+
if (((_d = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _d === void 0 ? void 0 : _d.currentTime) >= (rec === null || rec === void 0 ? void 0 : rec.endTime)) {
|
19555
|
+
videoRef.current.currentTime = rec === null || rec === void 0 ? void 0 : rec.startTime;
|
19556
|
+
}
|
19557
|
+
(_e = videoRef.current) === null || _e === void 0 ? void 0 : _e.play();
|
19524
19558
|
}
|
19525
19559
|
else {
|
19526
|
-
(
|
19560
|
+
(_f = videoRef.current) === null || _f === void 0 ? void 0 : _f.pause();
|
19527
19561
|
}
|
19528
19562
|
setIsPauseVideo(!isPause);
|
19529
19563
|
break;
|
@@ -19547,7 +19581,7 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19547
19581
|
? `translateY(-${50 + ((_a = videoPostConfig === null || videoPostConfig === void 0 ? void 0 : videoPostConfig.offsetTop) !== null && _a !== void 0 ? _a : 0)}%) translate3d(0px, 0px, 0px)`
|
19548
19582
|
: 'translateY(-50%)';
|
19549
19583
|
}, [videoPostConfig]);
|
19550
|
-
|
19584
|
+
useCallback(() => {
|
19551
19585
|
if (!canvasRef || !videoRef || !videoRef.current || !canvasRef.current)
|
19552
19586
|
return;
|
19553
19587
|
const video = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current;
|
@@ -19561,36 +19595,34 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19561
19595
|
setFirstFrameSrc(canvas.toDataURL());
|
19562
19596
|
}, []);
|
19563
19597
|
const handleTimeUpload = useCallback(() => {
|
19564
|
-
var _a
|
19598
|
+
var _a;
|
19565
19599
|
if (!videoRef.current)
|
19566
19600
|
return;
|
19567
|
-
|
19568
|
-
|
19569
|
-
|
19601
|
+
const localTime = ((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.currentTime) - (rec === null || rec === void 0 ? void 0 : rec.startTime);
|
19602
|
+
handleUpdateTimeline === null || handleUpdateTimeline === void 0 ? void 0 : handleUpdateTimeline(index, localTime);
|
19603
|
+
setTimeout(() => {
|
19604
|
+
var _a, _b;
|
19605
|
+
if (((_a = videoRef === null || videoRef === void 0 ? void 0 : videoRef.current) === null || _a === void 0 ? void 0 : _a.currentTime) >= ((_b = rec === null || rec === void 0 ? void 0 : rec.endTime) !== null && _b !== void 0 ? _b : 0)) {
|
19606
|
+
slideSwiper();
|
19607
|
+
}
|
19608
|
+
});
|
19570
19609
|
}, []);
|
19571
|
-
const
|
19572
|
-
var _a, _b, _c, _d, _e, _f;
|
19573
|
-
|
19574
|
-
|
19575
|
-
if (!loopPlay)
|
19610
|
+
const slideSwiper = () => {
|
19611
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
19612
|
+
(_a = videoRef.current) === null || _a === void 0 ? void 0 : _a.pause();
|
19613
|
+
if (!loopPlayRef.current)
|
19576
19614
|
return;
|
19577
19615
|
if (index === (data === null || data === void 0 ? void 0 : data.length) - 1) {
|
19578
|
-
(
|
19616
|
+
(_c = (_b = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _b === void 0 ? void 0 : _b.swiper) === null || _c === void 0 ? void 0 : _c.slideTo(0);
|
19579
19617
|
}
|
19580
19618
|
else {
|
19581
|
-
const i = (
|
19582
|
-
(
|
19619
|
+
const i = (_e = (_d = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _d === void 0 ? void 0 : _d.swiper) === null || _e === void 0 ? void 0 : _e.activeIndex;
|
19620
|
+
(_g = (_f = swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current) === null || _f === void 0 ? void 0 : _f.swiper) === null || _g === void 0 ? void 0 : _g.slideTo(i + 1);
|
19583
19621
|
}
|
19584
19622
|
};
|
19585
|
-
|
19586
|
-
|
19587
|
-
|
19588
|
-
// if (!loopPlay) {
|
19589
|
-
// videoRef?.current?.pause();
|
19590
|
-
// } else {
|
19591
|
-
// videoRef?.current?.play();
|
19592
|
-
// }
|
19593
|
-
// }, [loopPlay, isActive]);
|
19623
|
+
const handlePause = () => {
|
19624
|
+
setIsPauseVideo(true);
|
19625
|
+
};
|
19594
19626
|
useEffect(() => {
|
19595
19627
|
var _a, _b, _c;
|
19596
19628
|
if (!isActive)
|
@@ -19636,8 +19668,8 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19636
19668
|
(_c = videoRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener('pause', handlePause);
|
19637
19669
|
(_d = videoRef.current) === null || _d === void 0 ? void 0 : _d.removeEventListener('timeupdate', handleTimeUpload);
|
19638
19670
|
};
|
19639
|
-
}, [
|
19640
|
-
useMemo(() => {
|
19671
|
+
}, [isActive]);
|
19672
|
+
const renderPoster = useMemo(() => {
|
19641
19673
|
if (!(sxpParameter === null || sxpParameter === void 0 ? void 0 : sxpParameter.placeholder_image) || isLoadFinish) {
|
19642
19674
|
return null;
|
19643
19675
|
}
|
@@ -19654,22 +19686,43 @@ const VideoWidget = ({ rec, index, height, data, muted, activeIndex, videoPostCo
|
|
19654
19686
|
if (!(rec === null || rec === void 0 ? void 0 : rec.mediaUrl)) {
|
19655
19687
|
return null;
|
19656
19688
|
}
|
19689
|
+
// const renderLoading = useMemo(() => {
|
19690
|
+
// if (!waiting || !isLoadFinish) return;
|
19691
|
+
// return (
|
19692
|
+
// <img
|
19693
|
+
// style={{
|
19694
|
+
// position: 'absolute',
|
19695
|
+
// top: '50%',
|
19696
|
+
// left: 0,
|
19697
|
+
// right: 0,
|
19698
|
+
// transform: 'translateY(-100%)',
|
19699
|
+
// margin: 'auto',
|
19700
|
+
// width: '50px',
|
19701
|
+
// height: '50px',
|
19702
|
+
// objectFit: 'contain'
|
19703
|
+
// }}
|
19704
|
+
// src={loading_gif}
|
19705
|
+
// alt='placeholder image'
|
19706
|
+
// />
|
19707
|
+
// );
|
19708
|
+
// }, [waiting, isLoadFinish]);
|
19657
19709
|
return (React.createElement("div", { className: 'video-container', key: rec.itemId, style: {
|
19658
19710
|
position: 'relative',
|
19659
19711
|
width: '100%',
|
19660
19712
|
height,
|
19661
|
-
overflow: 'hidden'
|
19662
|
-
|
19663
|
-
} },
|
19664
|
-
|
19665
|
-
};
|
19713
|
+
overflow: 'hidden'
|
19714
|
+
}, onClick: handleClickVideo() },
|
19715
|
+
React.createElement("div", { className: 'n-full-screen', id: videoId, style: { width: '100%', height: '100%' } }),
|
19716
|
+
renderPoster,
|
19717
|
+
isPauseVideo && React.createElement(FormatImage$1, { className: 'clc-pb-video-pause', src: videoPlayIcon !== null && videoPlayIcon !== void 0 ? videoPlayIcon : PAUSE_ICON, alt: 'pause' })));
|
19718
|
+
});
|
19666
19719
|
var VideoWidget$1 = memo(VideoWidget);
|
19667
19720
|
|
19668
19721
|
/*
|
19669
19722
|
* @Author: binruan@chatlabs.com
|
19670
19723
|
* @Date: 2025-03-25 13:54:27
|
19671
19724
|
* @LastEditors: binruan@chatlabs.com
|
19672
|
-
* @LastEditTime: 2025-03-
|
19725
|
+
* @LastEditTime: 2025-03-31 14:29:21
|
19673
19726
|
* @FilePath: \pb-sxp-ui\src\core\components\DiyStoryPreview\index.tsx
|
19674
19727
|
*
|
19675
19728
|
*/
|
@@ -19857,9 +19910,10 @@ Object.values(_materials_).forEach((v) => {
|
|
19857
19910
|
});
|
19858
19911
|
const defaultUnLikeIconPath = '/pb_static/f71266d2c64446c5ae6a5a7f5489cc0a.png';
|
19859
19912
|
const defaultLikeIconPath = '/pb_static/f07900fe3f0f4ae188ea1611d4801a44.png';
|
19860
|
-
const DiyStoryPreview = ({ data = [], globalConfig, tipText, nudge, tempMap, descStyle, hashTagStyle, containerHeight = 664, containerWidth = 375, appDomain, tagList = [], scenes, onActiveChange, activeIndex, loopPlay = false, pointerEvents = 'none' }) => {
|
19861
|
-
const
|
19913
|
+
const DiyStoryPreview = forwardRef(({ data = [], globalConfig, tipText, nudge, tempMap, descStyle, hashTagStyle, containerHeight = 664, containerWidth = 375, appDomain, tagList = [], scenes, onActiveChange, activeIndex, loopPlay = false, pointerEvents = 'none', onUpdateTimeLine, disabledListener }, ref) => {
|
19914
|
+
const videoWidgetRef = useRef(null);
|
19862
19915
|
const swiperRef = useRef(null);
|
19916
|
+
const [curIndex, setCurIndex] = useState(0);
|
19863
19917
|
useMemo(() => {
|
19864
19918
|
let minusHeight = 0;
|
19865
19919
|
if ((globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.logoUrl) && (globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.isShowLogo)) {
|
@@ -19870,6 +19924,32 @@ const DiyStoryPreview = ({ data = [], globalConfig, tipText, nudge, tempMap, des
|
|
19870
19924
|
}
|
19871
19925
|
return containerHeight - minusHeight;
|
19872
19926
|
}, [globalConfig, containerHeight, tagList]);
|
19927
|
+
useImperativeHandle(ref, () => {
|
19928
|
+
return {
|
19929
|
+
play() {
|
19930
|
+
var _a;
|
19931
|
+
(_a = videoWidgetRef === null || videoWidgetRef === void 0 ? void 0 : videoWidgetRef.current) === null || _a === void 0 ? void 0 : _a.play();
|
19932
|
+
},
|
19933
|
+
pause() {
|
19934
|
+
var _a;
|
19935
|
+
(_a = videoWidgetRef === null || videoWidgetRef === void 0 ? void 0 : videoWidgetRef.current) === null || _a === void 0 ? void 0 : _a.pause();
|
19936
|
+
},
|
19937
|
+
slideTo(n) {
|
19938
|
+
var _a, _b;
|
19939
|
+
if (!(swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current))
|
19940
|
+
return;
|
19941
|
+
(_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(n);
|
19942
|
+
},
|
19943
|
+
isPlaying() {
|
19944
|
+
var _a, _b;
|
19945
|
+
return (_b = (_a = videoWidgetRef === null || videoWidgetRef === void 0 ? void 0 : videoWidgetRef.current) === null || _a === void 0 ? void 0 : _a.isPlaying()) !== null && _b !== void 0 ? _b : false;
|
19946
|
+
},
|
19947
|
+
setLoopPlay(v) {
|
19948
|
+
var _a;
|
19949
|
+
(_a = videoWidgetRef === null || videoWidgetRef === void 0 ? void 0 : videoWidgetRef.current) === null || _a === void 0 ? void 0 : _a.setLoopPlay(v);
|
19950
|
+
}
|
19951
|
+
};
|
19952
|
+
});
|
19873
19953
|
// 判断是否是视频
|
19874
19954
|
const isVideoUrl = (url) => {
|
19875
19955
|
if (url && url !== '' && typeof url === 'string') {
|
@@ -19884,10 +19964,10 @@ const DiyStoryPreview = ({ data = [], globalConfig, tipText, nudge, tempMap, des
|
|
19884
19964
|
const renderContent = (rec, index) => {
|
19885
19965
|
const isVideo = isVideoUrl(rec === null || rec === void 0 ? void 0 : rec.mediaUrl);
|
19886
19966
|
if (isVideo) {
|
19887
|
-
return (React.createElement(VideoWidget$1, { rec: rec, index: index, muted: true, width: containerWidth, data: scenes !== null && scenes !== void 0 ? scenes : [], height: containerHeight, activeIndex: index, videoPostConfig: globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.videoPost, swiperRef: swiperRef, loopPlay:
|
19967
|
+
return (React.createElement(VideoWidget$1, Object.assign({ key: index }, (curIndex === index && { ref: videoWidgetRef }), { rec: rec, index: index, muted: true, width: containerWidth, data: scenes !== null && scenes !== void 0 ? scenes : [], height: containerHeight, activeIndex: index, videoPostConfig: globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.videoPost, videoPlayIcon: globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.videoPlayIcon, swiperRef: swiperRef, loopPlay: loopPlay, handleUpdateTimeline: onUpdateTimeLine })));
|
19888
19968
|
}
|
19889
19969
|
else {
|
19890
|
-
return (React.createElement(PictureGroup$1, { key: rec.itemId, imgUrls: [rec === null || rec === void 0 ? void 0 : rec.mediaUrl], width: containerWidth, height: containerHeight, rec: rec, index: index, imgUrlsPostConfig: globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.imgUrlsPost, data: scenes !== null && scenes !== void 0 ? scenes : [], swiperRef: swiperRef
|
19970
|
+
return (React.createElement(PictureGroup$1, { key: rec.itemId, imgUrls: [rec === null || rec === void 0 ? void 0 : rec.mediaUrl], width: containerWidth, height: containerHeight, rec: rec, index: index, imgUrlsPostConfig: globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.imgUrlsPost, data: scenes !== null && scenes !== void 0 ? scenes : [], swiperRef: swiperRef }));
|
19891
19971
|
}
|
19892
19972
|
};
|
19893
19973
|
useMemo(() => {
|
@@ -20004,6 +20084,7 @@ const DiyStoryPreview = ({ data = [], globalConfig, tipText, nudge, tempMap, des
|
|
20004
20084
|
var _a, _b, _c, _d;
|
20005
20085
|
const rec = cloneDeep(recData);
|
20006
20086
|
rec.video.bindProducts = item === null || item === void 0 ? void 0 : item.bindProducts;
|
20087
|
+
rec.video.title = (item === null || item === void 0 ? void 0 : item.title) || '';
|
20007
20088
|
return (React.createElement("div", { style: { position: 'relative' } },
|
20008
20089
|
React.createElement(SwiperSlide, { key: index, virtualIndex: index, style: { overflow: 'hidden', position: 'relative' } },
|
20009
20090
|
renderBottom(rec, index),
|
@@ -20024,35 +20105,45 @@ const DiyStoryPreview = ({ data = [], globalConfig, tipText, nudge, tempMap, des
|
|
20024
20105
|
return;
|
20025
20106
|
(_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(activeIndex);
|
20026
20107
|
}, [activeIndex]);
|
20108
|
+
const handleSessionExpire = useCallback(debounce(() => {
|
20109
|
+
var _a;
|
20110
|
+
(_a = videoWidgetRef.current) === null || _a === void 0 ? void 0 : _a.setLoopPlay(false);
|
20111
|
+
}, 1000), []);
|
20027
20112
|
useEffect(() => {
|
20028
|
-
|
20029
|
-
if (!(swiperRef === null || swiperRef === void 0 ? void 0 : swiperRef.current))
|
20113
|
+
if (disabledListener)
|
20030
20114
|
return;
|
20031
|
-
|
20032
|
-
|
20115
|
+
const events = ['touchstart', 'touchcancel'];
|
20116
|
+
events.forEach((event) => {
|
20117
|
+
window.addEventListener(event, handleSessionExpire);
|
20118
|
+
});
|
20119
|
+
return () => {
|
20120
|
+
events.forEach((event) => {
|
20121
|
+
window.removeEventListener(event, handleSessionExpire);
|
20122
|
+
});
|
20123
|
+
};
|
20124
|
+
}, [handleSessionExpire, disabledListener]);
|
20033
20125
|
return (React.createElement("div", { id: 'sxp-render',
|
20034
20126
|
// className={style['clc-sxp-container']}
|
20035
20127
|
style: { height: containerHeight, position: 'relative', pointerEvents } },
|
20036
20128
|
React.createElement(Swiper, { ref: swiperRef, allowTouchMove: pointerEvents !== 'none', onSlideChange: () => {
|
20037
|
-
setLooPlaySwiper(false);
|
20038
20129
|
swiperRef.current.swiper.allowTouchMove = false;
|
20039
20130
|
setTimeout(() => {
|
20040
20131
|
swiperRef.current.swiper.allowTouchMove = true;
|
20041
20132
|
}, 500);
|
20042
20133
|
}, onActiveIndexChange: (swiper) => {
|
20043
|
-
|
20134
|
+
setCurIndex(swiper === null || swiper === void 0 ? void 0 : swiper.activeIndex);
|
20044
20135
|
onActiveChange === null || onActiveChange === void 0 ? void 0 : onActiveChange(swiper.activeIndex);
|
20045
20136
|
}, direction: 'vertical', style: { overflow: 'hidden', height: containerHeight }, height: containerHeight }, scenes === null || scenes === void 0 ? void 0 : scenes.map((rec, index) => {
|
20046
20137
|
return renderView(rec, index);
|
20047
20138
|
}))));
|
20048
|
-
};
|
20139
|
+
});
|
20049
20140
|
var DiyStoryPreview$1 = memo(DiyStoryPreview);
|
20050
20141
|
|
20051
20142
|
/*
|
20052
20143
|
* @Author: binruan@chatlabs.com
|
20053
20144
|
* @Date: 2023-10-31 10:56:01
|
20054
20145
|
* @LastEditors: binruan@chatlabs.com
|
20055
|
-
* @LastEditTime:
|
20146
|
+
* @LastEditTime: 2025-03-28 17:15:47
|
20056
20147
|
* @FilePath: \pb-sxp-ui\src\core\components\SxpPageRender\Popup\index.tsx
|
20057
20148
|
*
|
20058
20149
|
*/
|
@@ -20146,7 +20237,7 @@ const Popup = () => {
|
|
20146
20237
|
* @Author: binruan@chatlabs.com
|
20147
20238
|
* @Date: 2024-03-20 10:27:31
|
20148
20239
|
* @LastEditors: binruan@chatlabs.com
|
20149
|
-
* @LastEditTime: 2025-03-
|
20240
|
+
* @LastEditTime: 2025-03-28 16:55:21
|
20150
20241
|
* @FilePath: \pb-sxp-ui\src\core\components\SxpPageCore\index.tsx
|
20151
20242
|
*
|
20152
20243
|
*/
|
@@ -20155,19 +20246,19 @@ Object.values(_materials_).forEach((v) => {
|
|
20155
20246
|
RESOLVER[v.extend.type] = v;
|
20156
20247
|
});
|
20157
20248
|
const SxpPageCore = ({ data, maxSize = 10, defaultSize = 10, hashTagSize = 20, loadingImage, appDomain, enabledMetaConversionApi, dataList, pointerEvents }) => {
|
20158
|
-
var _a, _b, _c, _d, _e, _f;
|
20249
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
20159
20250
|
const utmVal = useMemo(() => {
|
20160
20251
|
var _a;
|
20161
20252
|
const searchParams = (location === null || location === void 0 ? void 0 : location.search) ? (_a = location === null || location === void 0 ? void 0 : location.search) === null || _a === void 0 ? void 0 : _a.replace('?', '') : '';
|
20162
20253
|
return searchParams;
|
20163
20254
|
}, []);
|
20164
|
-
const [_schema, setSchema] = useState(data === null || data === void 0 ? void 0 : data.data);
|
20255
|
+
const [_schema, setSchema] = useState((_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.data);
|
20165
20256
|
const [channel, setChannel] = useState();
|
20166
20257
|
return (React.createElement(EditorCore, { resolver: RESOLVER, enableDataSource: false, schema: _schema, utmVal: channel || utmVal },
|
20167
|
-
React.createElement(SxpDataSourceProvider$1, { utmVal: utmVal, dataSources: data === null || data === void 0 ? void 0 : data.data_sources, sxpParameter: data === null || data === void 0 ? void 0 : data.sxp_parameter, maxSize: (
|
20168
|
-
var _a;
|
20258
|
+
React.createElement(SxpDataSourceProvider$1, { utmVal: utmVal, dataSources: data === null || data === void 0 ? void 0 : data.data_sources, sxpParameter: data === null || data === void 0 ? void 0 : data.sxp_parameter, maxSize: (_c = (_b = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _b === void 0 ? void 0 : _b.personalized_recommend) !== null && _c !== void 0 ? _c : maxSize, defaultSize: (_e = (_d = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _d === void 0 ? void 0 : _d.default_recommend) !== null && _e !== void 0 ? _e : defaultSize, hashTagSize: (_g = (_f = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _f === void 0 ? void 0 : _f.hash_tag_size) !== null && _g !== void 0 ? _g : hashTagSize, loadingImage: loadingImage, appDomain: appDomain, enabledMetaConversionApi: enabledMetaConversionApi, utmParameter: data === null || data === void 0 ? void 0 : data.utm_parameter, data: Object.assign(Object.assign({}, data), { data: (_h = data === null || data === void 0 ? void 0 : data.data) === null || _h === void 0 ? void 0 : _h.data }), dataList: dataList, onUpdateSchema: (d) => setSchema(d), onUpdateChannel: (d) => setChannel(d), render: ({ rtcList, tagList, pageData }) => {
|
20259
|
+
var _a, _b;
|
20169
20260
|
return (React.createElement(React.Fragment, null,
|
20170
|
-
React.createElement(DiyStoryPreview$1, Object.assign({ defaultData: data }, (
|
20261
|
+
React.createElement(DiyStoryPreview$1, Object.assign({ defaultData: Object.assign(Object.assign({}, data), { data: (_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.data }) }, (_b = pageData === null || pageData === void 0 ? void 0 : pageData.data) === null || _b === void 0 ? void 0 : _b.sxpPageConf, { tagList: tagList, scenes: rtcList, resolver: RESOLVER, containerHeight: window === null || window === void 0 ? void 0 : window.innerHeight, pointerEvents: pointerEvents, loopPlay: true })),
|
20171
20262
|
React.createElement(Popup, null)));
|
20172
20263
|
} })));
|
20173
20264
|
};
|