pb-sxp-ui 1.0.79 → 1.0.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/index.cjs +342 -105
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.css +93 -0
  4. package/dist/index.js +343 -106
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.min.cjs +3 -3
  7. package/dist/index.min.cjs.map +1 -1
  8. package/dist/index.min.js +3 -3
  9. package/dist/index.min.js.map +1 -1
  10. package/dist/pb-ui.js +342 -105
  11. package/dist/pb-ui.js.map +1 -1
  12. package/dist/pb-ui.min.js +3 -3
  13. package/dist/pb-ui.min.js.map +1 -1
  14. package/es/core/Pagebuilder/type.d.ts +7 -0
  15. package/es/core/components/Consent/index.d.ts +13 -0
  16. package/es/core/components/Consent/index.js +60 -0
  17. package/es/core/components/SxpPageCore/index.js +2 -2
  18. package/es/core/components/SxpPageRender/Tagbar.js +15 -1
  19. package/es/core/components/SxpPageRender/WaterFall/List.d.ts +1 -1
  20. package/es/core/components/SxpPageRender/WaterFall/List.js +15 -9
  21. package/es/core/components/SxpPageRender/WaterFall/WaterfallList.d.ts +1 -1
  22. package/es/core/components/SxpPageRender/WaterFall/WaterfallList.js +18 -12
  23. package/es/core/components/SxpPageRender/WaterFall/index.js +7 -2
  24. package/es/core/components/SxpPageRender/index.d.ts +2 -1
  25. package/es/core/components/SxpPageRender/index.js +29 -32
  26. package/es/core/components/SxpPageRender/typing.d.ts +1 -0
  27. package/es/core/context/EditorDataProvider.d.ts +9 -0
  28. package/es/core/context/EditorDataProvider.js +13 -3
  29. package/es/core/context/SxpDataSourceProvider.d.ts +10 -0
  30. package/es/core/context/SxpDataSourceProvider.js +58 -18
  31. package/es/core/hooks/useEventReport.d.ts +1 -0
  32. package/es/core/hooks/useEventReport.js +13 -1
  33. package/es/core/utils/localStore.d.ts +1 -0
  34. package/es/core/utils/localStore.js +1 -0
  35. package/es/materials/sxp/Consent/index.d.ts +12 -0
  36. package/es/materials/sxp/Consent/index.js +5 -0
  37. package/es/materials/sxp/Consent/material.d.ts +2 -0
  38. package/es/materials/sxp/Consent/material.js +20 -0
  39. package/es/materials/sxp/Consent/settingRender.d.ts +31 -0
  40. package/es/materials/sxp/Consent/settingRender.js +39 -0
  41. package/es/materials/sxp/HashTag/index.d.ts +1 -1
  42. package/es/materials/sxp/HashTag/settingRender.d.ts +9 -0
  43. package/es/materials/sxp/HashTag/settingRender.js +2 -1
  44. package/es/materials/sxp/index.d.ts +1 -0
  45. package/es/materials/sxp/index.js +1 -0
  46. package/lib/core/Pagebuilder/type.d.ts +7 -0
  47. package/lib/core/components/Consent/index.d.ts +13 -0
  48. package/lib/core/components/Consent/index.js +63 -0
  49. package/lib/core/components/SxpPageCore/index.js +2 -2
  50. package/lib/core/components/SxpPageRender/Tagbar.js +15 -1
  51. package/lib/core/components/SxpPageRender/WaterFall/List.d.ts +1 -1
  52. package/lib/core/components/SxpPageRender/WaterFall/List.js +15 -9
  53. package/lib/core/components/SxpPageRender/WaterFall/WaterfallList.d.ts +1 -1
  54. package/lib/core/components/SxpPageRender/WaterFall/WaterfallList.js +18 -12
  55. package/lib/core/components/SxpPageRender/WaterFall/index.js +7 -2
  56. package/lib/core/components/SxpPageRender/index.d.ts +2 -1
  57. package/lib/core/components/SxpPageRender/index.js +29 -32
  58. package/lib/core/components/SxpPageRender/typing.d.ts +1 -0
  59. package/lib/core/context/EditorDataProvider.d.ts +9 -0
  60. package/lib/core/context/EditorDataProvider.js +13 -3
  61. package/lib/core/context/SxpDataSourceProvider.d.ts +10 -0
  62. package/lib/core/context/SxpDataSourceProvider.js +57 -17
  63. package/lib/core/hooks/useEventReport.d.ts +1 -0
  64. package/lib/core/hooks/useEventReport.js +13 -1
  65. package/lib/core/utils/localStore.d.ts +1 -0
  66. package/lib/core/utils/localStore.js +2 -1
  67. package/lib/materials/sxp/Consent/index.d.ts +12 -0
  68. package/lib/materials/sxp/Consent/index.js +8 -0
  69. package/lib/materials/sxp/Consent/material.d.ts +2 -0
  70. package/lib/materials/sxp/Consent/material.js +24 -0
  71. package/lib/materials/sxp/Consent/settingRender.d.ts +31 -0
  72. package/lib/materials/sxp/Consent/settingRender.js +41 -0
  73. package/lib/materials/sxp/HashTag/index.d.ts +1 -1
  74. package/lib/materials/sxp/HashTag/settingRender.d.ts +9 -0
  75. package/lib/materials/sxp/HashTag/settingRender.js +2 -1
  76. package/lib/materials/sxp/index.d.ts +1 -0
  77. package/lib/materials/sxp/index.js +1 -0
  78. package/package.json +1 -1
