@blaze-cms/react-page-builder 0.126.0-admin-updates.3 → 0.126.0-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.
Files changed (46) hide show
  1. package/CHANGELOG.md +6 -19
  2. package/lib/components/ContentGroup/ContentGroup.js +13 -4
  3. package/lib/components/ContentGroup/ContentGroup.js.map +1 -1
  4. package/lib/components/ContentGroup/ContentGroupTabs.js +43 -31
  5. package/lib/components/ContentGroup/ContentGroupTabs.js.map +1 -1
  6. package/lib/components/ContentGroup/constants.js +18 -0
  7. package/lib/components/ContentGroup/constants.js.map +1 -0
  8. package/lib/components/ContentGroup/helpers/get-active-tab.js +23 -0
  9. package/lib/components/ContentGroup/helpers/get-active-tab.js.map +1 -0
  10. package/lib/components/ContentGroup/helpers/get-sections-data.js +25 -0
  11. package/lib/components/ContentGroup/helpers/get-sections-data.js.map +1 -0
  12. package/lib/components/ContentGroup/helpers/index.js +22 -0
  13. package/lib/components/ContentGroup/helpers/index.js.map +1 -0
  14. package/lib/components/ContentGroupSection/ContentGroupSection.js +4 -1
  15. package/lib/components/ContentGroupSection/ContentGroupSection.js.map +1 -1
  16. package/lib/components/Video/providers/YouTube/YoutubeEmbeded.js +5 -1
  17. package/lib/components/Video/providers/YouTube/YoutubeEmbeded.js.map +1 -1
  18. package/lib-es/components/ContentGroup/ContentGroup.js +14 -5
  19. package/lib-es/components/ContentGroup/ContentGroup.js.map +1 -1
  20. package/lib-es/components/ContentGroup/ContentGroupTabs.js +48 -39
  21. package/lib-es/components/ContentGroup/ContentGroupTabs.js.map +1 -1
  22. package/lib-es/components/ContentGroup/constants.js +7 -0
  23. package/lib-es/components/ContentGroup/constants.js.map +1 -0
  24. package/lib-es/components/ContentGroup/helpers/get-active-tab.js +10 -0
  25. package/lib-es/components/ContentGroup/helpers/get-active-tab.js.map +1 -0
  26. package/lib-es/components/ContentGroup/helpers/get-sections-data.js +15 -0
  27. package/lib-es/components/ContentGroup/helpers/get-sections-data.js.map +1 -0
  28. package/lib-es/components/ContentGroup/helpers/index.js +4 -0
  29. package/lib-es/components/ContentGroup/helpers/index.js.map +1 -0
  30. package/lib-es/components/ContentGroupSection/ContentGroupSection.js +4 -2
  31. package/lib-es/components/ContentGroupSection/ContentGroupSection.js.map +1 -1
  32. package/lib-es/components/Video/providers/YouTube/YoutubeEmbeded.js +5 -1
  33. package/lib-es/components/Video/providers/YouTube/YoutubeEmbeded.js.map +1 -1
  34. package/package.json +7 -7
  35. package/src/components/ContentGroup/ContentGroup.js +16 -4
  36. package/src/components/ContentGroup/ContentGroupTabs.js +44 -28
  37. package/src/components/ContentGroup/constants.js +7 -0
  38. package/src/components/ContentGroup/helpers/get-active-tab.js +11 -0
  39. package/src/components/ContentGroup/helpers/get-sections-data.js +7 -0
  40. package/src/components/ContentGroup/helpers/index.js +4 -0
  41. package/src/components/ContentGroupSection/ContentGroupSection.js +6 -2
  42. package/src/components/Video/providers/YouTube/YoutubeEmbeded.js +5 -1
  43. package/tests/unit/src/components/ContentGroup/ContentGroupTabs.test.js +14 -1
  44. package/tests/unit/src/components/ContentGroup/__snapshots__/ContentGroupTabs.test.js.snap +88 -2
  45. package/tests/unit/src/components/ContentGroup/helpers/get-active-tab.test.js +19 -0
  46. package/tests/unit/src/components/ContentGroup/helpers/get-sections-data.test.js +14 -0
@@ -1,40 +1,40 @@
1
- import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
- const _excluded = ["name", "contentType", "modifier", "children"];
3
- import React, { useState } from 'react';
1
+ import React, { useState, useEffect } from 'react';
4
2
  import PropTypes from 'prop-types';
