@2uinc/frontend-enterprise-utils 10.0.0
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 +633 -0
- package/LICENSE +661 -0
- package/README.rst +15 -0
- package/analytics.js +30 -0
- package/analytics.js.map +1 -0
- package/constants.js +5 -0
- package/constants.js.map +1 -0
- package/hooks.js +52 -0
- package/hooks.js.map +1 -0
- package/index.js +8 -0
- package/index.js.map +1 -0
- package/learnerPortalLinks.js +180 -0
- package/learnerPortalLinks.js.map +1 -0
- package/package.json +60 -0
- package/roles.js +50 -0
- package/roles.js.map +1 -0
- package/test-utils.js +37 -0
- package/test-utils.js.map +1 -0
- package/utils.js +49 -0
- package/utils.js.map +1 -0
package/analytics.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
import { sendTrackEvent } from '@edx/frontend-platform/analytics';
|
|
8
|
+
export var sendEnterpriseTrackEvent = function sendEnterpriseTrackEvent(enterpriseUUID, eventName) {
|
|
9
|
+
var properties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
10
|
+
sendTrackEvent(eventName, _objectSpread({
|
|
11
|
+
enterpriseUUID: enterpriseUUID
|
|
12
|
+
}, properties));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// How long to delay an event, so that we allow enough time for any async analytics event call to resolve.
|
|
16
|
+
// https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/
|
|
17
|
+
export var TRACK_EVENT_DELAY_MS = 300; // 300ms replicates Segment's ``trackLink`` function
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Delay for a certain period to allow time for analytics event call to resolve.
|
|
21
|
+
*/
|
|
22
|
+
export var sendEnterpriseTrackEventWithDelay = function sendEnterpriseTrackEventWithDelay(enterpriseId, eventName) {
|
|
23
|
+
var properties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
24
|
+
var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : TRACK_EVENT_DELAY_MS;
|
|
25
|
+
sendEnterpriseTrackEvent(enterpriseId, eventName, properties);
|
|
26
|
+
return new Promise(function (resolve) {
|
|
27
|
+
setTimeout(resolve, delay);
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=analytics.js.map
|
package/analytics.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","names":["sendTrackEvent","sendEnterpriseTrackEvent","enterpriseUUID","eventName","properties","arguments","length","undefined","_objectSpread","TRACK_EVENT_DELAY_MS","sendEnterpriseTrackEventWithDelay","enterpriseId","delay","Promise","resolve","setTimeout"],"sources":["../src/analytics.js"],"sourcesContent":["import { sendTrackEvent } from '@edx/frontend-platform/analytics';\n\nexport const sendEnterpriseTrackEvent = (enterpriseUUID, eventName, properties = {}) => {\n sendTrackEvent(\n eventName,\n {\n enterpriseUUID,\n ...properties,\n },\n );\n};\n\n// How long to delay an event, so that we allow enough time for any async analytics event call to resolve.\n// https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/\nexport const TRACK_EVENT_DELAY_MS = 300; // 300ms replicates Segment's ``trackLink`` function\n\n/**\n * Delay for a certain period to allow time for analytics event call to resolve.\n */\nexport const sendEnterpriseTrackEventWithDelay = (\n enterpriseId,\n eventName,\n properties = {},\n delay = TRACK_EVENT_DELAY_MS,\n) => {\n sendEnterpriseTrackEvent(\n enterpriseId,\n eventName,\n properties,\n );\n return new Promise((resolve) => { setTimeout(resolve, delay); });\n};\n"],"mappings":";;;;;;AAAA,SAASA,cAAc,QAAQ,kCAAkC;AAEjE,OAAO,IAAMC,wBAAwB,GAAG,SAA3BA,wBAAwBA,CAAIC,cAAc,EAAEC,SAAS,EAAsB;EAAA,IAApBC,UAAU,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EACjFL,cAAc,CACZG,SAAS,EAAAK,aAAA;IAEPN,cAAc,EAAdA;EAAc,GACXE,UAAU,CAEjB,CAAC;AACH,CAAC;;AAED;AACA;AACA,OAAO,IAAMK,oBAAoB,GAAG,GAAG,CAAC,CAAC;;AAEzC;AACA;AACA;AACA,OAAO,IAAMC,iCAAiC,GAAG,SAApCA,iCAAiCA,CAC5CC,YAAY,EACZR,SAAS,EAGN;EAAA,IAFHC,UAAU,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAAA,IACfO,KAAK,GAAAP,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGI,oBAAoB;EAE5BR,wBAAwB,CACtBU,YAAY,EACZR,SAAS,EACTC,UACF,CAAC;EACD,OAAO,IAAIS,OAAO,CAAC,UAACC,OAAO,EAAK;IAAEC,UAAU,CAACD,OAAO,EAAEF,KAAK,CAAC;EAAE,CAAC,CAAC;AAClE,CAAC","ignoreList":[]}
|
package/constants.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export var ENTERPRISE_ADMIN = 'enterprise_admin';
|
|
2
|
+
export var ENTERPRISE_CATALOG_ADMIN = 'enterprise_catalog_admin';
|
|
3
|
+
export var ENTERPRISE_LEARNER = 'enterprise_learner';
|
|
4
|
+
export var ENTERPRISE_OPENEDX_OPERATOR = 'enterprise_openedx_operator';
|
|
5
|
+
//# sourceMappingURL=constants.js.map
|
package/constants.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","names":["ENTERPRISE_ADMIN","ENTERPRISE_CATALOG_ADMIN","ENTERPRISE_LEARNER","ENTERPRISE_OPENEDX_OPERATOR"],"sources":["../src/constants.js"],"sourcesContent":["export const ENTERPRISE_ADMIN = 'enterprise_admin';\nexport const ENTERPRISE_CATALOG_ADMIN = 'enterprise_catalog_admin';\nexport const ENTERPRISE_LEARNER = 'enterprise_learner';\nexport const ENTERPRISE_OPENEDX_OPERATOR = 'enterprise_openedx_operator';\n"],"mappings":"AAAA,OAAO,IAAMA,gBAAgB,GAAG,kBAAkB;AAClD,OAAO,IAAMC,wBAAwB,GAAG,0BAA0B;AAClE,OAAO,IAAMC,kBAAkB,GAAG,oBAAoB;AACtD,OAAO,IAAMC,2BAA2B,GAAG,6BAA6B","ignoreList":[]}
|
package/hooks.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
7
|
+
import { useRef, useEffect, useState } from 'react';
|
|
8
|
+
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
|
|
9
|
+
import getLearnerPortalLinks from './learnerPortalLinks';
|
|
10
|
+
export var useIsFirstRender = function useIsFirstRender() {
|
|
11
|
+
var isMountRef = useRef(true);
|
|
12
|
+
useEffect(function () {
|
|
13
|
+
isMountRef.current = false;
|
|
14
|
+
}, []);
|
|
15
|
+
return isMountRef.current;
|
|
16
|
+
};
|
|
17
|
+
export function useEnterpriseConfig(authenticatedUser, learnerPortalHostname, lmsBaseUrl) {
|
|
18
|
+
var _useState = useState(),
|
|
19
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
20
|
+
enterpriseLearnerPortalLink = _useState2[0],
|
|
21
|
+
setEnterpriseLearnerPortalLink = _useState2[1];
|
|
22
|
+
var _useState3 = useState(),
|
|
23
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
24
|
+
enterpriseCustomerBrandingConfig = _useState4[0],
|
|
25
|
+
setEnterpriseCustomerBrandingConfig = _useState4[1];
|
|
26
|
+
useEffect(function () {
|
|
27
|
+
var httpClient = getAuthenticatedHttpClient();
|
|
28
|
+
getLearnerPortalLinks(httpClient, authenticatedUser, learnerPortalHostname, lmsBaseUrl).then(function (learnerPortalLinks) {
|
|
29
|
+
var preferredLearnerPortalLink = learnerPortalLinks.pop();
|
|
30
|
+
if (preferredLearnerPortalLink) {
|
|
31
|
+
var config = {
|
|
32
|
+
logoAltText: preferredLearnerPortalLink.title,
|
|
33
|
+
logoDestination: preferredLearnerPortalLink.url
|
|
34
|
+
};
|
|
35
|
+
if (preferredLearnerPortalLink.branding_configuration) {
|
|
36
|
+
config.logo = preferredLearnerPortalLink.branding_configuration.logo;
|
|
37
|
+
}
|
|
38
|
+
setEnterpriseCustomerBrandingConfig(config);
|
|
39
|
+
setEnterpriseLearnerPortalLink({
|
|
40
|
+
type: 'item',
|
|
41
|
+
href: preferredLearnerPortalLink.url,
|
|
42
|
+
content: 'Dashboard'
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}, [authenticatedUser, learnerPortalHostname, lmsBaseUrl]);
|
|
47
|
+
return {
|
|
48
|
+
enterpriseLearnerPortalLink: enterpriseLearnerPortalLink,
|
|
49
|
+
enterpriseCustomerBrandingConfig: enterpriseCustomerBrandingConfig
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=hooks.js.map
|
package/hooks.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","names":["useRef","useEffect","useState","getAuthenticatedHttpClient","getLearnerPortalLinks","useIsFirstRender","isMountRef","current","useEnterpriseConfig","authenticatedUser","learnerPortalHostname","lmsBaseUrl","_useState","_useState2","_slicedToArray","enterpriseLearnerPortalLink","setEnterpriseLearnerPortalLink","_useState3","_useState4","enterpriseCustomerBrandingConfig","setEnterpriseCustomerBrandingConfig","httpClient","then","learnerPortalLinks","preferredLearnerPortalLink","pop","config","logoAltText","title","logoDestination","url","branding_configuration","logo","type","href","content"],"sources":["../src/hooks.js"],"sourcesContent":["import { useRef, useEffect, useState } from 'react';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport getLearnerPortalLinks from './learnerPortalLinks';\n\nexport const useIsFirstRender = () => {\n const isMountRef = useRef(true);\n useEffect(() => {\n isMountRef.current = false;\n }, []);\n return isMountRef.current;\n};\n\nexport function useEnterpriseConfig(\n authenticatedUser,\n learnerPortalHostname,\n lmsBaseUrl,\n) {\n const [\n enterpriseLearnerPortalLink,\n setEnterpriseLearnerPortalLink,\n ] = useState();\n const [\n enterpriseCustomerBrandingConfig,\n setEnterpriseCustomerBrandingConfig,\n ] = useState();\n\n useEffect(() => {\n const httpClient = getAuthenticatedHttpClient();\n getLearnerPortalLinks(\n httpClient,\n authenticatedUser,\n learnerPortalHostname,\n lmsBaseUrl,\n ).then((learnerPortalLinks) => {\n const preferredLearnerPortalLink = learnerPortalLinks.pop();\n if (preferredLearnerPortalLink) {\n const config = {\n logoAltText: preferredLearnerPortalLink.title,\n logoDestination: preferredLearnerPortalLink.url,\n };\n if (preferredLearnerPortalLink.branding_configuration) {\n config.logo = preferredLearnerPortalLink.branding_configuration.logo;\n }\n setEnterpriseCustomerBrandingConfig(config);\n\n setEnterpriseLearnerPortalLink({\n type: 'item',\n href: preferredLearnerPortalLink.url,\n content: 'Dashboard',\n });\n }\n });\n }, [authenticatedUser, learnerPortalHostname, lmsBaseUrl]);\n\n return {\n enterpriseLearnerPortalLink,\n enterpriseCustomerBrandingConfig,\n };\n}\n"],"mappings":";;;;;;AAAA,SAASA,MAAM,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AACnD,SAASC,0BAA0B,QAAQ,6BAA6B;AAExE,OAAOC,qBAAqB,MAAM,sBAAsB;AAExD,OAAO,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAA,EAAS;EACpC,IAAMC,UAAU,GAAGN,MAAM,CAAC,IAAI,CAAC;EAC/BC,SAAS,CAAC,YAAM;IACdK,UAAU,CAACC,OAAO,GAAG,KAAK;EAC5B,CAAC,EAAE,EAAE,CAAC;EACN,OAAOD,UAAU,CAACC,OAAO;AAC3B,CAAC;AAED,OAAO,SAASC,mBAAmBA,CACjCC,iBAAiB,EACjBC,qBAAqB,EACrBC,UAAU,EACV;EACA,IAAAC,SAAA,GAGIV,QAAQ,CAAC,CAAC;IAAAW,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAFZG,2BAA2B,GAAAF,UAAA;IAC3BG,8BAA8B,GAAAH,UAAA;EAEhC,IAAAI,UAAA,GAGIf,QAAQ,CAAC,CAAC;IAAAgB,UAAA,GAAAJ,cAAA,CAAAG,UAAA;IAFZE,gCAAgC,GAAAD,UAAA;IAChCE,mCAAmC,GAAAF,UAAA;EAGrCjB,SAAS,CAAC,YAAM;IACd,IAAMoB,UAAU,GAAGlB,0BAA0B,CAAC,CAAC;IAC/CC,qBAAqB,CACnBiB,UAAU,EACVZ,iBAAiB,EACjBC,qBAAqB,EACrBC,UACF,CAAC,CAACW,IAAI,CAAC,UAACC,kBAAkB,EAAK;MAC7B,IAAMC,0BAA0B,GAAGD,kBAAkB,CAACE,GAAG,CAAC,CAAC;MAC3D,IAAID,0BAA0B,EAAE;QAC9B,IAAME,MAAM,GAAG;UACbC,WAAW,EAAEH,0BAA0B,CAACI,KAAK;UAC7CC,eAAe,EAAEL,0BAA0B,CAACM;QAC9C,CAAC;QACD,IAAIN,0BAA0B,CAACO,sBAAsB,EAAE;UACrDL,MAAM,CAACM,IAAI,GAAGR,0BAA0B,CAACO,sBAAsB,CAACC,IAAI;QACtE;QACAZ,mCAAmC,CAACM,MAAM,CAAC;QAE3CV,8BAA8B,CAAC;UAC7BiB,IAAI,EAAE,MAAM;UACZC,IAAI,EAAEV,0BAA0B,CAACM,GAAG;UACpCK,OAAO,EAAE;QACX,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC1B,iBAAiB,EAAEC,qBAAqB,EAAEC,UAAU,CAAC,CAAC;EAE1D,OAAO;IACLI,2BAA2B,EAA3BA,2BAA2B;IAC3BI,gCAAgC,EAAhCA;EACF,CAAC;AACH","ignoreList":[]}
|
package/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ENTERPRISE_ADMIN, ENTERPRISE_CATALOG_ADMIN, ENTERPRISE_LEARNER, ENTERPRISE_OPENEDX_OPERATOR } from './constants';
|
|
2
|
+
export { isEnterpriseUser } from './roles';
|
|
3
|
+
export { useEnterpriseConfig, useIsFirstRender } from './hooks';
|
|
4
|
+
export { getSelectedEnterpriseUUID, isNull, hasFeatureFlagEnabled } from './utils';
|
|
5
|
+
export { renderWithRouter } from './test-utils';
|
|
6
|
+
export { sendEnterpriseTrackEvent, sendEnterpriseTrackEventWithDelay, TRACK_EVENT_DELAY_MS } from './analytics';
|
|
7
|
+
export { default as getLearnerPortalLinks } from './learnerPortalLinks';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["ENTERPRISE_ADMIN","ENTERPRISE_CATALOG_ADMIN","ENTERPRISE_LEARNER","ENTERPRISE_OPENEDX_OPERATOR","isEnterpriseUser","useEnterpriseConfig","useIsFirstRender","getSelectedEnterpriseUUID","isNull","hasFeatureFlagEnabled","renderWithRouter","sendEnterpriseTrackEvent","sendEnterpriseTrackEventWithDelay","TRACK_EVENT_DELAY_MS","default","getLearnerPortalLinks"],"sources":["../src/index.js"],"sourcesContent":["export {\n ENTERPRISE_ADMIN,\n ENTERPRISE_CATALOG_ADMIN,\n ENTERPRISE_LEARNER,\n ENTERPRISE_OPENEDX_OPERATOR,\n} from './constants';\n\nexport { isEnterpriseUser } from './roles';\n\nexport {\n useEnterpriseConfig,\n useIsFirstRender,\n} from './hooks';\nexport {\n getSelectedEnterpriseUUID,\n isNull,\n hasFeatureFlagEnabled,\n} from './utils';\nexport { renderWithRouter } from './test-utils';\nexport { sendEnterpriseTrackEvent, sendEnterpriseTrackEventWithDelay, TRACK_EVENT_DELAY_MS } from './analytics';\n\nexport { default as getLearnerPortalLinks } from './learnerPortalLinks';\n"],"mappings":"AAAA,SACEA,gBAAgB,EAChBC,wBAAwB,EACxBC,kBAAkB,EAClBC,2BAA2B,QACtB,aAAa;AAEpB,SAASC,gBAAgB,QAAQ,SAAS;AAE1C,SACEC,mBAAmB,EACnBC,gBAAgB,QACX,SAAS;AAChB,SACEC,yBAAyB,EACzBC,MAAM,EACNC,qBAAqB,QAChB,SAAS;AAChB,SAASC,gBAAgB,QAAQ,cAAc;AAC/C,SAASC,wBAAwB,EAAEC,iCAAiC,EAAEC,oBAAoB,QAAQ,aAAa;AAE/G,SAASC,OAAO,IAAIC,qBAAqB,QAAQ,sBAAsB","ignoreList":[]}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
3
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
4
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
5
|
+
import { getSelectedEnterpriseUUID } from './utils';
|
|
6
|
+
import { isEnterpriseUser } from './roles';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Fetches the metadata for the authenticated user's linked enterprise customers.
|
|
10
|
+
*
|
|
11
|
+
* @param {object} apiClient http client to use to make an API request (e.g., axios)
|
|
12
|
+
* @param {string} [lmsBaseUrl] The base URL for the LMS
|
|
13
|
+
* @param {string} [preferredEnterpriseUUID] Filters to only return data about this specific Enterprise.
|
|
14
|
+
* @returns {promise} A promise that, when resolved, provides an API response from the `enterprise-customer`
|
|
15
|
+
* API endpoint.
|
|
16
|
+
*/
|
|
17
|
+
export var fetchEnterpriseCustomers = function fetchEnterpriseCustomers(apiClient) {
|
|
18
|
+
var lmsBaseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : process.env.LMS_BASE_URL;
|
|
19
|
+
var preferredEnterpriseUUID = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
20
|
+
var url = "".concat(lmsBaseUrl, "/enterprise/api/v1/enterprise-customer/");
|
|
21
|
+
if (preferredEnterpriseUUID !== null) {
|
|
22
|
+
var queryParams = new URLSearchParams();
|
|
23
|
+
queryParams.append('uuid', preferredEnterpriseUUID);
|
|
24
|
+
url += "?".concat(queryParams.toString());
|
|
25
|
+
}
|
|
26
|
+
return apiClient.get(url);
|
|
27
|
+
};
|
|
28
|
+
function getCacheKey(userId) {
|
|
29
|
+
return "learnerPortalLinks:".concat(userId);
|
|
30
|
+
}
|
|
31
|
+
function cacheLinks(userId, links) {
|
|
32
|
+
sessionStorage.setItem(getCacheKey(userId), JSON.stringify({
|
|
33
|
+
// Set one hour expiration
|
|
34
|
+
expiration: Date.now() + 1 * 60 * 60 * 1000,
|
|
35
|
+
links: links
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
function fetchLearnerPortalLinks(_x, _x2, _x3) {
|
|
39
|
+
return _fetchLearnerPortalLinks.apply(this, arguments);
|
|
40
|
+
}
|
|
41
|
+
function _fetchLearnerPortalLinks() {
|
|
42
|
+
_fetchLearnerPortalLinks = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(apiClient, userId, preferredEnterpriseUUID) {
|
|
43
|
+
var learnerPortalHostname,
|
|
44
|
+
lmsBaseUrl,
|
|
45
|
+
learnerPortalLinks,
|
|
46
|
+
response,
|
|
47
|
+
enterpriseCustomers,
|
|
48
|
+
i,
|
|
49
|
+
enterpriseCustomer,
|
|
50
|
+
enterpriseCustomerSlug,
|
|
51
|
+
enableLearnerPortal,
|
|
52
|
+
brandingConfiguration,
|
|
53
|
+
_args = arguments;
|
|
54
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
55
|
+
while (1) switch (_context.prev = _context.next) {
|
|
56
|
+
case 0:
|
|
57
|
+
learnerPortalHostname = _args.length > 3 && _args[3] !== undefined ? _args[3] : process.env.ENTERPRISE_LEARNER_PORTAL_HOSTNAME;
|
|
58
|
+
lmsBaseUrl = _args.length > 4 && _args[4] !== undefined ? _args[4] : process.env.LMS_BASE_URL;
|
|
59
|
+
learnerPortalLinks = [];
|
|
60
|
+
if (learnerPortalHostname) {
|
|
61
|
+
_context.next = 5;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
return _context.abrupt("return", learnerPortalLinks);
|
|
65
|
+
case 5:
|
|
66
|
+
_context.next = 7;
|
|
67
|
+
return fetchEnterpriseCustomers(apiClient, lmsBaseUrl, preferredEnterpriseUUID);
|
|
68
|
+
case 7:
|
|
69
|
+
response = _context.sent;
|
|
70
|
+
enterpriseCustomers = response.data.results;
|
|
71
|
+
try {
|
|
72
|
+
for (i = 0; i < enterpriseCustomers.length; i += 1) {
|
|
73
|
+
enterpriseCustomer = enterpriseCustomers[i];
|
|
74
|
+
enterpriseCustomerSlug = enterpriseCustomer.slug;
|
|
75
|
+
enableLearnerPortal = enterpriseCustomer.enable_learner_portal;
|
|
76
|
+
brandingConfiguration = enterpriseCustomer.branding_configuration;
|
|
77
|
+
if (enableLearnerPortal && enterpriseCustomerSlug) {
|
|
78
|
+
learnerPortalLinks.push({
|
|
79
|
+
// branding_configuration is not always returned as part
|
|
80
|
+
// of the response, so check if it exists before referencing fields.
|
|
81
|
+
branding_configuration: brandingConfiguration ? {
|
|
82
|
+
logo: brandingConfiguration.logo || null,
|
|
83
|
+
primary_color: brandingConfiguration.primary_color || null,
|
|
84
|
+
secondary_color: brandingConfiguration.secondary_color || null,
|
|
85
|
+
tertiary_color: brandingConfiguration.tertiary_color || null
|
|
86
|
+
} : null,
|
|
87
|
+
title: enterpriseCustomer.name,
|
|
88
|
+
url: "".concat(window.location.protocol, "//").concat(learnerPortalHostname, "/").concat(enterpriseCustomerSlug),
|
|
89
|
+
uuid: enterpriseCustomer.uuid
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
cacheLinks(userId, learnerPortalLinks);
|
|
94
|
+
} catch (error) {
|
|
95
|
+
// empty
|
|
96
|
+
}
|
|
97
|
+
return _context.abrupt("return", learnerPortalLinks);
|
|
98
|
+
case 11:
|
|
99
|
+
case "end":
|
|
100
|
+
return _context.stop();
|
|
101
|
+
}
|
|
102
|
+
}, _callee);
|
|
103
|
+
}));
|
|
104
|
+
return _fetchLearnerPortalLinks.apply(this, arguments);
|
|
105
|
+
}
|
|
106
|
+
function getCachedLearnerPortalLinks(userId) {
|
|
107
|
+
var cacheKey = getCacheKey(userId);
|
|
108
|
+
var cachedItem = sessionStorage.getItem(cacheKey);
|
|
109
|
+
if (cachedItem) {
|
|
110
|
+
var cachedLinks = JSON.parse(cachedItem);
|
|
111
|
+
// Check cache expiration
|
|
112
|
+
if (cachedLinks.expiration <= Date.now()) {
|
|
113
|
+
sessionStorage.removeItem(cacheKey);
|
|
114
|
+
} else {
|
|
115
|
+
return cachedLinks.links;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Fetches the learner portal links available to an enterprise user.
|
|
123
|
+
*
|
|
124
|
+
* @param {object} apiClient http client to use to make an API request (e.g., axios)
|
|
125
|
+
* @param {object} authenticatedUser An authenticated user object
|
|
126
|
+
* @param {string} [learnerPortalHostname] Hostname for enterprise learner portal
|
|
127
|
+
* @param {string} [lmsBaseUrl] The base URL for the LMS
|
|
128
|
+
* @returns Array of objects with metadata about the learner portal URLs associated with the
|
|
129
|
+
* enterprise customers for which the user is linked.
|
|
130
|
+
*/
|
|
131
|
+
export default function getLearnerPortalLinks(_x4, _x5) {
|
|
132
|
+
return _getLearnerPortalLinks.apply(this, arguments);
|
|
133
|
+
}
|
|
134
|
+
function _getLearnerPortalLinks() {
|
|
135
|
+
_getLearnerPortalLinks = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(apiClient, authenticatedUser) {
|
|
136
|
+
var learnerPortalHostname,
|
|
137
|
+
lmsBaseUrl,
|
|
138
|
+
learnerPortalLinks,
|
|
139
|
+
userId,
|
|
140
|
+
cachedLinks,
|
|
141
|
+
preferredEnterpriseUUID,
|
|
142
|
+
links,
|
|
143
|
+
_args2 = arguments;
|
|
144
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
145
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
146
|
+
case 0:
|
|
147
|
+
learnerPortalHostname = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : process.env.ENTERPRISE_LEARNER_PORTAL_HOSTNAME;
|
|
148
|
+
lmsBaseUrl = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : process.env.LMS_BASE_URL;
|
|
149
|
+
learnerPortalLinks = [];
|
|
150
|
+
if (!(authenticatedUser !== null && isEnterpriseUser(authenticatedUser))) {
|
|
151
|
+
_context2.next = 15;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
userId = authenticatedUser.userId;
|
|
155
|
+
cachedLinks = getCachedLearnerPortalLinks(userId);
|
|
156
|
+
if (!cachedLinks) {
|
|
157
|
+
_context2.next = 10;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
learnerPortalLinks = learnerPortalLinks.concat(cachedLinks);
|
|
161
|
+
_context2.next = 15;
|
|
162
|
+
break;
|
|
163
|
+
case 10:
|
|
164
|
+
preferredEnterpriseUUID = getSelectedEnterpriseUUID(authenticatedUser);
|
|
165
|
+
_context2.next = 13;
|
|
166
|
+
return fetchLearnerPortalLinks(apiClient, userId, preferredEnterpriseUUID, learnerPortalHostname, lmsBaseUrl);
|
|
167
|
+
case 13:
|
|
168
|
+
links = _context2.sent;
|
|
169
|
+
learnerPortalLinks = learnerPortalLinks.concat(links);
|
|
170
|
+
case 15:
|
|
171
|
+
return _context2.abrupt("return", learnerPortalLinks);
|
|
172
|
+
case 16:
|
|
173
|
+
case "end":
|
|
174
|
+
return _context2.stop();
|
|
175
|
+
}
|
|
176
|
+
}, _callee2);
|
|
177
|
+
}));
|
|
178
|
+
return _getLearnerPortalLinks.apply(this, arguments);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=learnerPortalLinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learnerPortalLinks.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","_asyncToGenerator","arguments","apply","_next","_throw","getSelectedEnterpriseUUID","isEnterpriseUser","fetchEnterpriseCustomers","apiClient","lmsBaseUrl","undefined","process","env","LMS_BASE_URL","preferredEnterpriseUUID","url","concat","queryParams","URLSearchParams","append","toString","get","getCacheKey","userId","cacheLinks","links","sessionStorage","setItem","JSON","stringify","expiration","Date","now","fetchLearnerPortalLinks","_x","_x2","_x3","_fetchLearnerPortalLinks","_callee","learnerPortalHostname","learnerPortalLinks","response","enterpriseCustomers","enterpriseCustomer","enterpriseCustomerSlug","enableLearnerPortal","brandingConfiguration","_args","_callee$","_context","ENTERPRISE_LEARNER_PORTAL_HOSTNAME","data","results","slug","enable_learner_portal","branding_configuration","logo","primary_color","secondary_color","tertiary_color","title","window","location","protocol","uuid","error","getCachedLearnerPortalLinks","cacheKey","cachedItem","getItem","cachedLinks","parse","removeItem","getLearnerPortalLinks","_x4","_x5","_getLearnerPortalLinks","_callee2","authenticatedUser","_args2","_callee2$","_context2"],"sources":["../src/learnerPortalLinks.js"],"sourcesContent":["import { getSelectedEnterpriseUUID } from './utils';\nimport { isEnterpriseUser } from './roles';\n\n/**\n * Fetches the metadata for the authenticated user's linked enterprise customers.\n *\n * @param {object} apiClient http client to use to make an API request (e.g., axios)\n * @param {string} [lmsBaseUrl] The base URL for the LMS\n * @param {string} [preferredEnterpriseUUID] Filters to only return data about this specific Enterprise.\n * @returns {promise} A promise that, when resolved, provides an API response from the `enterprise-customer`\n * API endpoint.\n */\nexport const fetchEnterpriseCustomers = (\n apiClient,\n lmsBaseUrl = process.env.LMS_BASE_URL,\n preferredEnterpriseUUID = null,\n) => {\n let url = `${lmsBaseUrl}/enterprise/api/v1/enterprise-customer/`;\n if (preferredEnterpriseUUID !== null) {\n const queryParams = new URLSearchParams();\n queryParams.append('uuid', preferredEnterpriseUUID);\n url += `?${queryParams.toString()}`;\n }\n return apiClient.get(url);\n};\n\nfunction getCacheKey(userId) {\n return `learnerPortalLinks:${userId}`;\n}\n\nfunction cacheLinks(userId, links) {\n sessionStorage.setItem(\n getCacheKey(userId),\n JSON.stringify({\n // Set one hour expiration\n expiration: Date.now() + (1 * 60 * 60 * 1000),\n links,\n }),\n );\n}\n\nasync function fetchLearnerPortalLinks(\n apiClient,\n userId,\n preferredEnterpriseUUID,\n learnerPortalHostname = process.env.ENTERPRISE_LEARNER_PORTAL_HOSTNAME,\n lmsBaseUrl = process.env.LMS_BASE_URL,\n) {\n const learnerPortalLinks = [];\n if (!learnerPortalHostname) {\n return learnerPortalLinks;\n }\n const response = await fetchEnterpriseCustomers(apiClient, lmsBaseUrl, preferredEnterpriseUUID);\n const enterpriseCustomers = response.data.results;\n try {\n for (let i = 0; i < enterpriseCustomers.length; i += 1) {\n const enterpriseCustomer = enterpriseCustomers[i];\n const enterpriseCustomerSlug = enterpriseCustomer.slug;\n const enableLearnerPortal = enterpriseCustomer.enable_learner_portal;\n const brandingConfiguration = enterpriseCustomer.branding_configuration;\n if (enableLearnerPortal && enterpriseCustomerSlug) {\n learnerPortalLinks.push({\n // branding_configuration is not always returned as part\n // of the response, so check if it exists before referencing fields.\n branding_configuration: brandingConfiguration ? {\n logo: brandingConfiguration.logo || null,\n primary_color: brandingConfiguration.primary_color || null,\n secondary_color: brandingConfiguration.secondary_color || null,\n tertiary_color: brandingConfiguration.tertiary_color || null,\n } : null,\n title: enterpriseCustomer.name,\n url: `${window.location.protocol}//${learnerPortalHostname}/${enterpriseCustomerSlug}`,\n uuid: enterpriseCustomer.uuid,\n });\n }\n }\n\n cacheLinks(userId, learnerPortalLinks);\n } catch (error) {\n // empty\n }\n\n return learnerPortalLinks;\n}\n\nfunction getCachedLearnerPortalLinks(userId) {\n const cacheKey = getCacheKey(userId);\n const cachedItem = sessionStorage.getItem(cacheKey);\n\n if (cachedItem) {\n const cachedLinks = JSON.parse(cachedItem);\n // Check cache expiration\n if (cachedLinks.expiration <= Date.now()) {\n sessionStorage.removeItem(cacheKey);\n } else {\n return cachedLinks.links;\n }\n }\n\n return null;\n}\n\n/**\n * Fetches the learner portal links available to an enterprise user.\n *\n * @param {object} apiClient http client to use to make an API request (e.g., axios)\n * @param {object} authenticatedUser An authenticated user object\n * @param {string} [learnerPortalHostname] Hostname for enterprise learner portal\n * @param {string} [lmsBaseUrl] The base URL for the LMS\n * @returns Array of objects with metadata about the learner portal URLs associated with the\n * enterprise customers for which the user is linked.\n */\nexport default async function getLearnerPortalLinks(\n apiClient,\n authenticatedUser,\n learnerPortalHostname = process.env.ENTERPRISE_LEARNER_PORTAL_HOSTNAME,\n lmsBaseUrl = process.env.LMS_BASE_URL,\n) {\n let learnerPortalLinks = [];\n\n if (authenticatedUser !== null && isEnterpriseUser(authenticatedUser)) {\n const { userId } = authenticatedUser;\n const cachedLinks = getCachedLearnerPortalLinks(userId);\n\n if (cachedLinks) {\n learnerPortalLinks = learnerPortalLinks.concat(cachedLinks);\n } else {\n const preferredEnterpriseUUID = getSelectedEnterpriseUUID(authenticatedUser);\n const links = await fetchLearnerPortalLinks(\n apiClient,\n userId,\n preferredEnterpriseUUID,\n learnerPortalHostname,\n lmsBaseUrl,\n );\n learnerPortalLinks = learnerPortalLinks.concat(links);\n }\n }\n\n return learnerPortalLinks;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@2uinc/frontend-enterprise-utils",
|
|
3
|
+
"version": "10.0.0",
|
|
4
|
+
"description": "Utils and other miscellaneous enterprise things.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/edx/frontend-enterprise.git"
|
|
8
|
+
},
|
|
9
|
+
"watch": {
|
|
10
|
+
"build": {
|
|
11
|
+
"patterns": [
|
|
12
|
+
"src"
|
|
13
|
+
],
|
|
14
|
+
"extensions": "js,jsx,ts,tsx"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"dev": "npx npm-watch build",
|
|
19
|
+
"clean": "make clean",
|
|
20
|
+
"build": "make build",
|
|
21
|
+
"i18n_extract": "BABEL_ENV=i18n fedx-scripts babel src --quiet > /dev/null",
|
|
22
|
+
"lint": "fedx-scripts eslint --ext .js --ext .jsx --ext .ts --ext .tsx .",
|
|
23
|
+
"lint:fix": "npm run lint -- --fix",
|
|
24
|
+
"snapshot": "npm run test -- --updateSnapshot",
|
|
25
|
+
"test": "fedx-scripts jest --coverage --passWithNoTests",
|
|
26
|
+
"test:watch": "npm run test -- --watch"
|
|
27
|
+
},
|
|
28
|
+
"author": "edX",
|
|
29
|
+
"license": "AGPL-3.0",
|
|
30
|
+
"homepage": "https://github.com/edx/frontend-enterprise#readme",
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public",
|
|
33
|
+
"directory": "dist"
|
|
34
|
+
},
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/edx/frontend-enterprise/issues"
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"history": "^4.10.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@edx/browserslist-config": "^1.5.0",
|
|
44
|
+
"@edx/frontend-platform": "^8.2.1",
|
|
45
|
+
"@openedx/frontend-build": "^14.3.1",
|
|
46
|
+
"@testing-library/dom": "^10.4.0",
|
|
47
|
+
"@testing-library/react": "^16.2.0",
|
|
48
|
+
"react": "^18.3.1",
|
|
49
|
+
"react-dom": "^18.3.1",
|
|
50
|
+
"react-router-dom": "^6.29.0",
|
|
51
|
+
"react-test-renderer": "^18.3.1"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"@edx/frontend-platform": "^7.0.0 || ^8.0.0",
|
|
55
|
+
"@testing-library/react": ">11.0.0 <17.0.0",
|
|
56
|
+
"react": "^16.12.0 || ^17.0.0 || ^18.0.0",
|
|
57
|
+
"react-dom": "^16.12.0 || ^17.0.0 || ^18.0.0",
|
|
58
|
+
"react-router-dom": "^6.0.0"
|
|
59
|
+
}
|
|
60
|
+
}
|
package/roles.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ENTERPRISE_ADMIN, ENTERPRISE_CATALOG_ADMIN, ENTERPRISE_LEARNER, ENTERPRISE_OPENEDX_OPERATOR } from './constants';
|
|
2
|
+
var ENTERPRISE_PERMISSIONS = [ENTERPRISE_ADMIN, ENTERPRISE_CATALOG_ADMIN, ENTERPRISE_LEARNER, ENTERPRISE_OPENEDX_OPERATOR];
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Determines whether a role is an enterprise role.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} role The name of a JWT role
|
|
8
|
+
* @returns {boolean} True if the specified role is an enterprise role, otherwise false
|
|
9
|
+
*/
|
|
10
|
+
export var isEnterpriseRole = function isEnterpriseRole(role) {
|
|
11
|
+
return ENTERPRISE_PERMISSIONS.some(function (permission) {
|
|
12
|
+
return role.includes(permission);
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Determines whether an authenticated user has a valid enterprise role, or the specified role.
|
|
18
|
+
*
|
|
19
|
+
* @param {object} user An authenticated user
|
|
20
|
+
* @param {string} [role] Checks specified role against the roles for the user
|
|
21
|
+
* @param {string} [enterpriseUUID] Checks specified role against the roles for the user for the specific enterprise
|
|
22
|
+
* @returns {boolean} true if the user has an enterprise role and/or the specified role and/or the specified role
|
|
23
|
+
* for the specific enterprise, otherwise false
|
|
24
|
+
*/
|
|
25
|
+
export var isEnterpriseUser = function isEnterpriseUser(user, role, enterpriseUUID) {
|
|
26
|
+
var extractRoleNameFromJwtRole = function extractRoleNameFromJwtRole(jwtRole) {
|
|
27
|
+
return jwtRole.split(':').shift();
|
|
28
|
+
};
|
|
29
|
+
var extractEnterpriseFromJwtRole = function extractEnterpriseFromJwtRole(jwtRole) {
|
|
30
|
+
return jwtRole.split(':')[1];
|
|
31
|
+
};
|
|
32
|
+
if (user !== null && user !== void 0 && user.roles) {
|
|
33
|
+
var roles = user.roles;
|
|
34
|
+
if (enterpriseUUID && role) {
|
|
35
|
+
return !!roles.find(function (userRole) {
|
|
36
|
+
return extractRoleNameFromJwtRole(userRole) === role && extractEnterpriseFromJwtRole(userRole) === enterpriseUUID;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (role) {
|
|
40
|
+
return !!roles.find(function (userRole) {
|
|
41
|
+
return extractRoleNameFromJwtRole(userRole) === role;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return roles.some(function (userRole) {
|
|
45
|
+
return isEnterpriseRole(extractRoleNameFromJwtRole(userRole));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=roles.js.map
|
package/roles.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.js","names":["ENTERPRISE_ADMIN","ENTERPRISE_CATALOG_ADMIN","ENTERPRISE_LEARNER","ENTERPRISE_OPENEDX_OPERATOR","ENTERPRISE_PERMISSIONS","isEnterpriseRole","role","some","permission","includes","isEnterpriseUser","user","enterpriseUUID","extractRoleNameFromJwtRole","jwtRole","split","shift","extractEnterpriseFromJwtRole","roles","find","userRole"],"sources":["../src/roles.js"],"sourcesContent":["import {\n ENTERPRISE_ADMIN,\n ENTERPRISE_CATALOG_ADMIN,\n ENTERPRISE_LEARNER,\n ENTERPRISE_OPENEDX_OPERATOR,\n} from './constants';\n\nconst ENTERPRISE_PERMISSIONS = [\n ENTERPRISE_ADMIN,\n ENTERPRISE_CATALOG_ADMIN,\n ENTERPRISE_LEARNER,\n ENTERPRISE_OPENEDX_OPERATOR,\n];\n\n/**\n * Determines whether a role is an enterprise role.\n *\n * @param {string} role The name of a JWT role\n * @returns {boolean} True if the specified role is an enterprise role, otherwise false\n */\nexport const isEnterpriseRole = role => ENTERPRISE_PERMISSIONS.some(permission => role.includes(permission));\n\n/**\n * Determines whether an authenticated user has a valid enterprise role, or the specified role.\n *\n * @param {object} user An authenticated user\n * @param {string} [role] Checks specified role against the roles for the user\n * @param {string} [enterpriseUUID] Checks specified role against the roles for the user for the specific enterprise\n * @returns {boolean} true if the user has an enterprise role and/or the specified role and/or the specified role\n * for the specific enterprise, otherwise false\n */\nexport const isEnterpriseUser = (user, role, enterpriseUUID) => {\n const extractRoleNameFromJwtRole = jwtRole => jwtRole.split(':').shift();\n const extractEnterpriseFromJwtRole = jwtRole => jwtRole.split(':')[1];\n\n if (user?.roles) {\n const { roles } = user;\n if (enterpriseUUID && role) {\n return !!roles.find(userRole => extractRoleNameFromJwtRole(userRole) === role\n && extractEnterpriseFromJwtRole(userRole) === enterpriseUUID);\n }\n if (role) {\n return !!roles.find(userRole => extractRoleNameFromJwtRole(userRole) === role);\n }\n return roles.some(userRole => isEnterpriseRole(extractRoleNameFromJwtRole(userRole)));\n }\n\n return false;\n};\n"],"mappings":"AAAA,SACEA,gBAAgB,EAChBC,wBAAwB,EACxBC,kBAAkB,EAClBC,2BAA2B,QACtB,aAAa;AAEpB,IAAMC,sBAAsB,GAAG,CAC7BJ,gBAAgB,EAChBC,wBAAwB,EACxBC,kBAAkB,EAClBC,2BAA2B,CAC5B;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAME,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAGC,IAAI;EAAA,OAAIF,sBAAsB,CAACG,IAAI,CAAC,UAAAC,UAAU;IAAA,OAAIF,IAAI,CAACG,QAAQ,CAACD,UAAU,CAAC;EAAA,EAAC;AAAA;;AAE5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAME,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIC,IAAI,EAAEL,IAAI,EAAEM,cAAc,EAAK;EAC9D,IAAMC,0BAA0B,GAAG,SAA7BA,0BAA0BA,CAAGC,OAAO;IAAA,OAAIA,OAAO,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC;EAAA;EACxE,IAAMC,4BAA4B,GAAG,SAA/BA,4BAA4BA,CAAGH,OAAO;IAAA,OAAIA,OAAO,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EAAA;EAErE,IAAIJ,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEO,KAAK,EAAE;IACf,IAAQA,KAAK,GAAKP,IAAI,CAAdO,KAAK;IACb,IAAIN,cAAc,IAAIN,IAAI,EAAE;MAC1B,OAAO,CAAC,CAACY,KAAK,CAACC,IAAI,CAAC,UAAAC,QAAQ;QAAA,OAAIP,0BAA0B,CAACO,QAAQ,CAAC,KAAKd,IAAI,IACxEW,4BAA4B,CAACG,QAAQ,CAAC,KAAKR,cAAc;MAAA,EAAC;IACjE;IACA,IAAIN,IAAI,EAAE;MACR,OAAO,CAAC,CAACY,KAAK,CAACC,IAAI,CAAC,UAAAC,QAAQ;QAAA,OAAIP,0BAA0B,CAACO,QAAQ,CAAC,KAAKd,IAAI;MAAA,EAAC;IAChF;IACA,OAAOY,KAAK,CAACX,IAAI,CAAC,UAAAa,QAAQ;MAAA,OAAIf,gBAAgB,CAACQ,0BAA0B,CAACO,QAAQ,CAAC,CAAC;IAAA,EAAC;EACvF;EAEA,OAAO,KAAK;AACd,CAAC","ignoreList":[]}
|
package/test-utils.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { BrowserRouter as Router } from 'react-router-dom';
|
|
9
|
+
import { createMemoryHistory } from 'history';
|
|
10
|
+
import { render } from '@testing-library/react';
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
13
|
+
export var renderWithRouter = function renderWithRouter(ui) {
|
|
14
|
+
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
15
|
+
_ref$route = _ref.route,
|
|
16
|
+
route = _ref$route === void 0 ? '/' : _ref$route,
|
|
17
|
+
_ref$history = _ref.history,
|
|
18
|
+
history = _ref$history === void 0 ? createMemoryHistory({
|
|
19
|
+
initialEntries: [route]
|
|
20
|
+
}) : _ref$history;
|
|
21
|
+
// eslint-disable-next-line react/prop-types
|
|
22
|
+
var Wrapper = function Wrapper(_ref2) {
|
|
23
|
+
var children = _ref2.children;
|
|
24
|
+
return /*#__PURE__*/React.createElement(Router, {
|
|
25
|
+
history: history
|
|
26
|
+
}, children);
|
|
27
|
+
};
|
|
28
|
+
return _objectSpread(_objectSpread({}, render(ui, {
|
|
29
|
+
wrapper: Wrapper
|
|
30
|
+
})), {}, {
|
|
31
|
+
// adding `history` to the returned utilities to allow us
|
|
32
|
+
// to reference it in our tests (just try to avoid using
|
|
33
|
+
// this to test implementation details).
|
|
34
|
+
history: history
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=test-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.js","names":["React","BrowserRouter","Router","createMemoryHistory","render","renderWithRouter","ui","_ref","arguments","length","undefined","_ref$route","route","_ref$history","history","initialEntries","Wrapper","_ref2","children","createElement","_objectSpread","wrapper"],"sources":["../src/test-utils.jsx"],"sourcesContent":["import React from 'react';\nimport { BrowserRouter as Router } from 'react-router-dom';\nimport { createMemoryHistory } from 'history';\nimport { render } from '@testing-library/react';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const renderWithRouter = (\n ui,\n {\n route = '/',\n history = createMemoryHistory({ initialEntries: [route] }),\n } = {},\n) => {\n // eslint-disable-next-line react/prop-types\n const Wrapper = ({ children }) => <Router history={history}>{children}</Router>;\n return {\n ...render(ui, { wrapper: Wrapper }),\n // adding `history` to the returned utilities to allow us\n // to reference it in our tests (just try to avoid using\n // this to test implementation details).\n history,\n };\n};\n"],"mappings":";;;;;;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,aAAa,IAAIC,MAAM,QAAQ,kBAAkB;AAC1D,SAASC,mBAAmB,QAAQ,SAAS;AAC7C,SAASC,MAAM,QAAQ,wBAAwB;;AAE/C;AACA,OAAO,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAC3BC,EAAE,EAKC;EAAA,IAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MADC,CAAC,CAAC;IAAAG,UAAA,GAAAJ,IAAA,CAFJK,KAAK;IAALA,KAAK,GAAAD,UAAA,cAAG,GAAG,GAAAA,UAAA;IAAAE,YAAA,GAAAN,IAAA,CACXO,OAAO;IAAPA,OAAO,GAAAD,YAAA,cAAGV,mBAAmB,CAAC;MAAEY,cAAc,EAAE,CAACH,KAAK;IAAE,CAAC,CAAC,GAAAC,YAAA;EAG5D;EACA,IAAMG,OAAO,GAAG,SAAVA,OAAOA,CAAAC,KAAA;IAAA,IAAMC,QAAQ,GAAAD,KAAA,CAARC,QAAQ;IAAA,oBAAOlB,KAAA,CAAAmB,aAAA,CAACjB,MAAM;MAACY,OAAO,EAAEA;IAAQ,GAAEI,QAAiB,CAAC;EAAA;EAC/E,OAAAE,aAAA,CAAAA,aAAA,KACKhB,MAAM,CAACE,EAAE,EAAE;IAAEe,OAAO,EAAEL;EAAQ,CAAC,CAAC;IACnC;IACA;IACA;IACAF,OAAO,EAAPA;EAAO;AAEX,CAAC","ignoreList":[]}
|
package/utils.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { isEnterpriseRole } from './roles';
|
|
2
|
+
export var getSelectedEnterpriseUUID = function getSelectedEnterpriseUUID(user) {
|
|
3
|
+
/**
|
|
4
|
+
* Selected Enterprise UUID is the UUID of the User's chosen Enterprise that
|
|
5
|
+
* they are affiliated with if belonging to multiple. The user.roles array is
|
|
6
|
+
* sorted where the earlier occuring element is the selected one where active=true.
|
|
7
|
+
*/
|
|
8
|
+
if (user !== null && user !== void 0 && user.roles) {
|
|
9
|
+
var roles = user.roles;
|
|
10
|
+
var filteredRole = roles.find(function (role) {
|
|
11
|
+
return isEnterpriseRole(role);
|
|
12
|
+
});
|
|
13
|
+
if (filteredRole) {
|
|
14
|
+
var splitRole = roles[0].split(':');
|
|
15
|
+
// A size of 2 indicates a successful split; [0] being the role, [1] being the UUID
|
|
16
|
+
if (splitRole.length === 2) {
|
|
17
|
+
return splitRole[1];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
};
|
|
23
|
+
export var isNull = function isNull(inputValue) {
|
|
24
|
+
var createArrayFromValue = function createArrayFromValue(value) {
|
|
25
|
+
var values = [];
|
|
26
|
+
if (Array.isArray(value)) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
values.push(value);
|
|
30
|
+
return values;
|
|
31
|
+
};
|
|
32
|
+
var values = createArrayFromValue(inputValue);
|
|
33
|
+
return values.every(function (item) {
|
|
34
|
+
return item === null;
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Determines whether a specified feature flag is enabled.
|
|
40
|
+
*
|
|
41
|
+
* @param {string} featureFlag
|
|
42
|
+
* @returns true if feature flag is in `?feature` query parameter
|
|
43
|
+
*/
|
|
44
|
+
export function hasFeatureFlagEnabled(featureFlag) {
|
|
45
|
+
var searchParams = new URLSearchParams(global.location.search);
|
|
46
|
+
var features = searchParams.getAll('feature');
|
|
47
|
+
return features.includes(featureFlag);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=utils.js.map
|
package/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["isEnterpriseRole","getSelectedEnterpriseUUID","user","roles","filteredRole","find","role","splitRole","split","length","isNull","inputValue","createArrayFromValue","value","values","Array","isArray","push","every","item","hasFeatureFlagEnabled","featureFlag","searchParams","URLSearchParams","global","location","search","features","getAll","includes"],"sources":["../src/utils.js"],"sourcesContent":["import { isEnterpriseRole } from './roles';\n\nexport const getSelectedEnterpriseUUID = (user) => {\n /**\n * Selected Enterprise UUID is the UUID of the User's chosen Enterprise that\n * they are affiliated with if belonging to multiple. The user.roles array is\n * sorted where the earlier occuring element is the selected one where active=true.\n */\n if (user?.roles) {\n const { roles } = user;\n const filteredRole = roles.find(role => isEnterpriseRole(role));\n if (filteredRole) {\n const splitRole = roles[0].split(':');\n // A size of 2 indicates a successful split; [0] being the role, [1] being the UUID\n if (splitRole.length === 2) {\n return splitRole[1];\n }\n }\n }\n return null;\n};\n\nexport const isNull = (inputValue) => {\n const createArrayFromValue = (value) => {\n const values = [];\n\n if (Array.isArray(value)) {\n return value;\n }\n\n values.push(value);\n return values;\n };\n const values = createArrayFromValue(inputValue);\n return values.every(item => item === null);\n};\n\n/**\n * Determines whether a specified feature flag is enabled.\n *\n * @param {string} featureFlag\n * @returns true if feature flag is in `?feature` query parameter\n */\nexport function hasFeatureFlagEnabled(featureFlag) {\n const searchParams = new URLSearchParams(global.location.search);\n const features = searchParams.getAll('feature');\n return features.includes(featureFlag);\n}\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,SAAS;AAE1C,OAAO,IAAMC,yBAAyB,GAAG,SAA5BA,yBAAyBA,CAAIC,IAAI,EAAK;EACjD;AACF;AACA;AACA;AACA;EACE,IAAIA,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEC,KAAK,EAAE;IACf,IAAQA,KAAK,GAAKD,IAAI,CAAdC,KAAK;IACb,IAAMC,YAAY,GAAGD,KAAK,CAACE,IAAI,CAAC,UAAAC,IAAI;MAAA,OAAIN,gBAAgB,CAACM,IAAI,CAAC;IAAA,EAAC;IAC/D,IAAIF,YAAY,EAAE;MAChB,IAAMG,SAAS,GAAGJ,KAAK,CAAC,CAAC,CAAC,CAACK,KAAK,CAAC,GAAG,CAAC;MACrC;MACA,IAAID,SAAS,CAACE,MAAM,KAAK,CAAC,EAAE;QAC1B,OAAOF,SAAS,CAAC,CAAC,CAAC;MACrB;IACF;EACF;EACA,OAAO,IAAI;AACb,CAAC;AAED,OAAO,IAAMG,MAAM,GAAG,SAATA,MAAMA,CAAIC,UAAU,EAAK;EACpC,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIC,KAAK,EAAK;IACtC,IAAMC,MAAM,GAAG,EAAE;IAEjB,IAAIC,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,EAAE;MACxB,OAAOA,KAAK;IACd;IAEAC,MAAM,CAACG,IAAI,CAACJ,KAAK,CAAC;IAClB,OAAOC,MAAM;EACf,CAAC;EACD,IAAMA,MAAM,GAAGF,oBAAoB,CAACD,UAAU,CAAC;EAC/C,OAAOG,MAAM,CAACI,KAAK,CAAC,UAAAC,IAAI;IAAA,OAAIA,IAAI,KAAK,IAAI;EAAA,EAAC;AAC5C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAACC,WAAW,EAAE;EACjD,IAAMC,YAAY,GAAG,IAAIC,eAAe,CAACC,MAAM,CAACC,QAAQ,CAACC,MAAM,CAAC;EAChE,IAAMC,QAAQ,GAAGL,YAAY,CAACM,MAAM,CAAC,SAAS,CAAC;EAC/C,OAAOD,QAAQ,CAACE,QAAQ,CAACR,WAAW,CAAC;AACvC","ignoreList":[]}
|