@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.
- package/CHANGELOG.md +6 -19
- package/lib/components/ContentGroup/ContentGroup.js +13 -4
- package/lib/components/ContentGroup/ContentGroup.js.map +1 -1
- package/lib/components/ContentGroup/ContentGroupTabs.js +43 -31
- package/lib/components/ContentGroup/ContentGroupTabs.js.map +1 -1
- package/lib/components/ContentGroup/constants.js +18 -0
- package/lib/components/ContentGroup/constants.js.map +1 -0
- package/lib/components/ContentGroup/helpers/get-active-tab.js +23 -0
- package/lib/components/ContentGroup/helpers/get-active-tab.js.map +1 -0
- package/lib/components/ContentGroup/helpers/get-sections-data.js +25 -0
- package/lib/components/ContentGroup/helpers/get-sections-data.js.map +1 -0
- package/lib/components/ContentGroup/helpers/index.js +22 -0
- package/lib/components/ContentGroup/helpers/index.js.map +1 -0
- package/lib/components/ContentGroupSection/ContentGroupSection.js +4 -1
- package/lib/components/ContentGroupSection/ContentGroupSection.js.map +1 -1
- package/lib/components/Video/providers/YouTube/YoutubeEmbeded.js +5 -1
- package/lib/components/Video/providers/YouTube/YoutubeEmbeded.js.map +1 -1
- package/lib-es/components/ContentGroup/ContentGroup.js +14 -5
- package/lib-es/components/ContentGroup/ContentGroup.js.map +1 -1
- package/lib-es/components/ContentGroup/ContentGroupTabs.js +48 -39
- package/lib-es/components/ContentGroup/ContentGroupTabs.js.map +1 -1
- package/lib-es/components/ContentGroup/constants.js +7 -0
- package/lib-es/components/ContentGroup/constants.js.map +1 -0
- package/lib-es/components/ContentGroup/helpers/get-active-tab.js +10 -0
- package/lib-es/components/ContentGroup/helpers/get-active-tab.js.map +1 -0
- package/lib-es/components/ContentGroup/helpers/get-sections-data.js +15 -0
- package/lib-es/components/ContentGroup/helpers/get-sections-data.js.map +1 -0
- package/lib-es/components/ContentGroup/helpers/index.js +4 -0
- package/lib-es/components/ContentGroup/helpers/index.js.map +1 -0
- package/lib-es/components/ContentGroupSection/ContentGroupSection.js +4 -2
- package/lib-es/components/ContentGroupSection/ContentGroupSection.js.map +1 -1
- package/lib-es/components/Video/providers/YouTube/YoutubeEmbeded.js +5 -1
- package/lib-es/components/Video/providers/YouTube/YoutubeEmbeded.js.map +1 -1
- package/package.json +7 -7
- package/src/components/ContentGroup/ContentGroup.js +16 -4
- package/src/components/ContentGroup/ContentGroupTabs.js +44 -28
- package/src/components/ContentGroup/constants.js +7 -0
- package/src/components/ContentGroup/helpers/get-active-tab.js +11 -0
- package/src/components/ContentGroup/helpers/get-sections-data.js +7 -0
- package/src/components/ContentGroup/helpers/index.js +4 -0
- package/src/components/ContentGroupSection/ContentGroupSection.js +6 -2
- package/src/components/Video/providers/YouTube/YoutubeEmbeded.js +5 -1
- package/tests/unit/src/components/ContentGroup/ContentGroupTabs.test.js +14 -1
- package/tests/unit/src/components/ContentGroup/__snapshots__/ContentGroupTabs.test.js.snap +88 -2
- package/tests/unit/src/components/ContentGroup/helpers/get-active-tab.test.js +19 -0
- package/tests/unit/src/components/ContentGroup/helpers/get-sections-data.test.js +14 -0
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
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:
|
|
27
|
+
className: mainDivClass
|
|
20
28
|
}, /*#__PURE__*/React.createElement("ul", {
|
|
21
|
-
className:
|
|
29
|
+
className: contentGroupClass,
|
|
22
30
|
role: "tablist",
|
|
23
31
|
"aria-label": name
|
|
24
32
|
}, groupSections.map((groupSection, index) => {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
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 ?
|
|
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: () =>
|
|
47
|
-
|
|
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
|
|
50
|
-
const
|
|
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:
|
|
62
|
+
id: sectionName,
|
|
54
63
|
key: panelId,
|
|
55
|
-
className:
|
|
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
|
-
|
|
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","
|
|
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 @@
|
|
|
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 @@
|
|
|
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\"
|
|
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,
|
|
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-
|
|
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.
|
|
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.
|
|
34
|
-
"@blaze-cms/plugin-search-ui": "0.
|
|
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.
|
|
37
|
-
"@blaze-cms/utils-handlebars": "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": "
|
|
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
|
-
|
|
7
|
-
|
|
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,
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
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={
|
|
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
|
-
|
|
19
|
-
|
|
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 =
|
|
24
|
-
?
|
|
25
|
-
|
|
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={() =>
|
|
37
|
-
|
|
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
|
|
44
|
-
const
|
|
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={
|
|
65
|
+
id={sectionName}
|
|
50
66
|
key={panelId}
|
|
51
|
-
className={
|
|
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
|
-
|
|
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,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;
|
|
@@ -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
|
|
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,
|
|
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();
|