aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/third-party/PunchOutRegistry.js
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-ui/src/third-party/PunchOutRegistry.js')
-rw-r--r--catalog-ui/src/third-party/PunchOutRegistry.js98
1 files changed, 98 insertions, 0 deletions
diff --git a/catalog-ui/src/third-party/PunchOutRegistry.js b/catalog-ui/src/third-party/PunchOutRegistry.js
new file mode 100644
index 0000000000..db8e6875d6
--- /dev/null
+++ b/catalog-ui/src/third-party/PunchOutRegistry.js
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+(function(window) {
+ "use strict";
+
+ if (window.PunchOutRegistry) {
+ return;
+ }
+
+ var queuedFactoryRequests = new Map();
+ var factoryPromises = new Map();
+ var instancePromises = new Map();
+
+ function registerFactory(name, factory) {
+ if (factoryPromises.has(name) && !queuedFactoryRequests.has(name)) {
+ console.error("PunchOut \"" + name + "\" has been already registered");
+ return;
+ }
+ if (queuedFactoryRequests.has(name)) {
+ var factoryRequest = queuedFactoryRequests.get(name);
+ factoryRequest(factory);
+ queuedFactoryRequests.delete(name);
+ } else {
+ factoryPromises.set(name, Promise.resolve(factory));
+ }
+ }
+
+ function getFactoryPromise(name) {
+ var factoryPromise = factoryPromises.get(name);
+ if (!factoryPromise) {
+ factoryPromise = new Promise(function (resolveFactory) {
+ queuedFactoryRequests.set(name, resolveFactory);
+ });
+ factoryPromises.set(name, factoryPromise);
+ }
+ return factoryPromise;
+ }
+
+ function getInstancePromise(name, element) {
+ var factoryPromise;
+ var instancePromise = instancePromises.get(element);
+ if (!instancePromise) {
+ instancePromise = getFactoryPromise(name).then(function(factory) {
+ return factory();
+ });
+ instancePromises.set(element, instancePromise);
+ }
+ return instancePromise;
+ }
+
+ function renderPunchOut(params, element) {
+ var name = params.name;
+ var options = params.options || {};
+ var onEvent = params.onEvent || function () {};
+
+ getInstancePromise(name, element).then(function (punchOut) {
+ punchOut.render({options: options, onEvent: onEvent}, element);
+ });
+ }
+
+ function unmountPunchOut(element) {
+ if (!instancePromises.has(element)) {
+ console.error("There is no PunchOut in element", element);
+ return;
+ }
+ instancePromises.get(element).then(function(punchOut) {
+ punchOut.unmount(element);
+ });
+ instancePromises.delete(element);
+ }
+
+ var PunchOutRegistry = Object.freeze({
+ register: registerFactory,
+ render: renderPunchOut,
+ unmount: unmountPunchOut
+ });
+
+ window.PunchOutRegistry = PunchOutRegistry;
+
+})(window);