@sumboard/sdk 2.0.1 → 2.0.3
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.
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
export class Sumboard {
|
|
2
2
|
constructor() {
|
|
3
|
+
this._destroyed = false;
|
|
3
4
|
this._listener = this._receiveMessage.bind(this);
|
|
4
5
|
this.init = (config) => {
|
|
6
|
+
this._destroyed = false;
|
|
5
7
|
this._config = config;
|
|
6
8
|
window.addEventListener('message', this._listener, false);
|
|
7
9
|
return this._mountIframe();
|
|
8
10
|
};
|
|
9
11
|
this.changeFilters = (filters) => {
|
|
10
|
-
this._iframe
|
|
12
|
+
this._iframe?.contentWindow?.postMessage({ type: "CHANGE_FILTERS", filters }, '*');
|
|
11
13
|
};
|
|
12
14
|
this._mountIframe = () => {
|
|
13
|
-
return new Promise((resolve) => {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
14
16
|
const iframe = document.createElement('iframe');
|
|
15
|
-
iframe.onload = () =>
|
|
17
|
+
iframe.onload = () => {
|
|
18
|
+
if (this._destroyed)
|
|
19
|
+
return reject(new Error('Sumboard destroyed before iframe finished loading'));
|
|
20
|
+
return resolve();
|
|
21
|
+
};
|
|
16
22
|
iframe.src = this._generateIframeSrc();
|
|
17
23
|
iframe.width = '100%';
|
|
18
24
|
iframe.height = '100%';
|
|
@@ -22,6 +28,8 @@ export class Sumboard {
|
|
|
22
28
|
const wrapper = document.getElementById('sumboard');
|
|
23
29
|
if (!wrapper)
|
|
24
30
|
throw new Error('not found HTMLElement with id "sumboard"');
|
|
31
|
+
if (this._destroyed)
|
|
32
|
+
return reject(new Error('Sumboard destroyed before iframe mount'));
|
|
25
33
|
wrapper.appendChild(iframe);
|
|
26
34
|
});
|
|
27
35
|
};
|
|
@@ -33,16 +41,25 @@ export class Sumboard {
|
|
|
33
41
|
};
|
|
34
42
|
}
|
|
35
43
|
destroy() {
|
|
44
|
+
this._destroyed = true;
|
|
36
45
|
window.removeEventListener('message', this._listener, false);
|
|
46
|
+
if (this._iframe?.parentNode)
|
|
47
|
+
this._iframe.parentNode.removeChild(this._iframe);
|
|
48
|
+
if (this._iframe?.onload)
|
|
49
|
+
this._iframe.onload = null;
|
|
37
50
|
}
|
|
38
51
|
_receiveMessage({ data }) {
|
|
52
|
+
if (this._destroyed)
|
|
53
|
+
return;
|
|
39
54
|
switch (data.type) {
|
|
40
55
|
case "BOOTSTRAP_DONE":
|
|
41
56
|
return this._initDashboard();
|
|
42
57
|
}
|
|
43
58
|
}
|
|
44
59
|
_initDashboard() {
|
|
45
|
-
|
|
60
|
+
if (this._destroyed)
|
|
61
|
+
return;
|
|
62
|
+
this._iframe?.contentWindow?.postMessage({ type: "INIT_IFRAME", config: this._config }, '*');
|
|
46
63
|
}
|
|
47
64
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RrLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL3Nkay5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxPQUFPLFFBQVE7SUFBckI7UUFHVSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLGNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBbUMsSUFBSSxDQUFDLENBQUM7UUFFdEYsU0FBSSxHQUFHLENBQUMsTUFBYyxFQUFpQixFQUFFO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBSXRCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUUzRCxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUM7UUFJRixrQkFBYSxHQUFHLENBQUMsT0FBbUIsRUFBUSxFQUFFO1lBQzVDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksa0JBQXFCLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDO1FBVU0saUJBQVksR0FBRyxHQUFrQixFQUFFO1lBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRWhELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO29CQUNuQixJQUFJLElBQUksQ0FBQyxVQUFVO3dCQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQztvQkFFbkcsT0FBTyxPQUFPLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDO2dCQUVGLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBRXZDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUN0QixNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7Z0JBRTlCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUV0QixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUVwRCxJQUFJLENBQUMsT0FBTztvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7Z0JBRTFFLElBQUksSUFBSSxDQUFDLFVBQVU7b0JBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDO2dCQUV4RixPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBdUJNLHVCQUFrQixHQUFHLEdBQVcsRUFBRTtZQUN4QyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUM1QixPQUFPLHNDQUFzQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ3BFO1lBRUQsT0FBTyxpQ0FBaUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRSxDQUFDLENBQUM7SUFDSixDQUFDO0lBakVDLE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFOUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVU7WUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3ZELENBQUM7SUFpQ08sZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFxQjtRQUNqRCxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUU1QixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakI7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBSU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUU1QixJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsRUFBRSxJQUFJLGVBQWtCLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsRyxDQUFDO0NBV0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWx0ZXJzTWFwIH0gZnJvbSAnQHN1bWJvYXJkL3R5cGVzJztcblxuaW1wb3J0IHsgQ29uZmlnLCBFdmVudCwgTWVzc2FnZSB9IGZyb20gJy4vc2tkLnR5cGVzJztcblxuZXhwb3J0IGNsYXNzIFN1bWJvYXJkIHtcbiAgcHJpdmF0ZSBfaWZyYW1lPzogSFRNTElGcmFtZUVsZW1lbnQ7XG4gIHByaXZhdGUgX2NvbmZpZyE6IENvbmZpZztcbiAgcHJpdmF0ZSBfZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbGlzdGVuZXIgPSB0aGlzLl9yZWNlaXZlTWVzc2FnZS5iaW5kPFdpbmRvd0V2ZW50SGFuZGxlcnNbJ29ubWVzc2FnZSddPih0aGlzKTtcblxuICBpbml0ID0gKGNvbmZpZzogQ29uZmlnKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgIC8qKlxuICAgICAqIGxpc3RlbmVyIG1lc3NhZ2VzIGZyb20gaWZyYW1lXG4gICAgICovXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9saXN0ZW5lciEsIGZhbHNlKTtcblxuICAgIHJldHVybiB0aGlzLl9tb3VudElmcmFtZSgpO1xuICB9O1xuICAvKipcbiAgICogdW5kZWZpbmVkIGlzIGZvciBmaWx0ZXIgdGhhdCB5b3Ugd2FudCB0byByZW1vdmVcbiAgICovXG4gIGNoYW5nZUZpbHRlcnMgPSAoZmlsdGVyczogRmlsdGVyc01hcCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2lmcmFtZT8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoeyB0eXBlOiBFdmVudC5DaGFuZ2VGaWx0ZXJzLCBmaWx0ZXJzIH0sICcqJyk7XG4gIH07XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5fbGlzdGVuZXIhLCBmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5faWZyYW1lPy5wYXJlbnROb2RlKSB0aGlzLl9pZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9pZnJhbWUpO1xuICAgIGlmICh0aGlzLl9pZnJhbWU/Lm9ubG9hZCkgdGhpcy5faWZyYW1lLm9ubG9hZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9tb3VudElmcmFtZSA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAgIGlmcmFtZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybiByZWplY3QobmV3IEVycm9yKCdTdW1ib2FyZCBkZXN0cm95ZWQgYmVmb3JlIGlmcmFtZSBmaW5pc2hlZCBsb2FkaW5nJykpO1xuXG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBpZnJhbWUuc3JjID0gdGhpcy5fZ2VuZXJhdGVJZnJhbWVTcmMoKTtcblxuICAgICAgaWZyYW1lLndpZHRoID0gJzEwMCUnO1xuICAgICAgaWZyYW1lLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIGlmcmFtZS5zdHlsZS5ib3JkZXIgPSAnbm9uZSc7XG4gICAgICBpZnJhbWUuc3R5bGUub3V0bGluZSA9ICdub25lJztcblxuICAgICAgdGhpcy5faWZyYW1lID0gaWZyYW1lO1xuXG4gICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bWJvYXJkJyk7XG5cbiAgICAgIGlmICghd3JhcHBlcikgdGhyb3cgbmV3IEVycm9yKCdub3QgZm91bmQgSFRNTEVsZW1lbnQgd2l0aCBpZCBcInN1bWJvYXJkXCInKTtcblxuICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ1N1bWJvYXJkIGRlc3Ryb3llZCBiZWZvcmUgaWZyYW1lIG1vdW50JykpO1xuXG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiByZWNlaXZlIG1lc3NhZ2UgZnJvbSBpZnJhbWVcbiAgICovXG4gIHByaXZhdGUgX3JlY2VpdmVNZXNzYWdlKHsgZGF0YSB9OiB7IGRhdGE6IE1lc3NhZ2UgfSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICBjYXNlIEV2ZW50LkJvb3RzdHJhcERvbmU6XG4gICAgICAgIHJldHVybiB0aGlzLl9pbml0RGFzaGJvYXJkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBpbml0IGRhc2hib2FyZCB3aGVuIHN1bWJvYXJkIGlzIHJlYWR5XG4gICAqL1xuICBwcml2YXRlIF9pbml0RGFzaGJvYXJkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2lmcmFtZT8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoeyB0eXBlOiBFdmVudC5Jbml0SUZyYW1lLCBjb25maWc6IHRoaXMuX2NvbmZpZyB9LCAnKicpO1xuICB9XG4gIC8qKlxuICAgKiBnZW5lcmF0ZSBpZnJhbWUgc3JjIGZyb20gY29uZmlnXG4gICAqL1xuICBwcml2YXRlIF9nZW5lcmF0ZUlmcmFtZVNyYyA9ICgpOiBzdHJpbmcgPT4ge1xuICAgIGlmICgncGFnZUlkJyBpbiB0aGlzLl9jb25maWcpIHtcbiAgICAgIHJldHVybiBgaHR0cHM6Ly9hcHAuc3VtYm9hcmQuaW8vZW1iZWQtcGFnZS8ke3RoaXMuX2NvbmZpZy5wYWdlSWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYGh0dHBzOi8vYXBwLnN1bWJvYXJkLmlvL2VtYmVkLyR7dGhpcy5fY29uZmlnLmRhc2hib2FyZElkfWA7XG4gIH07XG59XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tkLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvc2tkLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWx0ZXJzTWFwIH0gZnJvbSAnQHN1bWJvYXJkL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGVudW0gRXZlbnQge1xuICBJbml0SUZyYW1lID0gJ0lOSVRfSUZSQU1FJyxcbiAgQ2hhbmdlRmlsdGVycyA9ICdDSEFOR0VfRklMVEVSUycsXG4gIEJvb3RzdHJhcERvbmUgPSAnQk9PVFNUUkFQX0RPTkUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VDb25maWcge1xuICB0b2tlbjogc3RyaW5nO1xuICAvKipcbiAgICogdW5kZWZpbmVkIGlzIGZvciBmaWx0ZXIgdGhhdCB5b3Ugd2FudCB0byByZW1vdmVcbiAgICovXG4gIGZpbHRlcnM/
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tkLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvc2tkLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWx0ZXJzTWFwIH0gZnJvbSAnQHN1bWJvYXJkL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGVudW0gRXZlbnQge1xuICBJbml0SUZyYW1lID0gJ0lOSVRfSUZSQU1FJyxcbiAgQ2hhbmdlRmlsdGVycyA9ICdDSEFOR0VfRklMVEVSUycsXG4gIEJvb3RzdHJhcERvbmUgPSAnQk9PVFNUUkFQX0RPTkUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VDb25maWcge1xuICB0b2tlbjogc3RyaW5nO1xuICAvKipcbiAgICogdW5kZWZpbmVkIGlzIGZvciBmaWx0ZXIgdGhhdCB5b3Ugd2FudCB0byByZW1vdmVcbiAgICovXG4gIGZpbHRlcnM/OiBGaWx0ZXJzTWFwO1xuICAvKipcbiAgICogbWF4aW11bSB3aWR0aCBvZiB0aGUgZGFzaGJvYXJkIGNvbnRlbnRcbiAgICovXG4gIG1heFdpZHRoPzogc3RyaW5nO1xuICAvKipcbiAgICogYWxsb3cgdG8gYWRkIHBhZGRpbmcgdG8gdGhlIGRhc2hib2FyZCBjb250ZW50XG4gICAqL1xuICBwYWRkaW5nPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZENvbmZpZyBleHRlbmRzIEJhc2VDb25maWcge1xuICBkYXNoYm9hcmRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFBhZ2VDb25maWcgZXh0ZW5kcyBCYXNlQ29uZmlnIHtcbiAgcGFnZUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IERhc2hib2FyZENvbmZpZyB8IERhc2hib2FyZFBhZ2VDb25maWc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUZpbHRlcnMgZXh0ZW5kcyBQaWNrPENvbmZpZywgJ2ZpbHRlcnMnPiB7XG4gIHR5cGU6IEV2ZW50LkNoYW5nZUZpbHRlcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUluaXQge1xuICB0eXBlOiBFdmVudC5Jbml0SUZyYW1lO1xuICBjb25maWc6IENvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQm9vdHN0cmFwIHtcbiAgdHlwZTogRXZlbnQuQm9vdHN0cmFwRG9uZTtcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZSA9IE1lc3NhZ2VCb290c3RyYXAgfCBNZXNzYWdlRmlsdGVycyB8IE1lc3NhZ2VJbml0O1xuIl19
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
class Sumboard {
|
|
2
2
|
constructor() {
|
|
3
|
+
this._destroyed = false;
|
|
3
4
|
this._listener = this._receiveMessage.bind(this);
|
|
4
5
|
this.init = (config) => {
|
|
6
|
+
this._destroyed = false;
|
|
5
7
|
this._config = config;
|
|
6
8
|
window.addEventListener('message', this._listener, false);
|
|
7
9
|
return this._mountIframe();
|
|
8
10
|
};
|
|
9
11
|
this.changeFilters = (filters) => {
|
|
10
|
-
this._iframe
|
|
12
|
+
this._iframe?.contentWindow?.postMessage({ type: "CHANGE_FILTERS", filters }, '*');
|
|
11
13
|
};
|
|
12
14
|
this._mountIframe = () => {
|
|
13
|
-
return new Promise((resolve) => {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
14
16
|
const iframe = document.createElement('iframe');
|
|
15
|
-
iframe.onload = () =>
|
|
17
|
+
iframe.onload = () => {
|
|
18
|
+
if (this._destroyed)
|
|
19
|
+
return reject(new Error('Sumboard destroyed before iframe finished loading'));
|
|
20
|
+
return resolve();
|
|
21
|
+
};
|
|
16
22
|
iframe.src = this._generateIframeSrc();
|
|
17
23
|
iframe.width = '100%';
|
|
18
24
|
iframe.height = '100%';
|
|
@@ -22,6 +28,8 @@ class Sumboard {
|
|
|
22
28
|
const wrapper = document.getElementById('sumboard');
|
|
23
29
|
if (!wrapper)
|
|
24
30
|
throw new Error('not found HTMLElement with id "sumboard"');
|
|
31
|
+
if (this._destroyed)
|
|
32
|
+
return reject(new Error('Sumboard destroyed before iframe mount'));
|
|
25
33
|
wrapper.appendChild(iframe);
|
|
26
34
|
});
|
|
27
35
|
};
|
|
@@ -33,16 +41,25 @@ class Sumboard {
|
|
|
33
41
|
};
|
|
34
42
|
}
|
|
35
43
|
destroy() {
|
|
44
|
+
this._destroyed = true;
|
|
36
45
|
window.removeEventListener('message', this._listener, false);
|
|
46
|
+
if (this._iframe?.parentNode)
|
|
47
|
+
this._iframe.parentNode.removeChild(this._iframe);
|
|
48
|
+
if (this._iframe?.onload)
|
|
49
|
+
this._iframe.onload = null;
|
|
37
50
|
}
|
|
38
51
|
_receiveMessage({ data }) {
|
|
52
|
+
if (this._destroyed)
|
|
53
|
+
return;
|
|
39
54
|
switch (data.type) {
|
|
40
55
|
case "BOOTSTRAP_DONE":
|
|
41
56
|
return this._initDashboard();
|
|
42
57
|
}
|
|
43
58
|
}
|
|
44
59
|
_initDashboard() {
|
|
45
|
-
|
|
60
|
+
if (this._destroyed)
|
|
61
|
+
return;
|
|
62
|
+
this._iframe?.contentWindow?.postMessage({ type: "INIT_IFRAME", config: this._config }, '*');
|
|
46
63
|
}
|
|
47
64
|
}
|
|
48
65
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sumboard-sdk.mjs","sources":["../../../projects/sdk/src/lib/sdk.module.ts"],"sourcesContent":["import { FiltersMap } from '@sumboard/types';\n\nimport { Config, Event, Message } from './skd.types';\n\nexport class Sumboard {\n private _iframe
|
|
1
|
+
{"version":3,"file":"sumboard-sdk.mjs","sources":["../../../projects/sdk/src/lib/sdk.module.ts"],"sourcesContent":["import { FiltersMap } from '@sumboard/types';\n\nimport { Config, Event, Message } from './skd.types';\n\nexport class Sumboard {\n private _iframe?: HTMLIFrameElement;\n private _config!: Config;\n private _destroyed = false;\n\n private _listener = this._receiveMessage.bind<WindowEventHandlers['onmessage']>(this);\n\n init = (config: Config): Promise<void> => {\n this._destroyed = false;\n this._config = config;\n /**\n * listener messages from iframe\n */\n window.addEventListener('message', this._listener!, false);\n\n return this._mountIframe();\n };\n /**\n * undefined is for filter that you want to remove\n */\n changeFilters = (filters: FiltersMap): void => {\n this._iframe?.contentWindow?.postMessage({ type: Event.ChangeFilters, filters }, '*');\n };\n\n destroy(): void {\n this._destroyed = true;\n window.removeEventListener('message', this._listener!, false);\n\n if (this._iframe?.parentNode) this._iframe.parentNode.removeChild(this._iframe);\n if (this._iframe?.onload) this._iframe.onload = null;\n }\n\n private _mountIframe = (): Promise<void> => {\n return new Promise((resolve, reject) => {\n const iframe = document.createElement('iframe');\n\n iframe.onload = () => {\n if (this._destroyed) return reject(new Error('Sumboard destroyed before iframe finished loading'));\n\n return resolve();\n };\n\n iframe.src = this._generateIframeSrc();\n\n iframe.width = '100%';\n iframe.height = '100%';\n iframe.style.border = 'none';\n iframe.style.outline = 'none';\n\n this._iframe = iframe;\n\n const wrapper = document.getElementById('sumboard');\n\n if (!wrapper) throw new Error('not found HTMLElement with id \"sumboard\"');\n\n if (this._destroyed) return reject(new Error('Sumboard destroyed before iframe mount'));\n\n wrapper.appendChild(iframe);\n });\n };\n /**\n * receive message from iframe\n */\n private _receiveMessage({ data }: { data: Message }): void {\n if (this._destroyed) return;\n\n switch (data.type) {\n case Event.BootstrapDone:\n return this._initDashboard();\n }\n }\n /**\n * init dashboard when sumboard is ready\n */\n private _initDashboard(): void {\n if (this._destroyed) return;\n\n this._iframe?.contentWindow?.postMessage({ type: Event.InitIFrame, config: this._config }, '*');\n }\n /**\n * generate iframe src from config\n */\n private _generateIframeSrc = (): string => {\n if ('pageId' in this._config) {\n return `https://app.sumboard.io/embed-page/${this._config.pageId}`;\n }\n\n return `https://app.sumboard.io/embed/${this._config.dashboardId}`;\n };\n}\n"],"names":[],"mappings":"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"}
|
package/lib/sdk.module.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { FiltersMap } from '@sumboard/types';
|
|
2
2
|
import { Config } from './skd.types';
|
|
3
3
|
export declare class Sumboard {
|
|
4
|
-
private _iframe
|
|
4
|
+
private _iframe?;
|
|
5
5
|
private _config;
|
|
6
|
+
private _destroyed;
|
|
6
7
|
private _listener;
|
|
7
8
|
init: (config: Config) => Promise<void>;
|
|
8
9
|
changeFilters: (filters: FiltersMap) => void;
|
package/lib/skd.types.d.ts
CHANGED