5
- const ContentGroupTabs = _ref => {
6
- var _children$props;
7
- let {
8
- name,
9
- contentType,
10
- modifier,
11
- children
12
- } = _ref,
13
- props = _objectWithoutProperties(_ref, _excluded);
14
- const [selectedTab, setSelectedTab] = useState('tab-0');
15
- const groupSections = children === null || children === void 0 ? void 0 : (_children$props = children.props) === null || _children$props === void 0 ? void 0 : _children$props.children[1];
16
- const contentClassame = contentType === 'tab' ? '-tabs' : '-sidepanel';
17
- if (!groupSections || !groupSections.length) return '';
3
+ import { useRouter } from 'next/router';
4
+ import { getActiveTab } from './helpers';
5
+ import { TAB, TABS, SIDEPANEL, CONTENT_GROUP, PANEL } from './constants';
6
+ const ContentGroupTabs = ({
7
+ name,
8
+ contentType,
9
+ modifier,
10
+ groupSections,
11
+ sectionsData
12
+ }) => {
13
+ const router = useRouter();
14
+ const [selectedTab, setSelectedTab] = useState(getActiveTab(sectionsData, ''));
15
+ const {
16
+ asPath
17
+ } = router;
18
+ const contentClassame = contentType === TAB ? TABS : SIDEPANEL;
19
+ const mainDivClass = `${CONTENT_GROUP}-${contentClassame}`;
20
+ const contentGroupClass = `${CONTENT_GROUP}-${contentClassame}__buttons-wrapper`;
21
+ const sectionClass = `${CONTENT_GROUP}-${contentClassame}__content-section`;
22
+ useEffect(() => {
23
+ const activeTab = getActiveTab(sectionsData, asPath);
24
+ if (activeTab !== selectedTab) setSelectedTab(activeTab);
25
+ }, [asPath, sectionsData, selectedTab]);
18
26
  return /*#__PURE__*/React.createElement("div", {
19
- className: `content-group${contentClassame}`
27
+ className: mainDivClass
20
28
  }, /*#__PURE__*/React.createElement("ul", {
21
- className: `content-group${contentClassame}__buttons-wrapper`,
29
+ className: contentGroupClass,
22
30
  role: "tablist",
23
31
  "aria-label": name
24
32
  }, groupSections.map((groupSection, index) => {
25
- const {
26
- props: {
27
- component: {
28
- settings: {
29
- label: sectionLabel
30
- } = {}
31
- } = {}
32
- } = {}
33
- } = groupSection;
34
- const tabId = `tab-${index}`;
35
- const panelId = `panel-${index}`;
33
+ const [sectionName, sectioLabel] = sectionsData[index];
34
+ const tabId = `${TAB}-${sectionName}`;
35
+ const panelId = `${PANEL}-${sectionName}`;
36
36
  const isSelected = selectedTab === tabId;
37
- const buttonClassName = isSelected ? `content-group${contentClassame}__button--is-active` : `content-group${contentClassame}__button`;
37
+ const buttonClassName = `${CONTENT_GROUP}-${contentClassame}__button${isSelected ? '--is-active' : ''}`;
38
38
  return /*#__PURE__*/React.createElement("button", {
39
39
  id: tabId,
40
40
  key: tabId,
@@ -43,16 +43,25 @@ const ContentGroupTabs = _ref => {
43
43
  role: "tab",
44
44
  "aria-selected": isSelected,
45
45
  "aria-controls": panelId,
46
- onClick: () => setSelectedTab(tabId)
47
- }, sectionLabel);
46
+ onClick: () => {
47
+ const baseUrl = asPath.split('#')[0];
48
+ const newUrl = `${baseUrl}#${sectionName}`;
49
+ if (asPath === newUrl) return;
50
+ router.push(`/Resolver`, newUrl, {
51
+ shallow: true
52
+ });
53
+ setSelectedTab(tabId);
54
+ }
55
+ }, sectioLabel);
48
56
  })), groupSections.map((groupSection, index) => {
49
- const tabId = `tab-${index}`;
50
- const panelId = `panel-${index}`;
57
+ const [sectionName] = sectionsData[index];
58
+ const tabId = `${TAB}-${sectionName}`;
59
+ const panelId = `${PANEL}-${sectionName}`;
51
60
  if (selectedTab !== tabId) return null;
52
61
  return /*#__PURE__*/React.createElement("div", {
53
- id: panelId,
62
+ id: sectionName,
54
63
  key: panelId,
55
- className: `content-group${contentClassame}__content-section`,
64
+ className: sectionClass,
56
65
  role: "tabpanel",
57
66
  "aria-labelledby": tabId
58
67
  }, groupSection);
@@ -62,11 +71,11 @@ ContentGroupTabs.propTypes = {
62
71
  name: PropTypes.string.isRequired,
63
72
  contentType: PropTypes.string.isRequired,
64
73
  modifier: PropTypes.string,
65
- children: PropTypes.object
74
+ groupSections: PropTypes.array.isRequired,
75
+ sectionsData: PropTypes.array.isRequired
66
76
  };
67
77
  ContentGroupTabs.defaultProps = {
68
- modifier: '',
69
- children: {}
78
+ modifier: ''
70
79
  };
71
80
  export default ContentGroupTabs;
72
81
  //# sourceMappingURL=ContentGroupTabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContentGroupTabs.js","names":["React","useState","PropTypes","ContentGroupTabs","name","contentType","modifier","children","props","selectedTab","setSelectedTab","groupSections","contentClassame","length","map","groupSection","index","component","settings","label","sectionLabel","tabId","panelId","isSelected","buttonClassName","propTypes","string","isRequired","object","defaultProps"],"sources":["../../../src/components/ContentGroup/ContentGroupTabs.js"],"sourcesContent":["import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nconst ContentGroupTabs = ({ name, contentType, modifier, children, ...props }) => {\n const [selectedTab, setSelectedTab] = useState('tab-0');\n const groupSections = children?.props?.children[1];\n const contentClassame = contentType === 'tab' ? '-tabs' : '-sidepanel';\n if (!groupSections || !groupSections.length) return '';\n\n return (\n <div className={`content-group${contentClassame}`}>\n <ul\n className={`content-group${contentClassame}__buttons-wrapper`}\n role=\"tablist\"\n aria-label={name}>\n {groupSections.map((groupSection, index) => {\n const {\n props: { component: { settings: { label: sectionLabel } = {} } = {} } = {}\n } = groupSection;\n const tabId = `tab-${index}`;\n const panelId = `panel-${index}`;\n const isSelected = selectedTab === tabId;\n const buttonClassName = isSelected\n ? `content-group${contentClassame}__button--is-active`\n : `content-group${contentClassame}__button`;\n\n return (\n <button\n id={tabId}\n key={tabId}\n className={buttonClassName}\n type=\"button\"\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={panelId}\n onClick={() => setSelectedTab(tabId)}>\n {sectionLabel}\n </button>\n );\n })}\n </ul>\n {groupSections.map((groupSection, index) => {\n const tabId = `tab-${index}`;\n const panelId = `panel-${index}`;\n if (selectedTab !== tabId) return null;\n\n return (\n <div\n id={panelId}\n key={panelId}\n className={`content-group${contentClassame}__content-section`}\n role=\"tabpanel\"\n aria-labelledby={tabId}>\n {groupSection}\n </div>\n );\n })}\n </div>\n );\n};\n\nContentGroupTabs.propTypes = {\n name: PropTypes.string.isRequired,\n contentType: PropTypes.string.isRequired,\n modifier: PropTypes.string,\n children: PropTypes.object\n};\n\nContentGroupTabs.defaultProps = {\n modifier: '',\n children: {}\n};\n\nexport default ContentGroupTabs;\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,OAAOC,SAAS,MAAM,YAAY;AAElC,MAAMC,gBAAgB,GAAG,QAAyD;EAAA;EAAA,IAAxD;MAAEC,IAAI;MAAEC,WAAW;MAAEC,QAAQ;MAAEC;IAAmB,CAAC;IAAPC,KAAK;EACzE,MAAM,CAACC,WAAW,EAAEC,cAAc,CAAC,GAAGT,QAAQ,CAAC,OAAO,CAAC;EACvD,MAAMU,aAAa,GAAGJ,QAAQ,aAARA,QAAQ,0CAARA,QAAQ,CAAEC,KAAK,oDAAf,gBAAiBD,QAAQ,CAAC,CAAC,CAAC;EAClD,MAAMK,eAAe,GAAGP,WAAW,KAAK,KAAK,GAAG,OAAO,GAAG,YAAY;EACtE,IAAI,CAACM,aAAa,IAAI,CAACA,aAAa,CAACE,MAAM,EAAE,OAAO,EAAE;EAEtD,oBACE;IAAK,SAAS,EAAG,gBAAeD,eAAgB;EAAE,gBAChD;IACE,SAAS,EAAG,gBAAeA,eAAgB,mBAAmB;IAC9D,IAAI,EAAC,SAAS;IACd,cAAYR;EAAK,GAChBO,aAAa,CAACG,GAAG,CAAC,CAACC,YAAY,EAAEC,KAAK,KAAK;IAC1C,MAAM;MACJR,KAAK,EAAE;QAAES,SAAS,EAAE;UAAEC,QAAQ,EAAE;YAAEC,KAAK,EAAEC;UAAa,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC;MAAE,CAAC,GAAG,CAAC;IAC3E,CAAC,GAAGL,YAAY;IAChB,MAAMM,KAAK,GAAI,OAAML,KAAM,EAAC;IAC5B,MAAMM,OAAO,GAAI,SAAQN,KAAM,EAAC;IAChC,MAAMO,UAAU,GAAGd,WAAW,KAAKY,KAAK;IACxC,MAAMG,eAAe,GAAGD,UAAU,GAC7B,gBAAeX,eAAgB,qBAAoB,GACnD,gBAAeA,eAAgB,UAAS;IAE7C,oBACE;MACE,EAAE,EAAES,KAAM;MACV,GAAG,EAAEA,KAAM;MACX,SAAS,EAAEG,eAAgB;MAC3B,IAAI,EAAC,QAAQ;MACb,IAAI,EAAC,KAAK;MACV,iBAAeD,UAAW;MAC1B,iBAAeD,OAAQ;MACvB,OAAO,EAAE,MAAMZ,cAAc,CAACW,KAAK;IAAE,GACpCD,YAAY,CACN;EAEb,CAAC,CAAC,CACC,EACJT,aAAa,CAACG,GAAG,CAAC,CAACC,YAAY,EAAEC,KAAK,KAAK;IAC1C,MAAMK,KAAK,GAAI,OAAML,KAAM,EAAC;IAC5B,MAAMM,OAAO,GAAI,SAAQN,KAAM,EAAC;IAChC,IAAIP,WAAW,KAAKY,KAAK,EAAE,OAAO,IAAI;IAEtC,oBACE;MACE,EAAE,EAAEC,OAAQ;MACZ,GAAG,EAAEA,OAAQ;MACb,SAAS,EAAG,gBAAeV,eAAgB,mBAAmB;MAC9D,IAAI,EAAC,UAAU;MACf,mBAAiBS;IAAM,GACtBN,YAAY,CACT;EAEV,CAAC,CAAC,CACE;AAEV,CAAC;AAEDZ,gBAAgB,CAACsB,SAAS,GAAG;EAC3BrB,IAAI,EAAEF,SAAS,CAACwB,MAAM,CAACC,UAAU;EACjCtB,WAAW,EAAEH,SAAS,CAACwB,MAAM,CAACC,UAAU;EACxCrB,QAAQ,EAAEJ,SAAS,CAACwB,MAAM;EAC1BnB,QAAQ,EAAEL,SAAS,CAAC0B;AACtB,CAAC;AAEDzB,gBAAgB,CAAC0B,YAAY,GAAG;EAC9BvB,QAAQ,EAAE,EAAE;EACZC,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,eAAeJ,gBAAgB"}
1
+ {"version":3,"file":"ContentGroupTabs.js","names":["React","useState","useEffect","PropTypes","useRouter","getActiveTab","TAB","TABS","SIDEPANEL","CONTENT_GROUP","PANEL","ContentGroupTabs","name","contentType","modifier","groupSections","sectionsData","router","selectedTab","setSelectedTab","asPath","contentClassame","mainDivClass","contentGroupClass","sectionClass","activeTab","map","groupSection","index","sectionName","sectioLabel","tabId","panelId","isSelected","buttonClassName","baseUrl","split","newUrl","push","shallow","propTypes","string","isRequired","array","defaultProps"],"sources":["../../../src/components/ContentGroup/ContentGroupTabs.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useRouter } from 'next/router';\nimport { getActiveTab } from './helpers';\nimport { TAB, TABS, SIDEPANEL, CONTENT_GROUP, PANEL } from './constants';\n\nconst ContentGroupTabs = ({ name, contentType, modifier, groupSections, sectionsData }) => {\n const router = useRouter();\n const [selectedTab, setSelectedTab] = useState(getActiveTab(sectionsData, ''));\n const { asPath } = router;\n const contentClassame = contentType === TAB ? TABS : SIDEPANEL;\n const mainDivClass = `${CONTENT_GROUP}-${contentClassame}`;\n const contentGroupClass = `${CONTENT_GROUP}-${contentClassame}__buttons-wrapper`;\n const sectionClass = `${CONTENT_GROUP}-${contentClassame}__content-section`;\n\n useEffect(\n () => {\n const activeTab = getActiveTab(sectionsData, asPath);\n if (activeTab !== selectedTab) setSelectedTab(activeTab);\n },\n [asPath, sectionsData, selectedTab]\n );\n\n return (\n <div className={mainDivClass}>\n <ul className={contentGroupClass} role=\"tablist\" aria-label={name}>\n {groupSections.map((groupSection, index) => {\n const [sectionName, sectioLabel] = sectionsData[index];\n const tabId = `${TAB}-${sectionName}`;\n const panelId = `${PANEL}-${sectionName}`;\n const isSelected = selectedTab === tabId;\n const buttonClassName = `${CONTENT_GROUP}-${contentClassame}__button${\n isSelected ? '--is-active' : ''\n }`;\n\n return (\n <button\n id={tabId}\n key={tabId}\n className={buttonClassName}\n type=\"button\"\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={panelId}\n onClick={() => {\n const baseUrl = asPath.split('#')[0];\n const newUrl = `${baseUrl}#${sectionName}`;\n if (asPath === newUrl) return;\n router.push(`/Resolver`, newUrl, { shallow: true });\n setSelectedTab(tabId);\n }}>\n {sectioLabel}\n </button>\n );\n })}\n </ul>\n {groupSections.map((groupSection, index) => {\n const [sectionName] = sectionsData[index];\n const tabId = `${TAB}-${sectionName}`;\n const panelId = `${PANEL}-${sectionName}`;\n if (selectedTab !== tabId) return null;\n\n return (\n <div\n id={sectionName}\n key={panelId}\n className={sectionClass}\n role=\"tabpanel\"\n aria-labelledby={tabId}>\n {groupSection}\n </div>\n );\n })}\n </div>\n );\n};\n\nContentGroupTabs.propTypes = {\n name: PropTypes.string.isRequired,\n contentType: PropTypes.string.isRequired,\n modifier: PropTypes.string,\n groupSections: PropTypes.array.isRequired,\n sectionsData: PropTypes.array.isRequired\n};\n\nContentGroupTabs.defaultProps = {\n modifier: ''\n};\n\nexport default ContentGroupTabs;\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ const TAB = 'tab';
2
+ const TABS = 'tabs';
3
+ const SIDEPANEL = 'sidepanel';
4
+ const CONTENT_GROUP = 'content-group';
5
+ const PANEL = 'panel';
6
+ export { TAB, TABS, SIDEPANEL, CONTENT_GROUP, PANEL };
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","names":["TAB","TABS","SIDEPANEL","CONTENT_GROUP","PANEL"],"sources":["../../../src/components/ContentGroup/constants.js"],"sourcesContent":["const TAB = 'tab';\nconst TABS = 'tabs';\nconst SIDEPANEL = 'sidepanel';\nconst CONTENT_GROUP = 'content-group';\nconst PANEL = 'panel';\n\nexport { TAB, TABS, SIDEPANEL, CONTENT_GROUP, PANEL };\n"],"mappings":"AAAA,MAAMA,GAAG,GAAG,KAAK;AACjB,MAAMC,IAAI,GAAG,MAAM;AACnB,MAAMC,SAAS,GAAG,WAAW;AAC7B,MAAMC,aAAa,GAAG,eAAe;AACrC,MAAMC,KAAK,GAAG,OAAO;AAErB,SAASJ,GAAG,EAAEC,IAAI,EAAEC,SAAS,EAAEC,aAAa,EAAEC,KAAK"}
@@ -0,0 +1,10 @@
1
+ import { TAB } from '../constants';
2
+ const getActiveTab = (sections, url) => {
3
+ const decodedUrl = decodeURI(url);
4
+ const activeTabName = decodedUrl.split('#')[1];
5
+ const isUrlTabValid = !!sections.find(section => section[0] === activeTabName);
6
+ const tabToUse = isUrlTabValid && activeTabName || sections[0][0];
7
+ return `${TAB}-${tabToUse}`;
8
+ };
9
+ export default getActiveTab;
10
+ //# sourceMappingURL=get-active-tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-active-tab.js","names":["TAB","getActiveTab","sections","url","decodedUrl","decodeURI","activeTabName","split","isUrlTabValid","find","section","tabToUse"],"sources":["../../../../src/components/ContentGroup/helpers/get-active-tab.js"],"sourcesContent":["import { TAB } from '../constants';\n\nconst getActiveTab = (sections, url) => {\n const decodedUrl = decodeURI(url);\n const activeTabName = decodedUrl.split('#')[1];\n const isUrlTabValid = !!sections.find(section => section[0] === activeTabName);\n const tabToUse = (isUrlTabValid && activeTabName) || sections[0][0];\n return `${TAB}-${tabToUse}`;\n};\n\nexport default getActiveTab;\n"],"mappings":"AAAA,SAASA,GAAG,QAAQ,cAAc;AAElC,MAAMC,YAAY,GAAG,CAACC,QAAQ,EAAEC,GAAG,KAAK;EACtC,MAAMC,UAAU,GAAGC,SAAS,CAACF,GAAG,CAAC;EACjC,MAAMG,aAAa,GAAGF,UAAU,CAACG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EAC9C,MAAMC,aAAa,GAAG,CAAC,CAACN,QAAQ,CAACO,IAAI,CAACC,OAAO,IAAIA,OAAO,CAAC,CAAC,CAAC,KAAKJ,aAAa,CAAC;EAC9E,MAAMK,QAAQ,GAAIH,aAAa,IAAIF,aAAa,IAAKJ,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACnE,OAAQ,GAAEF,GAAI,IAAGW,QAAS,EAAC;AAC7B,CAAC;AAED,eAAeV,YAAY"}
@@ -0,0 +1,15 @@
1
+ const getSectionsData = sections => sections.map(section => {
2
+ const {
3
+ props: {
4
+ component: {
5
+ settings: {
6
+ label,
7
+ name
8
+ } = {}
9
+ } = {}
10
+ } = {}
11
+ } = section;
12
+ return [name, label];
13
+ });
14
+ export default getSectionsData;
15
+ //# sourceMappingURL=get-sections-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-sections-data.js","names":["getSectionsData","sections","map","section","props","component","settings","label","name"],"sources":["../../../../src/components/ContentGroup/helpers/get-sections-data.js"],"sourcesContent":["const getSectionsData = sections =>\n sections.map(section => {\n const { props: { component: { settings: { label, name } = {} } = {} } = {} } = section;\n return [name, label];\n });\n\nexport default getSectionsData;\n"],"mappings":"AAAA,MAAMA,eAAe,GAAGC,QAAQ,IAC9BA,QAAQ,CAACC,GAAG,CAACC,OAAO,IAAI;EACtB,MAAM;IAAEC,KAAK,EAAE;MAAEC,SAAS,EAAE;QAAEC,QAAQ,EAAE;UAAEC,KAAK;UAAEC;QAAK,CAAC,GAAG,CAAC;MAAE,CAAC,GAAG,CAAC;IAAE,CAAC,GAAG,CAAC;EAAE,CAAC,GAAGL,OAAO;EACtF,OAAO,CAACK,IAAI,EAAED,KAAK,CAAC;AACtB,CAAC,CAAC;AAEJ,eAAeP,eAAe"}
@@ -0,0 +1,4 @@
1
+ import getSectionsData from './get-sections-data';
2
+ import getActiveTab from './get-active-tab';
3
+ export { getSectionsData, getActiveTab };
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["getSectionsData","getActiveTab"],"sources":["../../../../src/components/ContentGroup/helpers/index.js"],"sourcesContent":["import getSectionsData from './get-sections-data';\nimport getActiveTab from './get-active-tab';\n\nexport { getSectionsData, getActiveTab };\n"],"mappings":"AAAA,OAAOA,eAAe,MAAM,qBAAqB;AACjD,OAAOC,YAAY,MAAM,kBAAkB;AAE3C,SAASD,eAAe,EAAEC,YAAY"}
@@ -1,15 +1,17 @@
1
1
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
- const _excluded = ["children"];
2
+ const _excluded = ["children", "name"];
3
3
  import React from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import { hasChildren } from '../../helpers';
6
6
  const ContentGroupSection = _ref => {
7
7
  let {
8
- children
8
+ children,
9
+ name
9
10
  } = _ref,
10
11
  props = _objectWithoutProperties(_ref, _excluded);
11
12
  if (!hasChildren(children)) return null;
12
13
  return /*#__PURE__*/React.createElement("div", {
14
+ key: name,
13
15
  className: "content-group-section"
14
16
  }, children);
15
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ContentGroupSection.js","names":["React","PropTypes","hasChildren","ContentGroupSection","children","props","propTypes","oneOfType","arrayOf","node","defaultProps"],"sources":["../../../src/components/ContentGroupSection/ContentGroupSection.js"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { hasChildren } from '../../helpers';\n\nconst ContentGroupSection = ({ children, ...props }) => {\n if (!hasChildren(children)) return null;\n\n return <div className=\"content-group-section\">{children}</div>;\n};\n\nContentGroupSection.propTypes = {\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])\n};\n\nContentGroupSection.defaultProps = { children: null };\n\nexport default ContentGroupSection;\n"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,WAAW,QAAQ,eAAe;AAE3C,MAAMC,mBAAmB,GAAG,QAA4B;EAAA,IAA3B;MAAEC;IAAmB,CAAC;IAAPC,KAAK;EAC/C,IAAI,CAACH,WAAW,CAACE,QAAQ,CAAC,EAAE,OAAO,IAAI;EAEvC,oBAAO;IAAK,SAAS,EAAC;EAAuB,GAAEA,QAAQ,CAAO;AAChE,CAAC;AAEDD,mBAAmB,CAACG,SAAS,GAAG;EAC9BF,QAAQ,EAAEH,SAAS,CAACM,SAAS,CAAC,CAACN,SAAS,CAACO,OAAO,CAACP,SAAS,CAACQ,IAAI,CAAC,EAAER,SAAS,CAACQ,IAAI,CAAC;AACnF,CAAC;AAEDN,mBAAmB,CAACO,YAAY,GAAG;EAAEN,QAAQ,EAAE;AAAK,CAAC;AAErD,eAAeD,mBAAmB"}
1
+ {"version":3,"file":"ContentGroupSection.js","names":["React","PropTypes","hasChildren","ContentGroupSection","children","name","props","propTypes","oneOfType","arrayOf","node","defaultProps"],"sources":["../../../src/components/ContentGroupSection/ContentGroupSection.js"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { hasChildren } from '../../helpers';\n\nconst ContentGroupSection = ({ children, name, ...props }) => {\n if (!hasChildren(children)) return null;\n\n return (\n <div key={name} className=\"content-group-section\">\n {children}\n </div>\n );\n};\n\nContentGroupSection.propTypes = {\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])\n};\n\nContentGroupSection.defaultProps = { children: null };\n\nexport default ContentGroupSection;\n"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,WAAW,QAAQ,eAAe;AAE3C,MAAMC,mBAAmB,GAAG,QAAkC;EAAA,IAAjC;MAAEC,QAAQ;MAAEC;IAAe,CAAC;IAAPC,KAAK;EACrD,IAAI,CAACJ,WAAW,CAACE,QAAQ,CAAC,EAAE,OAAO,IAAI;EAEvC,oBACE;IAAK,GAAG,EAAEC,IAAK;IAAC,SAAS,EAAC;EAAuB,GAC9CD,QAAQ,CACL;AAEV,CAAC;AAEDD,mBAAmB,CAACI,SAAS,GAAG;EAC9BH,QAAQ,EAAEH,SAAS,CAACO,SAAS,CAAC,CAACP,SAAS,CAACQ,OAAO,CAACR,SAAS,CAACS,IAAI,CAAC,EAAET,SAAS,CAACS,IAAI,CAAC;AACnF,CAAC;AAEDP,mBAAmB,CAACQ,YAAY,GAAG;EAAEP,QAAQ,EAAE;AAAK,CAAC;AAErD,eAAeD,mBAAmB"}
@@ -47,18 +47,22 @@ const YoutubeEmbeded = ({
47
47
  const iframeSrc = !playlist ? `${ytUrl}/embed/${encodedId}?autoplay=1${mutedValue}${paramsImp}` : `${ytUrl}/embed/videoseries?autoplay=1${mutedValue}&list=${encodedId}${paramsImp}`;
48
48
  const parsedWrapperClassname = `yt-facade ${renderIframe ? 'yt-activated' : ''}`;
49
49
  useEffect(() => {
50
+ let isMounted = true;
50
51
  if (!priority && !isIntersecting || imageSize === YT_HQ_FORMAT) return;
51
52
  const img = new Image();
52
53
  // eslint-disable-next-line func-names
53
54
  img.onload = function () {
54
55
  let newImageSize = imageSize;
55
56
  if (this && this.width === 120) newImageSize = YT_HQ_FORMAT;
56
- setImageDetails({
57
+ if (isMounted) setImageDetails({
57
58
  imageSize: newImageSize,
58
59
  displayImage: true
59
60
  });
60
61
  };
61
62
  img.src = posterUrl;
63
+ return () => {
64
+ isMounted = false;
65
+ };
62
66
  }, [imageSize, isIntersecting, posterUrl, priority]);
63
67
  const warmConnections = () => {
64
68
  if (preconnected) return;
@@ -1 +1 @@
1
- {"version":3,"file":"YoutubeEmbeded.js","names":["React","useState","useEffect","PropTypes","useInView","IN_VIEW_CONFIG","getPosterUrl","YT_HQ_FORMAT","YT_IMAGE_URL","YoutubeEmbeded","autoplay","videoId","playlistCoverId","videoTitle","poster","videoParams","announce","noCookie","webp","playlist","onIframeAdded","muted","adNetwork","iframeClass","priority","placeholderOnly","imageData","isIntersecting","outerRef","preconnected","setPreconnected","renderIframe","setRenderIframe","imageSize","displayImage","setImageDetails","encodedId","encodeURIComponent","paramsImp","ytUrl","posterUrl","mutedValue","iframeSrc","parsedWrapperClassname","img","Image","onload","newImageSize","width","src","warmConnections","addIframe","backgroundImage","propTypes","bool","func","string","object","defaultProps"],"sources":["../../../../../src/components/Video/providers/YouTube/YoutubeEmbeded.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useInView } from '@blaze-react/utils/lib/customHooks';\nimport { IN_VIEW_CONFIG } from '../../../../constants';\nimport { getPosterUrl, YT_HQ_FORMAT, YT_IMAGE_URL } from './helpers';\n\nconst YoutubeEmbeded = ({\n autoplay,\n videoId,\n playlistCoverId,\n videoTitle,\n poster,\n videoParams,\n announce,\n noCookie,\n webp,\n playlist,\n onIframeAdded,\n muted,\n adNetwork,\n iframeClass,\n priority,\n placeholderOnly,\n imageData\n}) => {\n const [isIntersecting, outerRef] = useInView(IN_VIEW_CONFIG);\n const [preconnected, setPreconnected] = useState(false);\n const [renderIframe, setRenderIframe] = useState(!!autoplay);\n const [{ imageSize, displayImage }, setImageDetails] = useState({\n imageSize: poster,\n displayImage: priority\n });\n\n const encodedId = encodeURIComponent(videoId);\n const paramsImp = videoParams ? `&${videoParams}` : '';\n const ytUrl = noCookie ? 'https://www.youtube-nocookie.com' : 'https://www.youtube.com';\n const posterUrl = getPosterUrl({\n imageData,\n playlistCoverId,\n playlist,\n encodedId,\n imageSize,\n webp\n });\n const mutedValue = muted ? '&mute=1' : '';\n const iframeSrc = !playlist\n ? `${ytUrl}/embed/${encodedId}?autoplay=1${mutedValue}${paramsImp}`\n : `${ytUrl}/embed/videoseries?autoplay=1${mutedValue}&list=${encodedId}${paramsImp}`;\n const parsedWrapperClassname = `yt-facade ${renderIframe ? 'yt-activated' : ''}`;\n\n useEffect(\n () => {\n if ((!priority && !isIntersecting) || imageSize === YT_HQ_FORMAT) return;\n\n const img = new Image();\n // eslint-disable-next-line func-names\n img.onload = function() {\n let newImageSize = imageSize;\n if (this && this.width === 120) newImageSize = YT_HQ_FORMAT;\n setImageDetails({ imageSize: newImageSize, displayImage: true });\n };\n\n img.src = posterUrl;\n },\n [imageSize, isIntersecting, posterUrl, priority]\n );\n\n const warmConnections = () => {\n if (preconnected) return;\n setPreconnected(true);\n };\n\n const addIframe = () => {\n if (renderIframe || placeholderOnly) return;\n onIframeAdded();\n setRenderIframe(true);\n };\n\n return (\n <>\n {preconnected && (\n <>\n <link rel=\"preconnect\" href={YT_IMAGE_URL} />\n <link rel=\"preconnect\" href={ytUrl} />\n <link rel=\"preconnect\" href=\"https://www.google.com\" />\n {adNetwork && (\n <>\n <link rel=\"preconnect\" href=\"https://static.doubleclick.net\" />\n <link rel=\"preconnect\" href=\"https://googleads.g.doubleclick.net\" />\n </>\n )}\n </>\n )}\n <div\n ref={outerRef}\n role=\"button\"\n onPointerOver={warmConnections}\n onClick={addIframe}\n className={parsedWrapperClassname}\n data-title={videoTitle}\n style={{\n backgroundImage: `url(${displayImage ? posterUrl : ''})`\n }}>\n <div\n type=\"button\"\n className=\"yt-facade-button-wrapper\"\n aria-label={`${announce} ${videoTitle}`}>\n <div className=\"yt-facade-button\" />\n </div>\n {renderIframe && (\n <iframe\n className={iframeClass}\n title={videoTitle}\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n src={iframeSrc}\n />\n )}\n </div>\n </>\n );\n};\n\nYoutubeEmbeded.propTypes = {\n priority: PropTypes.bool,\n onIframeAdded: PropTypes.func,\n adNetwork: PropTypes.bool,\n autoplay: PropTypes.bool,\n playlist: PropTypes.bool,\n muted: PropTypes.bool,\n webp: PropTypes.bool,\n noCookie: PropTypes.bool,\n videoId: PropTypes.string,\n iframeClass: PropTypes.string,\n poster: PropTypes.string,\n announce: PropTypes.string,\n playlistCoverId: PropTypes.string,\n videoParams: PropTypes.string,\n videoTitle: PropTypes.string,\n placeholderOnly: PropTypes.bool,\n imageData: PropTypes.object\n};\n\nYoutubeEmbeded.defaultProps = {\n priority: true,\n onIframeAdded: () => {},\n adNetwork: false,\n autoplay: false,\n playlist: false,\n muted: false,\n webp: false,\n noCookie: false,\n iframeClass: '',\n poster: 'sddefault',\n announce: 'Watch',\n videoId: '',\n playlistCoverId: '',\n videoParams: '',\n videoTitle: '',\n placeholderOnly: false,\n imageData: {}\n};\n\nexport default YoutubeEmbeded;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AAClD,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,SAAS,QAAQ,oCAAoC;AAC9D,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,YAAY,EAAEC,YAAY,EAAEC,YAAY,QAAQ,WAAW;AAEpE,MAAMC,cAAc,GAAG,CAAC;EACtBC,QAAQ;EACRC,OAAO;EACPC,eAAe;EACfC,UAAU;EACVC,MAAM;EACNC,WAAW;EACXC,QAAQ;EACRC,QAAQ;EACRC,IAAI;EACJC,QAAQ;EACRC,aAAa;EACbC,KAAK;EACLC,SAAS;EACTC,WAAW;EACXC,QAAQ;EACRC,eAAe;EACfC;AACF,CAAC,KAAK;EACJ,MAAM,CAACC,cAAc,EAAEC,QAAQ,CAAC,GAAGxB,SAAS,CAACC,cAAc,CAAC;EAC5D,MAAM,CAACwB,YAAY,EAAEC,eAAe,CAAC,GAAG7B,QAAQ,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC8B,YAAY,EAAEC,eAAe,CAAC,GAAG/B,QAAQ,CAAC,CAAC,CAACS,QAAQ,CAAC;EAC5D,MAAM,CAAC;IAAEuB,SAAS;IAAEC;EAAa,CAAC,EAAEC,eAAe,CAAC,GAAGlC,QAAQ,CAAC;IAC9DgC,SAAS,EAAEnB,MAAM;IACjBoB,YAAY,EAAEV;EAChB,CAAC,CAAC;EAEF,MAAMY,SAAS,GAAGC,kBAAkB,CAAC1B,OAAO,CAAC;EAC7C,MAAM2B,SAAS,GAAGvB,WAAW,GAAI,IAAGA,WAAY,EAAC,GAAG,EAAE;EACtD,MAAMwB,KAAK,GAAGtB,QAAQ,GAAG,kCAAkC,GAAG,yBAAyB;EACvF,MAAMuB,SAAS,GAAGlC,YAAY,CAAC;IAC7BoB,SAAS;IACTd,eAAe;IACfO,QAAQ;IACRiB,SAAS;IACTH,SAAS;IACTf;EACF,CAAC,CAAC;EACF,MAAMuB,UAAU,GAAGpB,KAAK,GAAG,SAAS,GAAG,EAAE;EACzC,MAAMqB,SAAS,GAAG,CAACvB,QAAQ,GACtB,GAAEoB,KAAM,UAASH,SAAU,cAAaK,UAAW,GAAEH,SAAU,EAAC,GAChE,GAAEC,KAAM,gCAA+BE,UAAW,SAAQL,SAAU,GAAEE,SAAU,EAAC;EACtF,MAAMK,sBAAsB,GAAI,aAAYZ,YAAY,GAAG,cAAc,GAAG,EAAG,EAAC;EAEhF7B,SAAS,CACP,MAAM;IACJ,IAAK,CAACsB,QAAQ,IAAI,CAACG,cAAc,IAAKM,SAAS,KAAK1B,YAAY,EAAE;IAElE,MAAMqC,GAAG,GAAG,IAAIC,KAAK,EAAE;IACvB;IACAD,GAAG,CAACE,MAAM,GAAG,YAAW;MACtB,IAAIC,YAAY,GAAGd,SAAS;MAC5B,IAAI,IAAI,IAAI,IAAI,CAACe,KAAK,KAAK,GAAG,EAAED,YAAY,GAAGxC,YAAY;MAC3D4B,eAAe,CAAC;QAAEF,SAAS,EAAEc,YAAY;QAAEb,YAAY,EAAE;MAAK,CAAC,CAAC;IAClE,CAAC;IAEDU,GAAG,CAACK,GAAG,GAAGT,SAAS;EACrB,CAAC,EACD,CAACP,SAAS,EAAEN,cAAc,EAAEa,SAAS,EAAEhB,QAAQ,CAAC,CACjD;EAED,MAAM0B,eAAe,GAAG,MAAM;IAC5B,IAAIrB,YAAY,EAAE;IAClBC,eAAe,CAAC,IAAI,CAAC;EACvB,CAAC;EAED,MAAMqB,SAAS,GAAG,MAAM;IACtB,IAAIpB,YAAY,IAAIN,eAAe,EAAE;IACrCL,aAAa,EAAE;IACfY,eAAe,CAAC,IAAI,CAAC;EACvB,CAAC;EAED,oBACE,0CACGH,YAAY,iBACX,uDACE;IAAM,GAAG,EAAC,YAAY;IAAC,IAAI,EAAErB;EAAa,EAAG,eAC7C;IAAM,GAAG,EAAC,YAAY;IAAC,IAAI,EAAE+B;EAAM,EAAG,eACtC;IAAM,GAAG,EAAC,YAAY;IAAC,IAAI,EAAC;EAAwB,EAAG,EACtDjB,SAAS,iBACR,uDACE;IAAM,GAAG,EAAC,YAAY;IAAC,IAAI,EAAC;EAAgC,EAAG,eAC/D;IAAM,GAAG,EAAC,YAAY;IAAC,IAAI,EAAC;EAAqC,EAAG,CAEvE,CAEJ,eACD;IACE,GAAG,EAAEM,QAAS;IACd,IAAI,EAAC,QAAQ;IACb,aAAa,EAAEsB,eAAgB;IAC/B,OAAO,EAAEC,SAAU;IACnB,SAAS,EAAER,sBAAuB;IAClC,cAAY9B,UAAW;IACvB,KAAK,EAAE;MACLuC,eAAe,EAAG,OAAMlB,YAAY,GAAGM,SAAS,GAAG,EAAG;IACxD;EAAE,gBACF;IACE,IAAI,EAAC,QAAQ;IACb,SAAS,EAAC,0BAA0B;IACpC,cAAa,GAAExB,QAAS,IAAGH,UAAW;EAAE,gBACxC;IAAK,SAAS,EAAC;EAAkB,EAAG,CAChC,EACLkB,YAAY,iBACX;IACE,SAAS,EAAER,WAAY;IACvB,KAAK,EAAEV,UAAW;IAClB,KAAK,EAAC,yEAAyE;IAC/E,eAAe;IACf,GAAG,EAAE6B;EAAU,EAElB,CACG,CACL;AAEP,CAAC;AAEDjC,cAAc,CAAC4C,SAAS,GAAG;EACzB7B,QAAQ,EAAErB,SAAS,CAACmD,IAAI;EACxBlC,aAAa,EAAEjB,SAAS,CAACoD,IAAI;EAC7BjC,SAAS,EAAEnB,SAAS,CAACmD,IAAI;EACzB5C,QAAQ,EAAEP,SAAS,CAACmD,IAAI;EACxBnC,QAAQ,EAAEhB,SAAS,CAACmD,IAAI;EACxBjC,KAAK,EAAElB,SAAS,CAACmD,IAAI;EACrBpC,IAAI,EAAEf,SAAS,CAACmD,IAAI;EACpBrC,QAAQ,EAAEd,SAAS,CAACmD,IAAI;EACxB3C,OAAO,EAAER,SAAS,CAACqD,MAAM;EACzBjC,WAAW,EAAEpB,SAAS,CAACqD,MAAM;EAC7B1C,MAAM,EAAEX,SAAS,CAACqD,MAAM;EACxBxC,QAAQ,EAAEb,SAAS,CAACqD,MAAM;EAC1B5C,eAAe,EAAET,SAAS,CAACqD,MAAM;EACjCzC,WAAW,EAAEZ,SAAS,CAACqD,MAAM;EAC7B3C,UAAU,EAAEV,SAAS,CAACqD,MAAM;EAC5B/B,eAAe,EAAEtB,SAAS,CAACmD,IAAI;EAC/B5B,SAAS,EAAEvB,SAAS,CAACsD;AACvB,CAAC;AAEDhD,cAAc,CAACiD,YAAY,GAAG;EAC5BlC,QAAQ,EAAE,IAAI;EACdJ,aAAa,EAAE,MAAM,CAAC,CAAC;EACvBE,SAAS,EAAE,KAAK;EAChBZ,QAAQ,EAAE,KAAK;EACfS,QAAQ,EAAE,KAAK;EACfE,KAAK,EAAE,KAAK;EACZH,IAAI,EAAE,KAAK;EACXD,QAAQ,EAAE,KAAK;EACfM,WAAW,EAAE,EAAE;EACfT,MAAM,EAAE,WAAW;EACnBE,QAAQ,EAAE,OAAO;EACjBL,OAAO,EAAE,EAAE;EACXC,eAAe,EAAE,EAAE;EACnBG,WAAW,EAAE,EAAE;EACfF,UAAU,EAAE,EAAE;EACdY,eAAe,EAAE,KAAK;EACtBC,SAAS,EAAE,CAAC;AACd,CAAC;AAED,eAAejB,cAAc"}
1
+ {"version":3,"file":"YoutubeEmbeded.js","names":["React","useState","useEffect","PropTypes","useInView","IN_VIEW_CONFIG","getPosterUrl","YT_HQ_FORMAT","YT_IMAGE_URL","YoutubeEmbeded","autoplay","videoId","playlistCoverId","videoTitle","poster","videoParams","announce","noCookie","webp","playlist","onIframeAdded","muted","adNetwork","iframeClass","priority","placeholderOnly","imageData","isIntersecting","outerRef","preconnected","setPreconnected","renderIframe","setRenderIframe","imageSize","displayImage","setImageDetails","encodedId","encodeURIComponent","paramsImp","ytUrl","posterUrl","mutedValue","iframeSrc","parsedWrapperClassname","isMounted","img","Image","onload","newImageSize","width","src","warmConnections","addIframe","backgroundImage","propTypes","bool","func","string","object","defaultProps"],"sources":["../../../../../src/components/Video/providers/YouTube/YoutubeEmbeded.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useInView } from '@blaze-react/utils/lib/customHooks';\nimport { IN_VIEW_CONFIG } from '../../../../constants';\nimport { getPosterUrl, YT_HQ_FORMAT, YT_IMAGE_URL } from './helpers';\n\nconst YoutubeEmbeded = ({\n autoplay,\n videoId,\n playlistCoverId,\n videoTitle,\n poster,\n videoParams,\n announce,\n noCookie,\n webp,\n playlist,\n onIframeAdded,\n muted,\n adNetwork,\n iframeClass,\n priority,\n placeholderOnly,\n imageData\n}) => {\n const [isIntersecting, outerRef] = useInView(IN_VIEW_CONFIG);\n const [preconnected, setPreconnected] = useState(false);\n const [renderIframe, setRenderIframe] = useState(!!autoplay);\n const [{ imageSize, displayImage }, setImageDetails] = useState({\n imageSize: poster,\n displayImage: priority\n });\n\n const encodedId = encodeURIComponent(videoId);\n const paramsImp = videoParams ? `&${videoParams}` : '';\n const ytUrl = noCookie ? 'https://www.youtube-nocookie.com' : 'https://www.youtube.com';\n const posterUrl = getPosterUrl({\n imageData,\n playlistCoverId,\n playlist,\n encodedId,\n imageSize,\n webp\n });\n const mutedValue = muted ? '&mute=1' : '';\n const iframeSrc = !playlist\n ? `${ytUrl}/embed/${encodedId}?autoplay=1${mutedValue}${paramsImp}`\n : `${ytUrl}/embed/videoseries?autoplay=1${mutedValue}&list=${encodedId}${paramsImp}`;\n const parsedWrapperClassname = `yt-facade ${renderIframe ? 'yt-activated' : ''}`;\n\n useEffect(\n () => {\n let isMounted = true;\n if ((!priority && !isIntersecting) || imageSize === YT_HQ_FORMAT) return;\n\n const img = new Image();\n // eslint-disable-next-line func-names\n img.onload = function() {\n let newImageSize = imageSize;\n if (this && this.width === 120) newImageSize = YT_HQ_FORMAT;\n if (isMounted) setImageDetails({ imageSize: newImageSize, displayImage: true });\n };\n\n img.src = posterUrl;\n return () => {\n isMounted = false;\n };\n },\n [imageSize, isIntersecting, posterUrl, priority]\n );\n\n const warmConnections = () => {\n if (preconnected) return;\n setPreconnected(true);\n };\n\n const addIframe = () => {\n if (renderIframe || placeholderOnly) return;\n onIframeAdded();\n setRenderIframe(true);\n };\n\n return (\n <>\n {preconnected && (\n <>\n <link rel=\"preconnect\" href={YT_IMAGE_URL} />\n <link rel=\"preconnect\" href={ytUrl} />\n <link rel=\"preconnect\" href=\"https://www.google.com\" />\n {adNetwork && (\n <>\n <link rel=\"preconnect\" href=\"https://static.doubleclick.net\" />\n <link rel=\"preconnect\" href=\"https://googleads.g.doubleclick.net\" />\n </>\n )}\n </>\n )}\n <div\n ref={outerRef}\n role=\"button\"\n onPointerOver={warmConnections}\n onClick={addIframe}\n className={parsedWrapperClassname}\n data-title={videoTitle}\n style={{\n backgroundImage: `url(${displayImage ? posterUrl : ''})`\n }}>\n <div\n type=\"button\"\n className=\"yt-facade-button-wrapper\"\n aria-label={`${announce} ${videoTitle}`}>\n <div className=\"yt-facade-button\" />\n </div>\n {renderIframe && (\n <iframe\n className={iframeClass}\n title={videoTitle}\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n src={iframeSrc}\n />\n )}\n </div>\n </>\n );\n};\n\nYoutubeEmbeded.propTypes = {\n priority: PropTypes.bool,\n onIframeAdded: PropTypes.func,\n adNetwork: PropTypes.bool,\n autoplay: PropTypes.bool,\n playlist: PropTypes.bool,\n muted: PropTypes.bool,\n webp: PropTypes.bool,\n noCookie: PropTypes.bool,\n videoId: PropTypes.string,\n iframeClass: PropTypes.string,\n poster: PropTypes.string,\n announce: PropTypes.string,\n playlistCoverId: PropTypes.string,\n videoParams: PropTypes.string,\n videoTitle: PropTypes.string,\n placeholderOnly: PropTypes.bool,\n imageData: PropTypes.object\n};\n\nYoutubeEmbeded.defaultProps = {\n priority: true,\n onIframeAdded: () => {},\n adNetwork: false,\n autoplay: false,\n playlist: false,\n muted: false,\n webp: false,\n noCookie: false,\n iframeClass: '',\n poster: 'sddefault',\n announce: 'Watch',\n videoId: '',\n playlistCoverId: '',\n videoParams: '',\n videoTitle: '',\n placeholderOnly: false,\n imageData: {}\n};\n\nexport default YoutubeEmbeded;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaze-cms/react-page-builder",
3
- "version": "0.126.0-admin-updates.3",
3
+ "version": "0.126.0-alpha.5",
4
4
  "description": "Blaze react page builder",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-es/index.js",
@@ -27,14 +27,14 @@
27
27
  },
28
28
  "license": "GPL-3.0",
29
29
  "dependencies": {
30
- "@blaze-cms/core-auth-ui": "0.126.0-admin-updates.0",
30
+ "@blaze-cms/core-auth-ui": "^0.125.0",
31
31
  "@blaze-cms/core-errors": "^0.118.0",
32
32
  "@blaze-cms/image-cdn-react": "0.3.0-alpha.3",
33
- "@blaze-cms/nextjs-components": "0.126.0-admin-updates.0",
34
- "@blaze-cms/plugin-search-ui": "0.126.0-admin-updates.3",
33
+ "@blaze-cms/nextjs-components": "^0.125.0",
34
+ "@blaze-cms/plugin-search-ui": "^0.125.0",
35
35
  "@blaze-cms/setup-ui": "^0.92.0",
36
- "@blaze-cms/utils": "0.126.0-admin-updates.0",
37
- "@blaze-cms/utils-handlebars": "0.126.0-admin-updates.0",
36
+ "@blaze-cms/utils": "^0.125.0",
37
+ "@blaze-cms/utils-handlebars": "^0.125.0",
38
38
  "@blaze-react/breadcrumb": "0.8.0-alpha.60",
39
39
  "@blaze-react/button": "0.5.19",
40
40
  "@blaze-react/checkboxes": "0.5.31",
@@ -87,5 +87,5 @@
87
87
  "lib/*",
88
88
  "lib-es/*"
89
89
  ],
90
- "gitHead": "22c9ef639e0db682a0a57fc15ac8b8a58f26d41f"
90
+ "gitHead": "69e591d8d0845ae2981a58bb33f89c7121aa3da2"
91
91
  }
@@ -1,14 +1,26 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import ContentGroupTabs from './ContentGroupTabs';
4
+ import { getSectionsData } from './helpers';
4
5
 
5
- const ContentGroup = ({ contentType, ...props }) => {
6
- if (contentType === 'tab' || contentType === 'sidepanel')
7
- return <ContentGroupTabs contentType={contentType} {...props} />;
8
- return '';
6
+ const ContentGroup = ({ contentType, children, ...props }) => {
7
+ const groupSections = children?.props?.children[1];
8
+ if (!groupSections || !groupSections.length) return '';
9
+ if (contentType !== 'tab' && contentType !== 'sidepanel') return '';
10
+ const sectionsData = getSectionsData(groupSections);
11
+
12
+ return (
13
+ <ContentGroupTabs
14
+ contentType={contentType}
15
+ groupSections={groupSections}
16
+ sectionsData={sectionsData}
17
+ {...props}
18
+ />
19
+ );
9
20
  };
10
21
 
11
22
  ContentGroup.propTypes = {
23
+ children: PropTypes.object.isRequired,
12
24
  contentType: PropTypes.string.isRequired
13
25
  };
14
26
 
@@ -1,28 +1,37 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
+ import { useRouter } from 'next/router';
4
+ import { getActiveTab } from './helpers';
5
+ import { TAB, TABS, SIDEPANEL, CONTENT_GROUP, PANEL } from './constants';
3
6
 
4
- const ContentGroupTabs = ({ name, contentType, modifier, children, ...props }) => {
5
- const [selectedTab, setSelectedTab] = useState('tab-0');
6
- const groupSections = children?.props?.children[1];
7
- const contentClassame = contentType === 'tab' ? '-tabs' : '-sidepanel';
8
- if (!groupSections || !groupSections.length) return '';
7
+ const ContentGroupTabs = ({ name, contentType, modifier, groupSections, sectionsData }) => {
8
+ const router = useRouter();
9
+ const [selectedTab, setSelectedTab] = useState(getActiveTab(sectionsData, ''));
10
+ const { asPath } = router;
11
+ const contentClassame = contentType === TAB ? TABS : SIDEPANEL;
12
+ const mainDivClass = `${CONTENT_GROUP}-${contentClassame}`;
13
+ const contentGroupClass = `${CONTENT_GROUP}-${contentClassame}__buttons-wrapper`;
14
+ const sectionClass = `${CONTENT_GROUP}-${contentClassame}__content-section`;
15
+
16
+ useEffect(
17
+ () => {
18
+ const activeTab = getActiveTab(sectionsData, asPath);
19
+ if (activeTab !== selectedTab) setSelectedTab(activeTab);
20
+ },
21
+ [asPath, sectionsData, selectedTab]
22
+ );
9
23
 
10
24
  return (
11
- <div className={`content-group${contentClassame}`}>
12
- <ul
13
- className={`content-group${contentClassame}__buttons-wrapper`}
14
- role="tablist"
15
- aria-label={name}>
25
+ <div className={mainDivClass}>
26
+ <ul className={contentGroupClass} role="tablist" aria-label={name}>
16
27
  {groupSections.map((groupSection, index) => {
17
- const {
18
- props: { component: { settings: { label: sectionLabel } = {} } = {} } = {}
19
- } = groupSection;
20
- const tabId = `tab-${index}`;
21
- const panelId = `panel-${index}`;
28
+ const [sectionName, sectioLabel] = sectionsData[index];
29
+ const tabId = `${TAB}-${sectionName}`;
30
+ const panelId = `${PANEL}-${sectionName}`;
22
31
  const isSelected = selectedTab === tabId;
23
- const buttonClassName = isSelected
24
- ? `content-group${contentClassame}__button--is-active`
25
- : `content-group${contentClassame}__button`;
32
+ const buttonClassName = `${CONTENT_GROUP}-${contentClassame}__button${
33
+ isSelected ? '--is-active' : ''
34
+ }`;
26
35
 
27
36
  return (
28
37
  <button
@@ -33,22 +42,29 @@ const ContentGroupTabs = ({ name, contentType, modifier, children, ...props }) =
33
42
  role="tab"
34
43
  aria-selected={isSelected}
35
44
  aria-controls={panelId}
36
- onClick={() => setSelectedTab(tabId)}>
37
- {sectionLabel}
45
+ onClick={() => {
46
+ const baseUrl = asPath.split('#')[0];
47
+ const newUrl = `${baseUrl}#${sectionName}`;
48
+ if (asPath === newUrl) return;
49
+ router.push(`/Resolver`, newUrl, { shallow: true });
50
+ setSelectedTab(tabId);
51
+ }}>
52
+ {sectioLabel}
38
53
  </button>
39
54
  );
40
55
  })}
41
56
  </ul>
42
57
  {groupSections.map((groupSection, index) => {
43
- const tabId = `tab-${index}`;
44
- const panelId = `panel-${index}`;
58
+ const [sectionName] = sectionsData[index];
59
+ const tabId = `${TAB}-${sectionName}`;
60
+ const panelId = `${PANEL}-${sectionName}`;
45
61
  if (selectedTab !== tabId) return null;
46
62
 
47
63
  return (
48
64
  <div
49
- id={panelId}
65
+ id={sectionName}
50
66
  key={panelId}
51
- className={`content-group${contentClassame}__content-section`}
67
+ className={sectionClass}
52
68
  role="tabpanel"
53
69
  aria-labelledby={tabId}>
54
70
  {groupSection}
@@ -63,12 +79,12 @@ ContentGroupTabs.propTypes = {
63
79
  name: PropTypes.string.isRequired,
64
80
  contentType: PropTypes.string.isRequired,
65
81
  modifier: PropTypes.string,
66
- children: PropTypes.object
82
+ groupSections: PropTypes.array.isRequired,
83
+ sectionsData: PropTypes.array.isRequired
67
84
  };
68
85
 
69
86
  ContentGroupTabs.defaultProps = {
70
- modifier: '',
71
- children: {}
87
+ modifier: ''
72
88
  };
73
89
 
74
90
  export default ContentGroupTabs;
@@ -0,0 +1,7 @@
1
+ const TAB = 'tab';
2
+ const TABS = 'tabs';
3
+ const SIDEPANEL = 'sidepanel';
4
+ const CONTENT_GROUP = 'content-group';
5
+ const PANEL = 'panel';
6
+
7
+ export { TAB, TABS, SIDEPANEL, CONTENT_GROUP, PANEL };
@@ -0,0 +1,11 @@
1
+ import { TAB } from '../constants';
2
+
3
+ const getActiveTab = (sections, url) => {
4
+ const decodedUrl = decodeURI(url);
5
+ const activeTabName = decodedUrl.split('#')[1];
6
+ const isUrlTabValid = !!sections.find(section => section[0] === activeTabName);
7
+ const tabToUse = (isUrlTabValid && activeTabName) || sections[0][0];
8
+ return `${TAB}-${tabToUse}`;
9
+ };
10
+
11
+ export default getActiveTab;
@@ -0,0 +1,7 @@
1
+ const getSectionsData = sections =>
2
+ sections.map(section => {
3
+ const { props: { component: { settings: { label, name } = {} } = {} } = {} } = section;
4
+ return [name, label];
5
+ });
6
+
7
+ export default getSectionsData;
@@ -0,0 +1,4 @@
1
+ import getSectionsData from './get-sections-data';
2
+ import getActiveTab from './get-active-tab';
3
+
4
+ export { getSectionsData, getActiveTab };
@@ -2,10 +2,14 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { hasChildren } from '../../helpers';
4
4
 
5
- const ContentGroupSection = ({ children, ...props }) => {
5
+ const ContentGroupSection = ({ children, name, ...props }) => {
6
6
  if (!hasChildren(children)) return null;
7
7
 
8
- return <div className="content-group-section">{children}</div>;
8
+ return (
9
+ <div key={name} className="content-group-section">
10
+ {children}
11
+ </div>
12
+ );
9
13
  };
10
14
 
11
15
  ContentGroupSection.propTypes = {
@@ -50,6 +50,7 @@ const YoutubeEmbeded = ({
50
50
 
51
51
  useEffect(
52
52
  () => {
53
+ let isMounted = true;
53
54
  if ((!priority && !isIntersecting) || imageSize === YT_HQ_FORMAT) return;
54
55
 
55
56
  const img = new Image();
@@ -57,10 +58,13 @@ const YoutubeEmbeded = ({
57
58
  img.onload = function() {
58
59
  let newImageSize = imageSize;
59
60
  if (this && this.width === 120) newImageSize = YT_HQ_FORMAT;
60
- setImageDetails({ imageSize: newImageSize, displayImage: true });
61
+ if (isMounted) setImageDetails({ imageSize: newImageSize, displayImage: true });
61
62
  };
62
63
 
63
64
  img.src = posterUrl;
65
+ return () => {
66
+ isMounted = false;
67
+ };
64
68
  },
65
69
  [imageSize, isIntersecting, posterUrl, priority]
66
70
  );
@@ -1,14 +1,27 @@
1
+ import React from 'react';
1
2
  import { render } from '@blaze-cms/tools/test-helpers/test-functions';
2
3
  import ContentGroupTabs from '../../../../../src/components/ContentGroup/ContentGroupTabs';
3
4
 
5
+ jest.mock('next/router', () => ({
6
+ useRouter: jest.fn(() => ({ asPath: 'tabs-url' }))
7
+ }));
8
+
9
+ const mockedProps = {
10
+ name: 'testTabs',
11
+ contentType: 'tab',
12
+ groupSections: [<div>section one</div>, <div>section two</div>],
13
+ sectionsData: [['section-one', 'sectionOne'], ['section-two', 'sectionTwo']]
14
+ };
15
+
4
16
  describe('ContentGroupTabs component', () => {
5
17
  it('should match snapshot and render tabs content', () => {
6
- const { asFragment: tabContentGroup } = render(ContentGroupTabs, { contentType: 'tab' });
18
+ const { asFragment: tabContentGroup } = render(ContentGroupTabs, mockedProps);
7
19
  expect(tabContentGroup()).toMatchSnapshot();
8
20
  });
9
21
 
10
22
  it('should match snapshot and render sidepanel content', () => {
11
23
  const { asFragment: sidepanelContentGroup } = render(ContentGroupTabs, {
24
+ ...mockedProps,
12
25
  contentType: 'sidepanel'
13
26
  });
14
27
  expect(sidepanelContentGroup()).toMatchSnapshot();