@@ -2,9 +2,10 @@ import { __awaiter } from "tslib";
2
2
  import React, { createContext, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import qs from 'qs';
4
4
  import { storeAndLoadFeSessionId } from '../utils/sessionStore';
5
- import { storeAndLoadFeUserId } from '../utils/localStore';
5
+ import { storeAndLoadFeUserId, AGREE_POLICY } from '../utils/localStore';
6
6
  import { useIconLink } from '../components/SxpPageRender/useIconLink';
7
7
  import SXP_EVENT_BUS, { SXP_EVENT_TYPE } from '../utils/event';
8
+ import Consent from '../components/Consent';
8
9
  export const SxpDataSourceContext = createContext({
9
10
  rtcList: [],
10
11
  tagList: []
@@ -14,13 +15,15 @@ var DataSourceType;
14
15
  DataSourceType[DataSourceType["BFF"] = 5] = "BFF";
15
16
  })(DataSourceType || (DataSourceType = {}));
16
17
  const UTM_KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_id', 'utm_content', 'cl_source'];
17
- const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent = true, maxSize, defaultSize, isPreview = false, sxpParameter, appDomain, hashTagSize, loadingImage, isOpenHashTag = false, enabledMetaConversionApi = false, isShowTag = true }) => {
18
+ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent = true, maxSize, defaultSize, isPreview = false, sxpParameter, appDomain, hashTagSize, loadingImage, isOpenHashTag = false, enabledMetaConversionApi = false, consentHeight, consentWidth, isShowTag = true, isOpenConsent = false, globalConfig }) => {
19
+ var _a, _b, _c, _d, _e, _f, _g;
18
20
  const [rtcList, setRtcList] = useState([]);
19
21
  const [tagList, setTagList] = useState([]);
20
22
  const [loading, setLoading] = useState(false);
21
23
  const [curReqInfo, setCurReqInfo] = useState({ rtc: '', requestId: '' });
22
24
  const swiperRef = useRef(null);
23
25
  const isInit = useRef(false);
26
+ const [isAgreePolicy, setIsAgreePolicy] = useState(() => !!window.localStorage.getItem(AGREE_POLICY));
24
27
  const [popupDetailData, setPopupDetailData] = useState();
25
28
  const [waterFallData, setWaterFallData] = useState();
26
29
  const [openHashtag, setOpenHashtag] = useState(isOpenHashTag);
@@ -29,6 +32,7 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
29
32
  const [isFromHashtag, setIsFromHashtag] = useState(false);
30
33
  const [videoRef, setVideoRef] = useState(null);
31
34
  const themeTag = useRef();
35
+ const curTime = useRef();
32
36
  useEffect(() => {
33
37
  const handleChangeThemeTag = (tag) => {
34
38
  themeTag.current = tag;
@@ -68,10 +72,10 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
68
72
  .catch((err) => Promise.reject(err));
69
73
  }, [bffDataSource]);
70
74
  const getRecommendVideos = useCallback((query) => __awaiter(void 0, void 0, void 0, function* () {
71
- var _a, _b, _c, _d, _e;
75
+ var _h, _j, _k, _l, _m;
72
76
  query = {
73
- maxSize: (_a = query === null || query === void 0 ? void 0 : query.maxSize) !== null && _a !== void 0 ? _a : maxSize,
74
- defaultSize: (_b = query === null || query === void 0 ? void 0 : query.defaultSize) !== null && _b !== void 0 ? _b : defaultSize,
77
+ maxSize: (_h = query === null || query === void 0 ? void 0 : query.maxSize) !== null && _h !== void 0 ? _h : maxSize,
78
+ defaultSize: (_j = query === null || query === void 0 ? void 0 : query.defaultSize) !== null && _j !== void 0 ? _j : defaultSize,
75
79
  'itemFilter.itemId': query === null || query === void 0 ? void 0 : query['itemFilter.itemId'],
76
80
  'itemFilter.itemType': query === null || query === void 0 ? void 0 : query['itemFilter.itemType'],
77
81
  hashTag: query === null || query === void 0 ? void 0 : query.hashTag,
@@ -79,10 +83,10 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
79
83
  themeTag: query === null || query === void 0 ? void 0 : query.themeTag
80
84
  };
81
85
  if (utmVal) {
82
- const val = (_e = (_d = (_c = utmVal === null || utmVal === void 0 ? void 0 : utmVal.split('&')) === null || _c === void 0 ? void 0 : _c.filter((val) => {
86
+ const val = (_m = (_l = (_k = utmVal === null || utmVal === void 0 ? void 0 : utmVal.split('&')) === null || _k === void 0 ? void 0 : _k.filter((val) => {
83
87
  const key = val.split('=')[0];
84
88
  return UTM_KEYS.includes(key);
85
- })) === null || _d === void 0 ? void 0 : _d.join('&')) !== null && _e !== void 0 ? _e : '';
89
+ })) === null || _l === void 0 ? void 0 : _l.join('&')) !== null && _m !== void 0 ? _m : '';
86
90
  query = Object.assign(Object.assign({}, query), { channel: decodeURIComponent(val) });
87
91
  }
88
92
  const result = yield (bffFetch === null || bffFetch === void 0 ? void 0 : bffFetch('/recommend/list', { method: 'GET', query }));
@@ -94,7 +98,7 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
94
98
  return result === null || result === void 0 ? void 0 : result.data;
95
99
  }), [bffFetch, utmVal, maxSize, defaultSize]);
96
100
  const loadVideos = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
97
- var _f, _g;
101
+ var _o, _p;
98
102
  if (rtcList.length <= 0) {
99
103
  return;
100
104
  }
@@ -104,8 +108,8 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
104
108
  'itemFilter.itemType': waterFallData === null || waterFallData === void 0 ? void 0 : waterFallData.itemType,
105
109
  themeTag: themeTag.current
106
110
  });
