summaryrefslogtreecommitdiffstats
path: root/catalog-ui/app/third-party/PunchOutRegistry.js
blob: bc93453dc198c4f2b58278aab2b1214949c6095f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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;

})(this);