@anas_hameed/edly-saas-widget 0.1.5 → 0.1.6

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.
@@ -39,12 +39,14 @@ const FooterWidget = () => {
39
39
  }, [footerData]);
40
40
  (0, _react.useEffect)(() => {
41
41
  const fetchData = async () => {
42
- if (!config?.DISCOVERY_URL) {
42
+ if (!config?.MARKETING_SITE_BASE_URL) {
43
43
  console.error("No url found for discovery", config);
44
44
  return;
45
45
  }
46
46
  try {
47
- const response = await fetch(`${config.DISCOVERY_URL}/wp-json/edly-wp-routes/footer`, {
47
+ const response = await fetch(`${config.MARKETING_SITE_BASE_URL}/wp-json/edly-wp-routes/footer`,
48
+ // `https://venus.discover.multitenantsdev.edly.io/wp-json/edly-wp-routes/footer`,
49
+ {
48
50
  credentials: "include"
49
51
  });
50
52
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_frontendPlatform","require","_react","_dompurify","_interopRequireDefault","_jsxRuntime","e","__esModule","default","FooterWidget","footerData","setFooterData","useState","config","getConfig","useEffect","scrollBtn","document","getElementById","scrollToTop","window","scrollTo","top","behavior","toggleVisibility","scrollY","classList","add","remove","addEventListener","removeEventListener","fetchData","DISCOVERY_URL","console","error","response","fetch","credentials","ok","Error","status","jsonData","json","cleanHtml","DOMPurify","sanitize","ADD_ATTR","jsx","className","dangerouslySetInnerHTML","__html","_default","exports"],"sources":["../../src/FooterWidget/index.jsx"],"sourcesContent":["import { getConfig } from \"@edx/frontend-platform\";\nimport { useEffect, useState } from \"react\";\nimport DOMPurify from \"dompurify\";\nimport \"./main.scss\";\n\nconst FooterWidget = () => {\n const [footerData, setFooterData] = useState(\"\");\n const config = getConfig();\n\n useEffect(() => {\n const scrollBtn = document.getElementById(\"scrollToTop\");\n if (scrollBtn) {\n const scrollToTop = () => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n };\n\n const toggleVisibility = () => {\n if (window.scrollY > 300) {\n scrollBtn.classList.add(\"show-btn\"); // We will style this class in SCSS\n } else {\n scrollBtn.classList.remove(\"show-btn\");\n }\n };\n\n scrollBtn.addEventListener(\"click\", scrollToTop);\n window.addEventListener(\"scroll\", toggleVisibility);\n\n return () => {\n scrollBtn.removeEventListener(\"click\", scrollToTop);\n window.removeEventListener(\"scroll\", toggleVisibility);\n };\n }\n }, [footerData]);\n\n useEffect(() => {\n const fetchData = async () => {\n if (!config?.DISCOVERY_URL) {\n console.error(\"No url found for discovery\", config);\n return;\n }\n try {\n const response = await fetch(\n `${config.DISCOVERY_URL}/wp-json/edly-wp-routes/footer`,\n { credentials: \"include\" }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const jsonData = await response.json();\n const cleanHtml = DOMPurify.sanitize(jsonData, {\n ADD_ATTR: [\"target\", \"class\"],\n });\n setFooterData(cleanHtml);\n } catch (error) {\n console.error(error);\n }\n };\n\n fetchData();\n }, []);\n\n return (\n <footer\n className=\"site-header\"\n dangerouslySetInnerHTML={{ __html: footerData }}\n />\n );\n};\n\nexport default FooterWidget;\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAC,sBAAA,CAAAH,OAAA;AACAA,OAAA;AAAqB,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAG,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErB,MAAMG,YAAY,GAAGA,CAAA,KAAM;EACzB,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAG,IAAAC,eAAQ,EAAC,EAAE,CAAC;EAChD,MAAMC,MAAM,GAAG,IAAAC,2BAAS,EAAC,CAAC;EAE1B,IAAAC,gBAAS,EAAC,MAAM;IACd,MAAMC,SAAS,GAAGC,QAAQ,CAACC,cAAc,CAAC,aAAa,CAAC;IACxD,IAAIF,SAAS,EAAE;MACb,MAAMG,WAAW,GAAGA,CAAA,KAAM;QACxBC,MAAM,CAACC,QAAQ,CAAC;UAAEC,GAAG,EAAE,CAAC;UAAEC,QAAQ,EAAE;QAAS,CAAC,CAAC;MACjD,CAAC;MAED,MAAMC,gBAAgB,GAAGA,CAAA,KAAM;QAC7B,IAAIJ,MAAM,CAACK,OAAO,GAAG,GAAG,EAAE;UACxBT,SAAS,CAACU,SAAS,CAACC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACvC,CAAC,MAAM;UACLX,SAAS,CAACU,SAAS,CAACE,MAAM,CAAC,UAAU,CAAC;QACxC;MACF,CAAC;MAEDZ,SAAS,CAACa,gBAAgB,CAAC,OAAO,EAAEV,WAAW,CAAC;MAChDC,MAAM,CAACS,gBAAgB,CAAC,QAAQ,EAAEL,gBAAgB,CAAC;MAEnD,OAAO,MAAM;QACXR,SAAS,CAACc,mBAAmB,CAAC,OAAO,EAAEX,WAAW,CAAC;QACnDC,MAAM,CAACU,mBAAmB,CAAC,QAAQ,EAAEN,gBAAgB,CAAC;MACxD,CAAC;IACH;EACF,CAAC,EAAE,CAACd,UAAU,CAAC,CAAC;EAEhB,IAAAK,gBAAS,EAAC,MAAM;IACd,MAAMgB,SAAS,GAAG,MAAAA,CAAA,KAAY;MAC5B,IAAI,CAAClB,MAAM,EAAEmB,aAAa,EAAE;QAC1BC,OAAO,CAACC,KAAK,CAAC,4BAA4B,EAAErB,MAAM,CAAC;QACnD;MACF;MACA,IAAI;QACF,MAAMsB,QAAQ,GAAG,MAAMC,KAAK,CAC1B,GAAGvB,MAAM,CAACmB,aAAa,gCAAgC,EACvD;UAAEK,WAAW,EAAE;QAAU,CAC3B,CAAC;QACD,IAAI,CAACF,QAAQ,CAACG,EAAE,EAAE;UAChB,MAAM,IAAIC,KAAK,CAAC,uBAAuBJ,QAAQ,CAACK,MAAM,EAAE,CAAC;QAC3D;QAEA,MAAMC,QAAQ,GAAG,MAAMN,QAAQ,CAACO,IAAI,CAAC,CAAC;QACtC,MAAMC,SAAS,GAAGC,kBAAS,CAACC,QAAQ,CAACJ,QAAQ,EAAE;UAC7CK,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO;QAC9B,CAAC,CAAC;QACFnC,aAAa,CAACgC,SAAS,CAAC;MAC1B,CAAC,CAAC,OAAOT,KAAK,EAAE;QACdD,OAAO,CAACC,KAAK,CAACA,KAAK,CAAC;MACtB;IACF,CAAC;IAEDH,SAAS,CAAC,CAAC;EACb,CAAC,EAAE,EAAE,CAAC;EAEN,oBACE,IAAA1B,WAAA,CAAA0C,GAAA;IACEC,SAAS,EAAC,aAAa;IACvBC,uBAAuB,EAAE;MAAEC,MAAM,EAAExC;IAAW;EAAE,CACjD,CAAC;AAEN,CAAC;AAAC,IAAAyC,QAAA,GAAAC,OAAA,CAAA5C,OAAA,GAEaC,YAAY","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_frontendPlatform","require","_react","_dompurify","_interopRequireDefault","_jsxRuntime","e","__esModule","default","FooterWidget","footerData","setFooterData","useState","config","getConfig","useEffect","scrollBtn","document","getElementById","scrollToTop","window","scrollTo","top","behavior","toggleVisibility","scrollY","classList","add","remove","addEventListener","removeEventListener","fetchData","MARKETING_SITE_BASE_URL","console","error","response","fetch","credentials","ok","Error","status","jsonData","json","cleanHtml","DOMPurify","sanitize","ADD_ATTR","jsx","className","dangerouslySetInnerHTML","__html","_default","exports"],"sources":["../../src/FooterWidget/index.jsx"],"sourcesContent":["import { getConfig } from \"@edx/frontend-platform\";\nimport { useEffect, useState } from \"react\";\nimport DOMPurify from \"dompurify\";\nimport \"./main.scss\";\n\nconst FooterWidget = () => {\n const [footerData, setFooterData] = useState(\"\");\n const config = getConfig();\n\n useEffect(() => {\n const scrollBtn = document.getElementById(\"scrollToTop\");\n if (scrollBtn) {\n const scrollToTop = () => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n };\n\n const toggleVisibility = () => {\n if (window.scrollY > 300) {\n scrollBtn.classList.add(\"show-btn\"); // We will style this class in SCSS\n } else {\n scrollBtn.classList.remove(\"show-btn\");\n }\n };\n\n scrollBtn.addEventListener(\"click\", scrollToTop);\n window.addEventListener(\"scroll\", toggleVisibility);\n\n return () => {\n scrollBtn.removeEventListener(\"click\", scrollToTop);\n window.removeEventListener(\"scroll\", toggleVisibility);\n };\n }\n }, [footerData]);\n\n useEffect(() => {\n const fetchData = async () => {\n if (!config?.MARKETING_SITE_BASE_URL) {\n console.error(\"No url found for discovery\", config);\n return;\n }\n try {\n const response = await fetch(\n `${config.MARKETING_SITE_BASE_URL}/wp-json/edly-wp-routes/footer`,\n // `https://venus.discover.multitenantsdev.edly.io/wp-json/edly-wp-routes/footer`,\n { credentials: \"include\" }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const jsonData = await response.json();\n const cleanHtml = DOMPurify.sanitize(jsonData, {\n ADD_ATTR: [\"target\", \"class\"],\n });\n setFooterData(cleanHtml);\n } catch (error) {\n console.error(error);\n }\n };\n\n fetchData();\n }, []);\n\n return (\n <footer\n className=\"site-header\"\n dangerouslySetInnerHTML={{ __html: footerData }}\n />\n );\n};\n\nexport default FooterWidget;\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAC,sBAAA,CAAAH,OAAA;AACAA,OAAA;AAAqB,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAG,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErB,MAAMG,YAAY,GAAGA,CAAA,KAAM;EACzB,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAG,IAAAC,eAAQ,EAAC,EAAE,CAAC;EAChD,MAAMC,MAAM,GAAG,IAAAC,2BAAS,EAAC,CAAC;EAE1B,IAAAC,gBAAS,EAAC,MAAM;IACd,MAAMC,SAAS,GAAGC,QAAQ,CAACC,cAAc,CAAC,aAAa,CAAC;IACxD,IAAIF,SAAS,EAAE;MACb,MAAMG,WAAW,GAAGA,CAAA,KAAM;QACxBC,MAAM,CAACC,QAAQ,CAAC;UAAEC,GAAG,EAAE,CAAC;UAAEC,QAAQ,EAAE;QAAS,CAAC,CAAC;MACjD,CAAC;MAED,MAAMC,gBAAgB,GAAGA,CAAA,KAAM;QAC7B,IAAIJ,MAAM,CAACK,OAAO,GAAG,GAAG,EAAE;UACxBT,SAAS,CAACU,SAAS,CAACC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACvC,CAAC,MAAM;UACLX,SAAS,CAACU,SAAS,CAACE,MAAM,CAAC,UAAU,CAAC;QACxC;MACF,CAAC;MAEDZ,SAAS,CAACa,gBAAgB,CAAC,OAAO,EAAEV,WAAW,CAAC;MAChDC,MAAM,CAACS,gBAAgB,CAAC,QAAQ,EAAEL,gBAAgB,CAAC;MAEnD,OAAO,MAAM;QACXR,SAAS,CAACc,mBAAmB,CAAC,OAAO,EAAEX,WAAW,CAAC;QACnDC,MAAM,CAACU,mBAAmB,CAAC,QAAQ,EAAEN,gBAAgB,CAAC;MACxD,CAAC;IACH;EACF,CAAC,EAAE,CAACd,UAAU,CAAC,CAAC;EAEhB,IAAAK,gBAAS,EAAC,MAAM;IACd,MAAMgB,SAAS,GAAG,MAAAA,CAAA,KAAY;MAC5B,IAAI,CAAClB,MAAM,EAAEmB,uBAAuB,EAAE;QACpCC,OAAO,CAACC,KAAK,CAAC,4BAA4B,EAAErB,MAAM,CAAC;QACnD;MACF;MACA,IAAI;QACF,MAAMsB,QAAQ,GAAG,MAAMC,KAAK,CAC1B,GAAGvB,MAAM,CAACmB,uBAAuB,gCAAgC;QACjE;QACA;UAAEK,WAAW,EAAE;QAAU,CAC3B,CAAC;QACD,IAAI,CAACF,QAAQ,CAACG,EAAE,EAAE;UAChB,MAAM,IAAIC,KAAK,CAAC,uBAAuBJ,QAAQ,CAACK,MAAM,EAAE,CAAC;QAC3D;QAEA,MAAMC,QAAQ,GAAG,MAAMN,QAAQ,CAACO,IAAI,CAAC,CAAC;QACtC,MAAMC,SAAS,GAAGC,kBAAS,CAACC,QAAQ,CAACJ,QAAQ,EAAE;UAC7CK,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO;QAC9B,CAAC,CAAC;QACFnC,aAAa,CAACgC,SAAS,CAAC;MAC1B,CAAC,CAAC,OAAOT,KAAK,EAAE;QACdD,OAAO,CAACC,KAAK,CAACA,KAAK,CAAC;MACtB;IACF,CAAC;IAEDH,SAAS,CAAC,CAAC;EACb,CAAC,EAAE,EAAE,CAAC;EAEN,oBACE,IAAA1B,WAAA,CAAA0C,GAAA;IACEC,SAAS,EAAC,aAAa;IACvBC,uBAAuB,EAAE;MAAEC,MAAM,EAAExC;IAAW;EAAE,CACjD,CAAC;AAEN,CAAC;AAAC,IAAAyC,QAAA,GAAAC,OAAA,CAAA5C,OAAA,GAEaC,YAAY","ignoreList":[]}
@@ -1,10 +1,10 @@
1
- $primary-color: black;
1
+ $primary-color: var(--primary-color);
2
2
  $text-color: #fff;
3
3
  $background-color: #ffffff;
4
4
  $submenu-bg: #ffffff;
5
5
  $submenu-border: #d1d5db;
6
6
  $submenu-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
7
- $hover-bg: lighten($primary-color, 45%);
7
+ $hover-bg: color-mix(in srgb, var(--primary-color) 5%, white 94%);
8
8
  $transition-speed: 0.25s;
9
9
  $font-family: 'Inter', sans-serif;
10
10
  $mobile-breakpoint: 1230px;
@@ -18,8 +18,9 @@ $font-size: 1em;
18
18
  p {
19
19
  font-size: $font-size;
20
20
  }
21
- h3, h3 {
21
+ h2, h3 {
22
22
  margin-bottom: 20px;
23
+ color: white;
23
24
  }
24
25
  }
25
26
 
@@ -58,6 +59,9 @@ $font-size: 1em;
58
59
  display: flex;
59
60
  li {
60
61
  margin: 0 10px 10px 0;
62
+ a{
63
+ color: white;
64
+ }
61
65
  }
62
66
  }
63
67
 
@@ -7,6 +7,7 @@ exports.default = void 0;
7
7
  var _frontendPlatform = require("@edx/frontend-platform");
8
8
  var _react = require("react");
9
9
  var _dompurify = _interopRequireDefault(require("dompurify"));
10
+ var _reactHelmet = require("react-helmet");
10
11
  require("./main.scss");
11
12
  var _jsxRuntime = require("react/jsx-runtime");
12
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -17,7 +18,19 @@ const HeaderWidget = () => {
17
18
  const [isMobile, setIsMobile] = (0, _react.useState)(window.innerWidth < WIDTH);
18
19
  const [isLoading, setIsLoading] = (0, _react.useState)(true);
19
20
  const config = (0, _frontendPlatform.getConfig)();
21
+
22
+ // useEffect(() => {
23
+ // if (isLoading) {
24
+ // document.body.classList.add("loader");
25
+ // }
26
+ // return () => {
27
+ // document.body.classList.remove("loader");
28
+ // };
29
+ // }, [isLoading]);
30
+
20
31
  (0, _react.useEffect)(() => {
32
+ console.log("color: ", config.COLORS);
33
+ document.documentElement.style.setProperty("--primary-color", config?.COLORS?.primary || "#de2025");
21
34
  const handleResize = () => {
22
35
  setIsMobile(window.innerWidth < WIDTH);
23
36
  if (window.innerWidth >= WIDTH) {
@@ -25,16 +38,20 @@ const HeaderWidget = () => {
25
38
  }
26
39
  };
27
40
  window.addEventListener("resize", handleResize);
28
- return () => window.removeEventListener("resize", handleResize);
41
+ return () => {
42
+ window.removeEventListener("resize", handleResize);
43
+ };
29
44
  }, []);
30
45
  (0, _react.useEffect)(() => {
31
46
  const fetchData = async () => {
32
- if (!config?.DISCOVERY_URL) {
47
+ if (!config?.MARKETING_SITE_BASE_URL) {
33
48
  console.error("No url found for discovery", config);
34
49
  return;
35
50
  }
36
51
  try {
37
- const response = await fetch(`${config.DISCOVERY_URL}/wp-json/edly-wp-routes/nav-menu`, {
52
+ const response = await fetch(`${config.MARKETING_SITE_BASE_URL}/wp-json/edly-wp-routes/nav-menu`,
53
+ // "https://venus.discover.multitenantsdev.edly.io/wp-json/edly-wp-routes/nav-menu",
54
+ {
38
55
  credentials: "include"
39
56
  });
40
57
  if (!response.ok) {
@@ -60,37 +77,45 @@ const HeaderWidget = () => {
60
77
  const toggleMenu = () => {
61
78
  setIsOpen(!isOpen);
62
79
  };
63
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
64
- className: `shadow-lg ${isMobile ? "header-frame" : ""}`,
65
- children: [isMobile && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
66
- className: "menuOpner",
67
- type: "button",
68
- onClick: toggleMenu,
69
- style: {
70
- background: "none",
71
- border: "none",
72
- cursor: "pointer",
73
- fontSize: "24px"
74
- },
75
- children: isOpen ? "✖" : "☰"
80
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
81
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactHelmet.Helmet, {
82
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("link", {
83
+ rel: "stylesheet",
84
+ href: "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css",
85
+ crossOrigin: "anonymous"
86
+ })
76
87
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
77
- className: `header-holder ${isMobile ? "mobile-menu" : ""} ${isOpen ? "" : "mobile-hide"}`,
78
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
79
- href: "/",
80
- className: "custom-logo-link",
81
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
82
- width: "216",
83
- height: "140",
84
- src: config.LOGO_URL,
85
- className: "custom-logo",
86
- alt: "Venus",
87
- decoding: "async"
88
- })
89
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("header", {
90
- className: "site-header",
91
- dangerouslySetInnerHTML: {
92
- __html: headerData
93
- }
88
+ className: `shadow-lg ${isMobile ? "header-frame" : ""}`,
89
+ children: [isMobile && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
90
+ className: "menuOpner",
91
+ type: "button",
92
+ onClick: toggleMenu,
93
+ style: {
94
+ background: "none",
95
+ border: "none",
96
+ cursor: "pointer",
97
+ fontSize: "24px"
98
+ },
99
+ children: isOpen ? "✖" : "☰"
100
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
101
+ className: `header-holder ${isMobile ? "mobile-menu" : ""} ${isOpen ? "" : "mobile-hide"}`,
102
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
103
+ href: "/",
104
+ className: "custom-logo-link",
105
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
106
+ width: "216",
107
+ height: "140",
108
+ src: config.LOGO_URL,
109
+ className: "custom-logo",
110
+ alt: "Venus",
111
+ decoding: "async"
112
+ })
113
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("header", {
114
+ className: "site-header",
115
+ dangerouslySetInnerHTML: {
116
+ __html: headerData
117
+ }
118
+ })]
94
119
  })]
95
120
  })]
96
121
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_frontendPlatform","require","_react","_dompurify","_interopRequireDefault","_jsxRuntime","e","__esModule","default","HeaderWidget","headerData","setHeaderData","useState","isOpen","setIsOpen","WIDTH","isMobile","setIsMobile","window","innerWidth","isLoading","setIsLoading","config","getConfig","useEffect","handleResize","addEventListener","removeEventListener","fetchData","DISCOVERY_URL","console","error","response","fetch","credentials","ok","Error","status","jsonData","json","cleanHtml","DOMPurify","sanitize","primary","ADD_ATTR","toggleMenu","jsxs","className","children","jsx","type","onClick","style","background","border","cursor","fontSize","href","width","height","src","LOGO_URL","alt","decoding","dangerouslySetInnerHTML","__html","_default","exports"],"sources":["../../src/HeaderWidget/index.jsx"],"sourcesContent":["import { getConfig } from \"@edx/frontend-platform\";\nimport { useEffect, useState } from \"react\";\nimport DOMPurify from \"dompurify\";\nimport \"./main.scss\";\n\nconst HeaderWidget = () => {\n const [headerData, setHeaderData] = useState(\"\");\n const [isOpen, setIsOpen] = useState(false);\n const WIDTH = 1230;\n const [isMobile, setIsMobile] = useState(window.innerWidth < WIDTH);\n const [isLoading, setIsLoading] = useState(true);\n const config = getConfig();\n\n useEffect(() => {\n const handleResize = () => {\n setIsMobile(window.innerWidth < WIDTH);\n if (window.innerWidth >= WIDTH) {\n setIsOpen(false);\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n useEffect(() => {\n const fetchData = async () => {\n if (!config?.DISCOVERY_URL) {\n console.error(\"No url found for discovery\", config);\n return;\n }\n try {\n const response = await fetch(\n `${config.DISCOVERY_URL}/wp-json/edly-wp-routes/nav-menu`,\n { credentials: \"include\" }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const jsonData = await response.json();\n\n if (typeof jsonData === \"object\") {\n const cleanHtml = DOMPurify.sanitize(jsonData.primary, {\n ADD_ATTR: [\"target\", \"class\"],\n });\n setHeaderData(cleanHtml);\n } else {\n console.error(\"Data object is not json\");\n }\n } catch (error) {\n console.error(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchData();\n }, []);\n\n const toggleMenu = () => {\n setIsOpen(!isOpen);\n };\n\n return (\n <div className={`shadow-lg ${isMobile ? \"header-frame\" : \"\"}`}>\n {isMobile && (\n <button\n className=\"menuOpner\"\n type=\"button\"\n onClick={toggleMenu}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"24px\",\n }}\n >\n {isOpen ? \"✖\" : \"☰\"}\n </button>\n )}\n <div\n className={`header-holder ${isMobile ? \"mobile-menu\" : \"\"} ${\n isOpen ? \"\" : \"mobile-hide\"\n }`}\n >\n <a href=\"/\" className=\"custom-logo-link\">\n <img\n width=\"216\"\n height=\"140\"\n src={config.LOGO_URL}\n className=\"custom-logo\"\n alt=\"Venus\"\n decoding=\"async\"\n />\n </a>\n <header\n className=\"site-header\"\n dangerouslySetInnerHTML={{ __html: headerData }}\n />\n </div>\n </div>\n );\n};\n\nexport default HeaderWidget;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_frontendPlatform","require","_react","_dompurify","_interopRequireDefault","_reactHelmet","_jsxRuntime","e","__esModule","default","HeaderWidget","headerData","setHeaderData","useState","isOpen","setIsOpen","WIDTH","isMobile","setIsMobile","window","innerWidth","isLoading","setIsLoading","config","getConfig","useEffect","console","log","COLORS","document","documentElement","style","setProperty","primary","handleResize","addEventListener","removeEventListener","fetchData","MARKETING_SITE_BASE_URL","error","response","fetch","credentials","ok","Error","status","jsonData","json","cleanHtml","DOMPurify","sanitize","ADD_ATTR","toggleMenu","jsxs","Fragment","children","jsx","Helmet","rel","href","crossOrigin","className","type","onClick","background","border","cursor","fontSize","width","height","src","LOGO_URL","alt","decoding","dangerouslySetInnerHTML","__html","_default","exports"],"sources":["../../src/HeaderWidget/index.jsx"],"sourcesContent":["import { getConfig } from \"@edx/frontend-platform\";\nimport { useEffect, useState } from \"react\";\nimport DOMPurify from \"dompurify\";\nimport { Helmet } from \"react-helmet\";\nimport \"./main.scss\";\n\nconst HeaderWidget = () => {\n const [headerData, setHeaderData] = useState(\"\");\n const [isOpen, setIsOpen] = useState(false);\n const WIDTH = 1230;\n const [isMobile, setIsMobile] = useState(window.innerWidth < WIDTH);\n const [isLoading, setIsLoading] = useState(true);\n const config = getConfig();\n\n // useEffect(() => {\n // if (isLoading) {\n // document.body.classList.add(\"loader\");\n // }\n // return () => {\n // document.body.classList.remove(\"loader\");\n // };\n // }, [isLoading]);\n\n useEffect(() => {\n console.log(\"color: \", config.COLORS);\n document.documentElement.style.setProperty(\n \"--primary-color\",\n config?.COLORS?.primary || \"#de2025\"\n );\n\n const handleResize = () => {\n setIsMobile(window.innerWidth < WIDTH);\n if (window.innerWidth >= WIDTH) {\n setIsOpen(false);\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n useEffect(() => {\n const fetchData = async () => {\n if (!config?.MARKETING_SITE_BASE_URL) {\n console.error(\"No url found for discovery\", config);\n return;\n }\n try {\n const response = await fetch(\n `${config.MARKETING_SITE_BASE_URL}/wp-json/edly-wp-routes/nav-menu`,\n // \"https://venus.discover.multitenantsdev.edly.io/wp-json/edly-wp-routes/nav-menu\",\n { credentials: \"include\" }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const jsonData = await response.json();\n\n if (typeof jsonData === \"object\") {\n const cleanHtml = DOMPurify.sanitize(jsonData.primary, {\n ADD_ATTR: [\"target\", \"class\"],\n });\n setHeaderData(cleanHtml);\n } else {\n console.error(\"Data object is not json\");\n }\n } catch (error) {\n console.error(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchData();\n }, []);\n\n const toggleMenu = () => {\n setIsOpen(!isOpen);\n };\n\n return (\n <>\n <Helmet>\n <link\n rel=\"stylesheet\"\n href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css\"\n crossOrigin=\"anonymous\"\n />\n </Helmet>\n <div className={`shadow-lg ${isMobile ? \"header-frame\" : \"\"}`}>\n {isMobile && (\n <button\n className=\"menuOpner\"\n type=\"button\"\n onClick={toggleMenu}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"24px\",\n }}\n >\n {isOpen ? \"✖\" : \"☰\"}\n </button>\n )}\n <div\n className={`header-holder ${isMobile ? \"mobile-menu\" : \"\"} ${\n isOpen ? \"\" : \"mobile-hide\"\n }`}\n >\n <a href=\"/\" className=\"custom-logo-link\">\n <img\n width=\"216\"\n height=\"140\"\n src={config.LOGO_URL}\n className=\"custom-logo\"\n alt=\"Venus\"\n decoding=\"async\"\n />\n </a>\n <header\n className=\"site-header\"\n dangerouslySetInnerHTML={{ __html: headerData }}\n />\n </div>\n </div>\n </>\n );\n};\n\nexport default HeaderWidget;\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,11 @@
1
1
  @use "sass:color";
2
- $primary-color: #de2025;
2
+ $primary-color: var(--primary-color);
3
3
  $text-color: #0d1321;
4
4
  $background-color: #ffffff;
5
5
  $submenu-bg: #ffffff;
6
6
  $submenu-border: #d1d5db;
7
7
  $submenu-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
8
- $hover-bg: color.adjust($primary-color, $lightness: 45%);
8
+ $hover-bg: color-mix(in srgb, var(--primary-color) 5%, white 94%);
9
9
  $transition-speed: 0.25s;
10
10
  $font-family: "Inter", sans-serif;
11
11
  $mobile-breakpoint: 1230px;
@@ -19,6 +19,45 @@ $icon-size: 0.95em;
19
19
  flex-direction: row;
20
20
  }
21
21
 
22
+ // .loader {
23
+ // width: 60px;
24
+ // aspect-ratio: 2;
25
+ // --_g: no-repeat radial-gradient(circle closest-side, #000 90%, #0000);
26
+ // background:
27
+ // var(--_g) 0% 50%,
28
+ // var(--_g) 50% 50%,
29
+ // var(--_g) 100% 50%;
30
+ // background-size: calc(100% / 3) 50%;
31
+ // animation: l3 1s infinite linear;
32
+ // }
33
+
34
+ // @keyframes l3 {
35
+ // 20% {
36
+ // background-position:
37
+ // 0% 0%,
38
+ // 50% 50%,
39
+ // 100% 50%;
40
+ // }
41
+ // 40% {
42
+ // background-position:
43
+ // 0% 100%,
44
+ // 50% 0%,
45
+ // 100% 50%;
46
+ // }
47
+ // 60% {
48
+ // background-position:
49
+ // 0% 50%,
50
+ // 50% 100%,
51
+ // 100% 0%;
52
+ // }
53
+ // 80% {
54
+ // background-position:
55
+ // 0% 50%,
56
+ // 50% 50%,
57
+ // 100% 100%;
58
+ // }
59
+ // }
60
+
22
61
  .site-header {
23
62
  width: 100%;
24
63
  flex: inherit !important;
@@ -70,6 +109,7 @@ li.menu-item-object-menu_openedx {
70
109
  }
71
110
 
72
111
  img {
112
+ width: 40px;
73
113
  border-radius: 100%;
74
114
  overflow: hidden;
75
115
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anas_hameed/edly-saas-widget",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Frontend application template",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
@@ -58,7 +58,8 @@
58
58
  },
59
59
  "dependencies": {
60
60
  "dompurify": "^3.3.0",
61
- "react-bootstrap": "^2.10.10"
61
+ "react-bootstrap": "^2.10.10",
62
+ "react-helmet": "^6.1.0"
62
63
  },
63
64
  "directories": {
64
65
  "doc": "docs"