107
- setRtcList(rtcList.concat((_f = data === null || data === void 0 ? void 0 : data.recList) !== null && _f !== void 0 ? _f : []));
108
- setCacheRtcList(cacheRtcList.concat((_g = data === null || data === void 0 ? void 0 : data.recList) !== null && _g !== void 0 ? _g : []));
111
+ setRtcList(rtcList.concat((_o = data === null || data === void 0 ? void 0 : data.recList) !== null && _o !== void 0 ? _o : []));
112
+ setCacheRtcList(cacheRtcList.concat((_p = data === null || data === void 0 ? void 0 : data.recList) !== null && _p !== void 0 ? _p : []));
109
113
  }), [getRecommendVideos, rtcList, waterFallData, cacheRtcList]);
110
114
  const bffEventReport = useCallback(({ userInfo, eventInfo }) => {
111
115
  if (!enableReportEvent) {
@@ -163,16 +167,16 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
163
167
  return res === null || res === void 0 ? void 0 : res.success;
164
168
  }), [bffFetch]);
165
169
  const bffGetTagList = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
166
- var _h, _j, _k, _l, _m;
170
+ var _q, _r, _s, _t, _u;
167
171
  if (!utmVal || !isShowTag)
168
172
  return;
169
173
  try {
170
- const val = (_k = (_j = (_h = utmVal === null || utmVal === void 0 ? void 0 : utmVal.split('&')) === null || _h === void 0 ? void 0 : _h.filter((val) => {
174
+ const val = (_s = (_r = (_q = utmVal === null || utmVal === void 0 ? void 0 : utmVal.split('&')) === null || _q === void 0 ? void 0 : _q.filter((val) => {
171
175
  const key = val.split('=')[0];
172
176
  return UTM_KEYS.includes(key);
173
- })) === null || _j === void 0 ? void 0 : _j.join('&')) !== null && _k !== void 0 ? _k : '';
177
+ })) === null || _r === void 0 ? void 0 : _r.join('&')) !== null && _s !== void 0 ? _s : '';
174
178
  const result = yield (bffFetch === null || bffFetch === void 0 ? void 0 : bffFetch('/tag/list', { method: 'GET', query: { channel: decodeURIComponent(val) } }));
175
- setTagList((_m = (_l = result === null || result === void 0 ? void 0 : result.data) === null || _l === void 0 ? void 0 : _l.tags) !== null && _m !== void 0 ? _m : []);
179
+ setTagList((_u = (_t = result === null || result === void 0 ? void 0 : result.data) === null || _t === void 0 ? void 0 : _t.tags) !== null && _u !== void 0 ? _u : []);
176
180
  }
177
181
  catch (e) {
178
182
  console.log('e', e);
@@ -196,7 +200,38 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
196
200
  eventInfo: Object.assign(Object.assign({}, eventInfo), { ctaId: (_h = cta === null || cta === void 0 ? void 0 : cta.itemId) !== null && _h !== void 0 ? _h : '', ctaName: (_j = cta === null || cta === void 0 ? void 0 : cta.title) !== null && _j !== void 0 ? _j : '', contentTags: JSON.stringify(cta === null || cta === void 0 ? void 0 : cta.tags), position: position + '', contentId: (_l = (_k = rec === null || rec === void 0 ? void 0 : rec.video) === null || _k === void 0 ? void 0 : _k.itemId) !== null && _l !== void 0 ? _l : '', productId: isProd ? product === null || product === void 0 ? void 0 : product.itemId : '', traceInfo: (_m = cta === null || cta === void 0 ? void 0 : cta.traceInfo) !== null && _m !== void 0 ? _m : '', fromKName })
197
201
  });
198
202
  }, [bffEventReport, isFromHashtag]);
203
+ const h5EnterLink = useCallback(() => {
204
+ var _a, _b;
205
+ const queryString = location.search.slice(1);
206
+ const params = qs.parse(queryString.replace(/\+/g, '%2B'));
207
+ for (const key in params) {
208
+ params[key] = params[key].replace(/%2B/g, '+');
209
+ }
210
+ const getVal = (key) => { var _a; return (_a = params[key]) !== null && _a !== void 0 ? _a : ''; };
211
+ const time = new Date();
212
+ curTime.current = time;
213
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
214
+ eventInfo: {
215
+ eventSubject: 'h5LinkEnterFeed',
216
+ eventDescription: 'User enter h5 link',
217
+ utmSource: getVal('utm_source'),
218
+ utmMedium: getVal('utm_medium'),
219
+ utmCampaign: getVal('utm_campaign'),
220
+ utmId: getVal('utm_id'),
221
+ utmContent: getVal('utm_content'),
222
+ enterTime: Math.floor(time / 1000) + '',
223
+ requestId: null,
224
+ enterUrl: (_b = (_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.href) !== null && _b !== void 0 ? _b : '',
225
+ clSource: getVal('cl_source')
226
+ }
227
+ });
228
+ }, [bffEventReport]);
199
229
  useEffect(() => {
230
+ h5EnterLink();
231
+ }, []);
232
+ useEffect(() => {
233
+ if (!isAgreePolicy)
234
+ return;
200
235
  setLoading(true);
201
236
  bffGetTagList();
202
237
  getRecommendVideos()
@@ -215,7 +250,7 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
215
250
  setLoading(false);
216
251
  isInit.current = true;
217
252
  });
218
- }, []);
253
+ }, [isAgreePolicy]);
219
254
  useEffect(() => {
220
255
  if (!isInit.current)
221
256
  return;
@@ -267,13 +302,18 @@ const SxpDataSourceProvider = ({ render, dataSources, utmVal, enableReportEvent
267
302
  setLoading,
268
303
  videoRef,
269
304
  setVideoRef,
270
- bffFbReport
271
- } }, render({
305
+ bffFbReport,
306
+ isAgreePolicy,
307
+ setIsAgreePolicy,
308
+ curTime,
309
+ h5EnterLink,
310
+ themeTag
311
+ } }, (((_d = (_c = (_b = (_a = globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.consent) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.item) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.privacy_necessity) && !isAgreePolicy) || isOpenConsent ? (React.createElement(Consent, Object.assign({}, (_g = (_f = (_e = globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.consent) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.item) === null || _g === void 0 ? void 0 : _g.props))) : (render({
272
312
  rtcList,
273
313
  mutateLike: bffMutateLike,
274
314
  mutateUnlike: bffMutateUnlike,
275
315
  submitForm: bffSubmitForm,
276
316
  tagList
277
- })));
317
+ }))));
278
318
  };
279
319
  export default memo(SxpDataSourceProvider);
@@ -2,4 +2,5 @@ import { RecItemType } from '../components/SxpPageRender/typing';
2
2
  export declare function useEventReport(): {
3
3
  jumpToWeb: (data?: RecItemType, product?: RecItemType['product'], cta?: RecItemType['cta'], position?: number) => void;
4
4
  productView: (data?: RecItemType, product?: RecItemType['product'], cta?: RecItemType['cta'], viewTime?: any, position?: number) => void;
5
+ backMainFeed: (lastFeed?: 'theme' | 'branch' | 'external', themeTag?: string, hashTag?: string) => void;
5
6
  };
@@ -66,8 +66,20 @@ export function useEventReport() {
66
66
  }
67
67
  });
68
68
  }, [bffEventReport, popupDetailData]);
69
+ const backMainFeed = useCallback((lastFeed, themeTag, hashTag) => {
70
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
71
+ eventInfo: {
72
+ lastFeed,
73
+ themeTags: themeTag ? `[${themeTag}]` : '',
74
+ hashTags: hashTag ? `[${hashTag}]` : '',
75
+ eventSubject: 'backMainFeed',
76
+ eventDescription: 'back Main Feed'
77
+ }
78
+ });
79
+ }, [bffEventReport]);
69
80
  return {
70
81
  jumpToWeb,
71
- productView
82
+ productView,
83
+ backMainFeed
72
84
  };
73
85
  }
@@ -1,5 +1,6 @@
1
1
  export declare const FAKE_USER_KEY = "SXP_FAKE_USER_ID";
2
2
  export declare const FAKE_USER_STATE = "FAKE_USER_STATE";
3
+ export declare const AGREE_POLICY = "AGREE_POLICY";
3
4
  export declare const storeAndLoadFeUserId: () => string;
4
5
  export declare const removeFeUserId: () => void;
5
6
  export declare const getFeUserId: () => boolean;
@@ -2,6 +2,7 @@ import { isEmpty } from 'lodash';
2
2
  import { uuid } from './tool';
3
3
  export const FAKE_USER_KEY = 'SXP_FAKE_USER_ID';
4
4
  export const FAKE_USER_STATE = 'FAKE_USER_STATE';
5
+ export const AGREE_POLICY = 'AGREE_POLICY';
5
6
  export const storeAndLoadFeUserId = () => {
6
7
  let fakeUserId = window.localStorage.getItem(FAKE_USER_KEY);
7
8
  if (isEmpty(fakeUserId)) {
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ export interface IConsentProps {
3
+ width?: number;
4
+ height?: number;
5
+ privacy_title?: string;
6
+ privacy_context?: string;
7
+ privacy_policy_url?: string;
8
+ privacy_policy_title?: string;
9
+ privacy_necessity?: boolean;
10
+ }
11
+ declare const _default: React.NamedExoticComponent<IConsentProps>;
12
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import React, { memo } from 'react';
2
+ const Consent = (props) => {
3
+ return React.createElement(Consent, Object.assign({}, props));
4
+ };
5
+ export default memo(Consent);
@@ -0,0 +1,2 @@
1
+ declare const Consent: import("../../../core/create").MaterialComponet<import(".").IConsentProps>;
2
+ export { Consent };
@@ -0,0 +1,20 @@
1
+ import settingRender from './settingRender';
2
+ import ConsentComponent from '.';
3
+ import { createMaterial } from '../../../core/create';
4
+ const Consent = createMaterial(ConsentComponent, {
5
+ displayName: 'Consent',
6
+ icon: '',
7
+ category: 'base',
8
+ type: 'Consent',
9
+ related: {
10
+ settingRender
11
+ },
12
+ defaulSetting: {
13
+ props: {},
14
+ style: {}
15
+ },
16
+ w: 100,
17
+ h: 40,
18
+ sort: 1
19
+ });
20
+ export { Consent };
@@ -0,0 +1,31 @@
1
+ declare const _default: {
2
+ title: string;
3
+ child: ({
4
+ type: string;
5
+ label: string;
6
+ name: string[];
7
+ extra: string;
8
+ child?: undefined;
9
+ } | {
10
+ type: string;
11
+ label: string;
12
+ name: string[];
13
+ extra?: undefined;
14
+ child?: undefined;
15
+ } | {
16
+ type: string;
17
+ label: string;
18
+ child: ({
19
+ type: string;
20
+ name: string[];
21
+ addonBefore?: undefined;
22
+ } | {
23
+ type: string;
24
+ name: string[];
25
+ addonBefore: string;
26
+ })[];
27
+ extra: string;
28
+ name?: undefined;
29
+ })[];
30
+ }[];
31
+ export default _default;
@@ -0,0 +1,39 @@
1
+ export default [
2
+ {
3
+ title: '协议详情',
4
+ child: [
5
+ {
6
+ type: 'Switch',
7
+ label: '必须同意用户协议',
8
+ name: ['props', 'privacy_necessity'],
9
+ extra: '当新用户进入页面时,会出现用户协议弹窗,用户需要先同意协议后才能访问内容。'
10
+ },
11
+ {
12
+ type: 'Text',
13
+ label: '弹窗标题',
14
+ name: ['props', 'privacy_title']
15
+ },
16
+ {
17
+ type: 'TextArea',
18
+ label: '用户协议弹窗内容',
19
+ name: ['props', 'privacy_context']
20
+ },
21
+ {
22
+ type: 'Group',
23
+ label: '隐私政策',
24
+ child: [
25
+ {
26
+ type: 'Text',
27
+ name: ['props', 'privacy_policy_title']
28
+ },
29
+ {
30
+ type: 'Text',
31
+ name: ['props', 'privacy_policy_url'],
32
+ addonBefore: 'https://'
33
+ }
34
+ ],
35
+ extra: '当用户点击更多信息按钮时,将会跳转至设置的链接查看政策内容'
36
+ }
37
+ ]
38
+ }
39
+ ];
@@ -12,7 +12,7 @@ export interface IHashTagProps {
12
12
  };
13
13
  buttonBgStyle: CSSProperties;
14
14
  showBanner?: boolean;
15
- isWaterfallFlow?: boolean;
15
+ openFixedSize?: boolean;
16
16
  }
17
17
  declare const _default: React.NamedExoticComponent<IHashTagProps>;
18
18
  export default _default;
@@ -1,14 +1,23 @@
1
1
  declare const _default: ({
2
+ title: string;
3
+ child: {
4
+ type: string;
5
+ label: string;
6
+ name: string[];
7
+ }[];
8
+ } | {
2
9
  title: string;
3
10
  child: ({
4
11
  type: string;
5
12
  label: string;
6
13
  name: string[];
7
14
  addonAfter: string;
15
+ initialValue?: undefined;
8
16
  } | {
9
17
  type: string;
10
18
  label: string;
11
19
  name: string[];
20
+ initialValue: boolean;
12
21
  addonAfter?: undefined;
13
22
  })[];
14
23
  } | {
@@ -23,7 +23,8 @@ export default [
23
23
  {
24
24
  type: 'Switch',
25
25
  label: '固定宽高',
26
- name: ['props', 'isWaterfallFlow']
26
+ name: ['props', 'openFixedSize'],
27
+ initialValue: true
27
28
  }
28
29
  ]
29
30
  },
@@ -1,3 +1,4 @@
1
1
  export * from './popup';
2
2
  export * from './template';
3
3
  export * from './HashTag/material';
4
+ export * from './Consent/material';
@@ -1,3 +1,4 @@
1
1
  export * from './popup';
2
2
  export * from './template';
3
3
  export * from './HashTag/material';
4
+ export * from './Consent/material';
@@ -19,6 +19,13 @@ export interface PageData {
19
19
  placeholder_image: string;
20
20
  hash_tag_size: number;
21
21
  loading_image: string;
22
+ industry?: string;
23
+ privacy_context?: string;
24
+ privacy_necessity?: boolean;
25
+ privacy_policy_title?: string;
26
+ privacy_policy_url?: string;
27
+ privacy_title?: string;
28
+ template?: any | null;
22
29
  };
23
30
  }
24
31
  export interface DataSource {
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import './index.less';
3
+ export interface IConsentProps {
4
+ width?: number;
5
+ height?: number;
6
+ privacy_title?: string;
7
+ privacy_context?: string;
8
+ privacy_policy_url?: string;
9
+ privacy_policy_title?: string;
10
+ privacy_necessity?: boolean;
11
+ }
12
+ declare const _default: React.NamedExoticComponent<IConsentProps>;
13
+ export default _default;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const qs_1 = tslib_1.__importDefault(require("qs"));
6
+ const hooks_1 = require("../../../core/hooks");
7
+ require("./index.less");
8
+ const localStore_1 = require("../../../core/utils/localStore");
9
+ const Consent = ({ width = window.innerWidth, height = window.innerHeight, privacy_title, privacy_context, privacy_policy_url, privacy_policy_title }) => {
10
+ const { setIsAgreePolicy, bffEventReport } = (0, hooks_1.useSxpDataSource)();
11
+ const channelObj = (0, react_1.useMemo)(() => {
12
+ const queryString = location.search.slice(1);
13
+ const params = qs_1.default.parse(queryString.replace(/\+/g, '%2B'));
14
+ for (const key in params) {
15
+ params[key] = params[key].replace(/%2B/g, '+');
16
+ }
17
+ return params;
18
+ }, []);
19
+ const getUtmValue = (key) => { var _a; return (_a = channelObj[key]) !== null && _a !== void 0 ? _a : null; };
20
+ (0, react_1.useEffect)(() => {
21
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
22
+ eventInfo: {
23
+ eventSubject: 'privacyEnter',
24
+ eventDescription: 'User enter privacy page',
25
+ utmSource: getUtmValue('utm_source'),
26
+ utmMedium: getUtmValue('utm_medium'),
27
+ utmCampaign: getUtmValue('utm_campaign'),
28
+ utmId: getUtmValue('utm_id'),
29
+ utmContent: getUtmValue('utm_content'),
30
+ clSource: getUtmValue('cl_source'),
31
+ enterTime: `${Date.now()}`,
32
+ enterUrl: window.location.href,
33
+ rtc: null,
34
+ requestId: null,
35
+ sessionID: null
36
+ }
37
+ });
38
+ }, []);
39
+ const handleAgree = () => {
40
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
41
+ eventInfo: {
42
+ eventSubject: 'userConsent',
43
+ eventDescription: '用户授权【操作结果】',
44
+ consentResult: '0',
45
+ consentTags: '[]',
46
+ rtc: null,
47
+ requestId: null,
48
+ sessionID: null
49
+ }
50
+ });
51
+ setIsAgreePolicy === null || setIsAgreePolicy === void 0 ? void 0 : setIsAgreePolicy(true);
52
+ window.localStorage.setItem(localStore_1.AGREE_POLICY, 'yes');
53
+ };
54
+ return (react_1.default.createElement("div", { className: 'consent-bg' },
55
+ react_1.default.createElement("div", { className: 'consent' },
56
+ react_1.default.createElement("div", { className: 'consent-col' },
57
+ react_1.default.createElement("div", { className: 'consent-title' }, privacy_title !== null && privacy_title !== void 0 ? privacy_title : 'Privacy Policy'),
58
+ react_1.default.createElement("div", { className: 'consent-content' }, privacy_context !== null && privacy_context !== void 0 ? privacy_context : 'This site uses cookies to improve your online experience. By continuing to use the site please agree the policy first.')),
59
+ react_1.default.createElement("div", { className: 'consent-col' },
60
+ react_1.default.createElement("button", { className: 'consent-btn', onClick: handleAgree }, "Agree"),
61
+ react_1.default.createElement("a", { className: 'consent-policy', target: '_blank', href: privacy_policy_url }, privacy_policy_title !== null && privacy_policy_title !== void 0 ? privacy_policy_title : 'More information')))));
62
+ };
63
+ exports.default = (0, react_1.memo)(Consent);
@@ -12,14 +12,14 @@ Object.values(_materials_).forEach((v) => {
12
12
  RESOLVER[v.extend.type] = v;
13
13
  });
14
14
  const SxpPageCore = ({ data, maxSize = 10, defaultSize = 10, hashTagSize = 20, loadingImage, appDomain, licenseUrl, enabledMetaConversionApi }) => {
15
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
15
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
16
16
  const utmVal = (0, react_1.useMemo)(() => {
17
17
  var _a;
18
18
  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('?', '') : '';
19
19
  return searchParams;
20
20
  }, []);
21
21
  return (react_1.default.createElement(core_1.EditorCore, { resolver: RESOLVER, enableDataSource: false, schema: data === null || data === void 0 ? void 0 : data.data, utmVal: utmVal },
22
- react_1.default.createElement(SxpDataSourceProvider_1.default, { 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: (_b = (_a = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _a === void 0 ? void 0 : _a.personalized_recommend) !== null && _b !== void 0 ? _b : maxSize, defaultSize: (_d = (_c = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _c === void 0 ? void 0 : _c.default_recommend) !== null && _d !== void 0 ? _d : defaultSize, hashTagSize: (_f = (_e = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _e === void 0 ? void 0 : _e.hash_tag_size) !== null && _f !== void 0 ? _f : hashTagSize, loadingImage: loadingImage, appDomain: appDomain, enabledMetaConversionApi: enabledMetaConversionApi, isShowTag: (_j = (_h = (_g = data === null || data === void 0 ? void 0 : data.data) === null || _g === void 0 ? void 0 : _g.sxpPageConf) === null || _h === void 0 ? void 0 : _h.globalConfig) === null || _j === void 0 ? void 0 : _j.isShowTag, render: ({ rtcList, tagList }) => {
22
+ react_1.default.createElement(SxpDataSourceProvider_1.default, { 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: (_b = (_a = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _a === void 0 ? void 0 : _a.personalized_recommend) !== null && _b !== void 0 ? _b : maxSize, defaultSize: (_d = (_c = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _c === void 0 ? void 0 : _c.default_recommend) !== null && _d !== void 0 ? _d : defaultSize, hashTagSize: (_f = (_e = data === null || data === void 0 ? void 0 : data.sxp_parameter) === null || _e === void 0 ? void 0 : _e.hash_tag_size) !== null && _f !== void 0 ? _f : hashTagSize, loadingImage: loadingImage, appDomain: appDomain, enabledMetaConversionApi: enabledMetaConversionApi, isShowTag: (_j = (_h = (_g = data === null || data === void 0 ? void 0 : data.data) === null || _g === void 0 ? void 0 : _g.sxpPageConf) === null || _h === void 0 ? void 0 : _h.globalConfig) === null || _j === void 0 ? void 0 : _j.isShowTag, globalConfig: (_l = (_k = data === null || data === void 0 ? void 0 : data.data) === null || _k === void 0 ? void 0 : _k.sxpPageConf) === null || _l === void 0 ? void 0 : _l.globalConfig, render: ({ rtcList, tagList }) => {
23
23
  var _a;
24
24
  return (react_1.default.createElement(react_1.default.Fragment, null,
25
25
  react_1.default.createElement(SxpPageRender_1.default, Object.assign({}, (_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.sxpPageConf, { tagList: tagList, data: rtcList, resolver: RESOLVER, licenseUrl: licenseUrl })),
@@ -4,16 +4,30 @@ const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const hooks_1 = require("../../../core/hooks");
6
6
  const event_1 = tslib_1.__importStar(require("../../../core/utils/event"));
7
+ const useEventReport_1 = require("../../../core/hooks/useEventReport");
7
8
  const DEFAULT_TAG = 'FOR U';
8
9
  const Tagbar = ({ tagList = [], setActiveIndex }) => {
9
10
  const [selectTag, setSelectTag] = (0, react_1.useState)(DEFAULT_TAG);
10
- const { getRecommendVideos, setRtcList, setCacheRtcList, setCacheActiveIndex, setLoading, swiperRef, waterFallData } = (0, hooks_1.useSxpDataSource)();
11
+ const { getRecommendVideos, setRtcList, setCacheRtcList, setCacheActiveIndex, setLoading, swiperRef, waterFallData, bffEventReport } = (0, hooks_1.useSxpDataSource)();
12
+ const { backMainFeed } = (0, useEventReport_1.useEventReport)();
11
13
  const realTagList = (0, react_1.useMemo)(() => {
12
14
  return [DEFAULT_TAG, ...tagList];
13
15
  }, [tagList]);
14
16
  const handleSelectTag = (tag) => () => {
15
17
  if (tag === selectTag)
16
18
  return;
19
+ if (tag !== 'FOR U') {
20
+ bffEventReport === null || bffEventReport === void 0 ? void 0 : bffEventReport({
21
+ eventInfo: {
22
+ eventSubject: 'clickThemeTagsViewContents',
23
+ eventDescription: 'click Theme Tags View Contents',
24
+ themeTags: `[${tag}]`
25
+ }
26
+ });
27
+ }
28
+ else {
29
+ backMainFeed('theme', selectTag);
30
+ }
17
31
  let themeTag;
18
32
  if (tag !== DEFAULT_TAG) {
19
33
  themeTag = tag;
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import './List.less';
3
3
  import { IHashTagProps } from '../../../../materials/sxp/HashTag';
4
- export default function WaterfallList({ reportTagsView, ...props }: any & IHashTagProps): React.JSX.Element;
4
+ export default function WaterfallList({ reportTagsView, showBanner, ...props }: any & IHashTagProps): React.JSX.Element;
@@ -6,6 +6,7 @@ require("./List.less");
6
6
  const FormatImage_1 = tslib_1.__importDefault(require("../FormatImage"));
7
7
  const preview_json_1 = tslib_1.__importDefault(require("./preview.json"));
8
8
  const hooks_1 = require("../../../../core/hooks");
9
+ const css_1 = require("@emotion/css");
9
10
  const WaterfallFlowItem = (props) => {
10
11
  const { rec, index, list, reportTagsView, textStyles, space } = props;
11
12
  const { swiperRef, setRtcList, setOpenHashtag, bffEventReport, sxpParameter } = (0, hooks_1.useSxpDataSource)();
@@ -115,8 +116,8 @@ const WaterfallFlowItem = (props) => {
115
116
  react_1.default.createElement("div", { className: 'list-content-listItem-info-price', style: textStyles === null || textStyles === void 0 ? void 0 : textStyles.price, hidden: !priceText }, priceText))));
116
117
  };
117
118
  function WaterfallList(_a) {
118
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
119
- var { reportTagsView } = _a, props = tslib_1.__rest(_a, ["reportTagsView"]);
119
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
120
+ var { reportTagsView, showBanner } = _a, props = tslib_1.__rest(_a, ["reportTagsView", "showBanner"]);
120
121
  const { waterFallData, getRecommendVideos, hashTagSize, loadingImage, isOpenHashTag } = (0, hooks_1.useSxpDataSource)();
121
122
  const [list, setList] = (0, react_1.useState)();
122
123
  const [data, setData] = (0, react_1.useState)();
@@ -171,17 +172,22 @@ function WaterfallList(_a) {
171
172
  return (react_1.default.createElement(react_1.default.Fragment, null, isLoadingData ? (react_1.default.createElement("div", { style: { height: '100%', width: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center' } },
172
173
  react_1.default.createElement("img", { width: 64, height: 64, src: loadingImage, alt: 'loading...', style: { objectFit: 'contain' } }))) : (react_1.default.createElement("div", { className: 'list' },
173
174
  react_1.default.createElement("div", { className: 'list-scroll', ref: containerRef },
174
- react_1.default.createElement("div", { className: 'list-info', style: (_b = props === null || props === void 0 ? void 0 : props.textStyles) === null || _b === void 0 ? void 0 : _b.hashTagDesc }, (_c = data === null || data === void 0 ? void 0 : data.tag) === null || _c === void 0 ? void 0 : _c.info),
175
- react_1.default.createElement("div", { hidden: !((_d = data === null || data === void 0 ? void 0 : data.tag) === null || _d === void 0 ? void 0 : _d.link), className: 'list-collection', onClick: handleClickLink, style: Object.assign(Object.assign({}, (_e = props === null || props === void 0 ? void 0 : props.textStyles) === null || _e === void 0 ? void 0 : _e.hashTagLink), { 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'),
175
+ showBanner && ((_b = data === null || data === void 0 ? void 0 : data.tag) === null || _b === void 0 ? void 0 : _b.picture) && (react_1.default.createElement(FormatImage_1.default, { className: (0, css_1.css)({
176
+ width: '100%',
177
+ objectFit: 'cover',
178
+ marginBottom: '20px'
179
+ }), src: (_c = data === null || data === void 0 ? void 0 : data.tag) === null || _c === void 0 ? void 0 : _c.picture })),
180
+ react_1.default.createElement("div", { className: 'list-info', style: (_d = props === null || props === void 0 ? void 0 : props.textStyles) === null || _d === void 0 ? void 0 : _d.hashTagDesc }, (_e = data === null || data === void 0 ? void 0 : data.tag) === null || _e === void 0 ? void 0 : _e.info),
181
+ react_1.default.createElement("div", { hidden: !((_f = data === null || data === void 0 ? void 0 : data.tag) === null || _f === void 0 ? void 0 : _f.link), className: 'list-collection', onClick: handleClickLink, style: Object.assign(Object.assign({}, (_g = props === null || props === void 0 ? void 0 : props.textStyles) === null || _g === void 0 ? void 0 : _g.hashTagLink), { marginBottom: props === null || props === void 0 ? void 0 : props.space }) }, ((_h = data === null || data === void 0 ? void 0 : data.tag) === null || _h === void 0 ? void 0 : _h.linkTitle) || 'Shop the collection'),
176
182
  react_1.default.createElement("div", { className: 'list-content' }, list === null || list === void 0 ? void 0 : list.map((item, ind) => {
177
183
  return (react_1.default.createElement(WaterfallFlowItem, Object.assign({ key: ind, index: ind, rec: item, list: list, reportTagsView: reportTagsView }, props)));
178
184
  })),
179
185
  react_1.default.createElement("div", { hidden: !isLoadMore, style: { textAlign: 'center' } }, "loading..."),
180
- react_1.default.createElement("div", { hidden: !((_g = data === null || data === void 0 ? void 0 : data.tag) === null || _g === void 0 ? void 0 : _g.link), style: {
181
- height: ((_h = data === null || data === void 0 ? void 0 : data.tag) === null || _h === void 0 ? void 0 : _h.link) ? ((_j = props === null || props === void 0 ? void 0 : props.buttonBgStyle) === null || _j === void 0 ? void 0 : _j.height) || ((_k = props === null || props === void 0 ? void 0 : props.buttonStyle) === null || _k === void 0 ? void 0 : _k.height) || '100px' : 0
186
+ react_1.default.createElement("div", { hidden: !((_j = data === null || data === void 0 ? void 0 : data.tag) === null || _j === void 0 ? void 0 : _j.link), style: {
187
+ height: ((_k = data === null || data === void 0 ? void 0 : data.tag) === null || _k === void 0 ? void 0 : _k.link) ? ((_l = props === null || props === void 0 ? void 0 : props.buttonBgStyle) === null || _l === void 0 ? void 0 : _l.height) || ((_m = props === null || props === void 0 ? void 0 : props.buttonStyle) === null || _m === void 0 ? void 0 : _m.height) || '100px' : 0
182
188
  } })),
183
- react_1.default.createElement("div", { className: 'list-bottom', hidden: !((_l = data === null || data === void 0 ? void 0 : data.tag) === null || _l === void 0 ? void 0 : _l.link), style: props === null || props === void 0 ? void 0 : props.buttonBgStyle }),
184
- react_1.default.createElement("div", { hidden: !((_m = data === null || data === void 0 ? void 0 : data.tag) === null || _m === void 0 ? void 0 : _m.link), className: 'list-btn-wrap', style: Object.assign(Object.assign({}, props === null || props === void 0 ? void 0 : props.buttonBgStyle), { height: 'auto', backgroundColor: 'transparent' }) },
185
- react_1.default.createElement("button", { className: 'list-btn', style: props === null || props === void 0 ? void 0 : props.buttonStyle, onClick: handleClickLink }, ((_o = data === null || data === void 0 ? void 0 : data.tag) === null || _o === void 0 ? void 0 : _o.linkTitle) || 'Shop the collection'))))));
189
+ react_1.default.createElement("div", { className: 'list-bottom', hidden: !((_o = data === null || data === void 0 ? void 0 : data.tag) === null || _o === void 0 ? void 0 : _o.link), style: props === null || props === void 0 ? void 0 : props.buttonBgStyle }),
190
+ react_1.default.createElement("div", { hidden: !((_p = data === null || data === void 0 ? void 0 : data.tag) === null || _p === void 0 ? void 0 : _p.link), className: 'list-btn-wrap', style: Object.assign(Object.assign({}, props === null || props === void 0 ? void 0 : props.buttonBgStyle), { height: 'auto', backgroundColor: 'transparent' }) },
191
+ react_1.default.createElement("button", { className: 'list-btn', style: props === null || props === void 0 ? void 0 : props.buttonStyle, onClick: handleClickLink }, ((_q = data === null || data === void 0 ? void 0 : data.tag) === null || _q === void 0 ? void 0 : _q.linkTitle) || 'Shop the collection'))))));
186
192
  }
187
193
  exports.default = WaterfallList;
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import './WaterfallList.less';
3
3
  import { IHashTagProps } from '../../../../materials/sxp/HashTag';
4
- export default function WaterfallList({ reportTagsView, ...props }: any & IHashTagProps): React.JSX.Element;
4
+ export default function WaterfallList({ reportTagsView, showBanner, ...props }: any & IHashTagProps): React.JSX.Element;