@letscooee/web-sdk 0.0.5 → 0.0.9

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +2 -2
  3. package/dist/constants.js +7 -3
  4. package/dist/init/visibility-listener.js +2 -2
  5. package/dist/models/trigger/action/click-action-executor.js +14 -6
  6. package/dist/models/trigger/blocks/border.js +2 -0
  7. package/dist/models/trigger/elements/base-element.js +2 -0
  8. package/dist/models/trigger/elements/text-element.js +2 -0
  9. package/dist/models/trigger/embedded-trigger.js +26 -0
  10. package/dist/models/trigger/inapp/container.js +81 -1
  11. package/dist/models/trigger/trigger-data.js +2 -2
  12. package/dist/models/trigger/trigger-helper.js +52 -0
  13. package/dist/renderer/block-processor.js +11 -14
  14. package/dist/renderer/container-renderer.js +7 -5
  15. package/dist/renderer/iFrame-renderer.js +2 -5
  16. package/dist/renderer/image-renderer.js +2 -2
  17. package/dist/renderer/in-app-renderer.js +14 -6
  18. package/dist/renderer/index.js +9 -5
  19. package/dist/renderer/renderer.js +22 -10
  20. package/dist/renderer/root-container-renderer.js +19 -10
  21. package/dist/renderer/text-renderer.js +2 -1
  22. package/dist/sdk-preview.min.js +1 -1
  23. package/dist/sdk.min.js +1 -1
  24. package/dist/services/http-api.service.js +28 -8
  25. package/dist/services/user-auth.service.js +7 -7
  26. package/dist/session/new-session-executor.js +2 -2
  27. package/dist/session/session-manager.js +1 -0
  28. package/dist/utils/local-storage-helper.js +22 -0
  29. package/dist/utils/log.js +14 -10
  30. package/package.json +7 -6
  31. package/dist/models/trigger/blocks/colour.js +0 -1
  32. package/dist/models/trigger/blocks/flex.js +0 -1
  33. package/dist/models/trigger/blocks/position.js +0 -1
  34. package/dist/models/trigger/elements/base-text-element.js +0 -1
  35. package/dist/models/trigger/elements/group-element.js +0 -1
  36. package/dist/renderer/block-renderer.js +0 -44
  37. package/dist/renderer/group-renderer.js +0 -44
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Change Log
2
2
 
3
+ # 0.0.9
4
+
5
+ 1. Fix: glassmorphism on iOS.
6
+ 2. Fix: Fix rendering scaled images.
7
+ 3. Fix: Update in KPI for CTA.
8
+ 4. Fix: Do not remove in-app if being used inside an element.
9
+
10
+ # 0.0.8
11
+
12
+ 1. Feature: Ability of InApp to be rendered inside an element.
13
+ 2. Fix: Overflowed content should not be rendered.
14
+ 3. Fix: Placing in-app on east direction.
15
+
16
+ # 0.0.7
17
+
18
+ More feature support in the sdk.
19
+
20
+ # 0.0.6
21
+
22
+ 1. Build: Upgrade TypeScript to 4.4.
23
+ 2. Fix: Convert \n to `<br>` in texts.
24
+
3
25
  # 0.0.5
4
26
 
5
27
  Supporting changes based on the in-app composer.
package/README.md CHANGED
@@ -27,11 +27,11 @@ code before calling any other CooeeSDK functions.
27
27
  <script src="https://cdn.jsdelivr.net/npm/@letscooee/web-sdk@latest/dist/sdk.min.js" async></script>
28
28
  <script>
29
29
  window.CooeeSDK = window.CooeeSDK || {events: [], profile: [], account: []};
30
- CooeeSDK.account.push({"appID": "MY_COOEE_APP_ID", "appSecret": "MY_COOEE_APP_SECRET"});
30
+ CooeeSDK.account.push({"appID": "MY_COOEE_APP_ID"});
31
31
  </script>
32
32
  ```
33
33
 
34
- Replace `MY_COOEE_APP_ID` & `MY_COOEE_APP_SECRET` with the app id & secret given to you.
34
+ Replace `MY_COOEE_APP_ID` with the app id as seen in your Cooee dashboard.
35
35
 
36
36
  #### Step 2: Track Custom Events
37
37
 
package/dist/constants.js CHANGED
@@ -8,8 +8,7 @@ var Constants = /** @class */ (function () {
8
8
  function Constants() {
9
9
  }
10
10
  Constants.API_URL = 'https://api.sdk.letscooee.com';
11
- Constants.SDK_VERSION = '0.0.4';
12
- Constants.SDK_VERSION_CODE = 4;
11
+ Constants.SDK_VERSION = require('../package.json').version;
13
12
  Constants.SDK_DEBUG = false;
14
13
  Constants.SDK = 'WEB';
15
14
  Constants.LOG_PREFIX = 'CooeeSDK';
@@ -26,10 +25,15 @@ var Constants = /** @class */ (function () {
26
25
  Constants.STORAGE_FIRST_TIME_LAUNCH = 'ifl';
27
26
  Constants.STORAGE_LAST_ACTIVE = 'la';
28
27
  Constants.STORAGE_TRIGGER_START_TIME = 'tst';
29
- Constants.STORAGE_ACTIVE_TRIGGER_ID = 'atid';
28
+ Constants.STORAGE_ACTIVE_TRIGGER = 'at';
29
+ Constants.STORAGE_ACTIVE_TRIGGERS = 'ats';
30
30
  // endregion
31
31
  Constants.IDLE_TIME_IN_SECONDS = 30 * 60;
32
32
  Constants.IN_APP_CONTAINER_NAME = 'cooee-wrapper';
33
+ (function () {
34
+ var rawCode = Constants.SDK_VERSION.split('.').map(function (item) { return item.padStart(2, '0'); }).join('');
35
+ Constants.SDK_VERSION_CODE = parseInt(rawCode, 10);
36
+ })();
33
37
  return Constants;
34
38
  }());
35
39
  export { Constants };
@@ -89,7 +89,7 @@ var VisibilityListener = /** @class */ (function () {
89
89
  }
90
90
  props = {};
91
91
  props[VisibilityListener.INACTIVE_DURATION] = duration;
92
- event = new Event('CE Web Active', props);
92
+ event = new Event('CE App Foreground', props);
93
93
  _a = event;
94
94
  return [4 /*yield*/, new DevicePropertiesCollector().get()];
95
95
  case 1:
@@ -113,7 +113,7 @@ var VisibilityListener = /** @class */ (function () {
113
113
  duration = this.runtimeData.getTimeForActiveInSeconds();
114
114
  props = {};
115
115
  props[VisibilityListener.ACTIVE_DURATION] = duration;
116
- this.apiService.sendEvent(new Event('CE Web Inactive', props));
116
+ this.apiService.sendEvent(new Event('CE App Background', props));
117
117
  return [2 /*return*/];
118
118
  });
119
119
  });
@@ -124,21 +124,29 @@ var ClickActionExecutor = /** @class */ (function () {
124
124
  * Performs close action
125
125
  */
126
126
  ClickActionExecutor.prototype.closeAction = function () {
127
+ var _a;
127
128
  if (!this.action.close) {
128
129
  return;
129
130
  }
130
131
  new RootContainerRenderer().removeInApp();
131
132
  var startTime = LocalStorageHelper.getNumber(Constants.STORAGE_TRIGGER_START_TIME, new Date().getTime());
132
- var triggerID = LocalStorageHelper.getString(Constants.STORAGE_ACTIVE_TRIGGER_ID, '');
133
+ var triggerID = (_a = LocalStorageHelper.getObject(Constants.STORAGE_ACTIVE_TRIGGER)) === null || _a === void 0 ? void 0 : _a.triggerID;
133
134
  var diffInSeconds = (new Date().getTime() - startTime) / 1000;
135
+ var closeBehaviour;
136
+ if (this.action.ext || this.action.up || this.action.kv ||
137
+ this.action.iab || this.action.prompt || this.action.share) {
138
+ closeBehaviour = 'CTA';
139
+ }
140
+ else {
141
+ closeBehaviour = 'Close';
142
+ }
134
143
  var eventProps = {
135
144
  'triggerID': triggerID,
136
- 'Close Behaviour': 'CTA',
137
- 'Duration': diffInSeconds,
145
+ 'closeBehaviour': closeBehaviour,
146
+ 'duration': diffInSeconds,
138
147
  };
139
148
  this.apiService.sendEvent(new Event('CE Trigger Closed', eventProps));
140
149
  LocalStorageHelper.remove(Constants.STORAGE_TRIGGER_START_TIME);
141
- LocalStorageHelper.remove(Constants.STORAGE_ACTIVE_TRIGGER_ID);
142
150
  };
143
151
  /**
144
152
  * Performs share action i.e. share some url on CTA.
@@ -152,7 +160,7 @@ var ClickActionExecutor = /** @class */ (function () {
152
160
  // TODO test in mobile browsers
153
161
  var share = navigator.share;
154
162
  if (!share) {
155
- Log.w('Navigator.share is not compatible with this browser');
163
+ Log.warning('Navigator.share is not compatible with this browser');
156
164
  return;
157
165
  }
158
166
  navigator.share({ 'text': this.action.share.text, 'title': 'Share' })
@@ -182,7 +190,7 @@ var ClickActionExecutor = /** @class */ (function () {
182
190
  ClickActionExecutor.prototype.promptPushNotificationPermission = function () {
183
191
  var _this = this;
184
192
  if (!('Notification' in window)) {
185
- Log.w('This browser does not support desktop notification');
193
+ Log.warning('This browser does not support desktop notification');
186
194
  return;
187
195
  }
188
196
  // TODO Need device endpoints to update this property
@@ -40,8 +40,10 @@ var Border = /** @class */ (function () {
40
40
  return Border;
41
41
  }());
42
42
  export { Border };
43
+ /* eslint-disable no-unused-vars */
43
44
  export var BorderStyle;
44
45
  (function (BorderStyle) {
45
46
  BorderStyle[BorderStyle["SOLID"] = 1] = "SOLID";
46
47
  BorderStyle[BorderStyle["DASHED"] = 2] = "DASHED";
47
48
  })(BorderStyle || (BorderStyle = {}));
49
+ /* eslint-enable no-unused-vars */
@@ -39,6 +39,7 @@ var BaseElement = /** @class */ (function () {
39
39
  return BaseElement;
40
40
  }());
41
41
  export { BaseElement };
42
+ /* eslint-disable no-unused-vars */
42
43
  export var ElementType;
43
44
  (function (ElementType) {
44
45
  ElementType[ElementType["IMAGE"] = 1] = "IMAGE";
@@ -46,3 +47,4 @@ export var ElementType;
46
47
  ElementType[ElementType["BUTTON"] = 3] = "BUTTON";
47
48
  ElementType[ElementType["SHAPE"] = 100] = "SHAPE";
48
49
  })(ElementType || (ElementType = {}));
50
+ /* eslint-disable no-unused-vars */
@@ -64,6 +64,7 @@ var TextPart = /** @class */ (function () {
64
64
  return TextPart;
65
65
  }());
66
66
  export { TextPart };
67
+ /* eslint-disable no-unused-vars */
67
68
  export var TextAlign;
68
69
  (function (TextAlign) {
69
70
  TextAlign[TextAlign["START"] = 0] = "START";
@@ -77,3 +78,4 @@ export var TextScript;
77
78
  TextScript[TextScript["SUPER"] = 1] = "SUPER";
78
79
  TextScript[TextScript["SUB"] = 2] = "SUB";
79
80
  })(TextScript || (TextScript = {}));
81
+ /* eslint-enable no-unused-vars */
@@ -0,0 +1,26 @@
1
+ /**
2
+ * This class store data related to triggers which are active/activated by clicking on the trigger notification or by
3
+ * looking an in-app trigger(in future). This would be commonly sent with events as <code>activeTrigger</code>.
4
+ *
5
+ * @author Abhishek Taparia
6
+ * @since 1.1.0
7
+ */
8
+ var EmbeddedTrigger = /** @class */ (function () {
9
+ function EmbeddedTrigger(data) {
10
+ this.triggerID = data.id;
11
+ this.engagementID = data.engagementID;
12
+ this.expireAt = data.expireAt;
13
+ if (this.isExpired) {
14
+ this.expired = this.isExpired;
15
+ }
16
+ }
17
+ Object.defineProperty(EmbeddedTrigger.prototype, "isExpired", {
18
+ get: function () {
19
+ return this.expireAt < new Date().getTime();
20
+ },
21
+ enumerable: false,
22
+ configurable: true
23
+ });
24
+ return EmbeddedTrigger;
25
+ }());
26
+ export { EmbeddedTrigger };
@@ -17,8 +17,88 @@ import { BaseElement } from '../elements';
17
17
  var Container = /** @class */ (function (_super) {
18
18
  __extends(Container, _super);
19
19
  function Container(data) {
20
- return _super.call(this, data) || this;
20
+ var _a;
21
+ var _this = _super.call(this, data) || this;
22
+ _this.o = (_a = data.o) !== null && _a !== void 0 ? _a : ContainerOrigin.C;
23
+ return _this;
21
24
  }
25
+ Container.prototype.getStyles = function () {
26
+ var styles;
27
+ if (this.o === ContainerOrigin.NW) {
28
+ styles = {
29
+ top: 0,
30
+ left: 0,
31
+ };
32
+ }
33
+ else if (this.o === ContainerOrigin.N) {
34
+ styles = {
35
+ top: 0,
36
+ left: '50%',
37
+ transform: 'translateX(-50%)',
38
+ };
39
+ }
40
+ else if (this.o === ContainerOrigin.NE) {
41
+ styles = {
42
+ top: 0,
43
+ right: 0,
44
+ };
45
+ }
46
+ else if (this.o === ContainerOrigin.E) {
47
+ styles = {
48
+ top: '50%',
49
+ right: 0,
50
+ transform: 'translateY(-50%)',
51
+ };
52
+ }
53
+ else if (this.o === ContainerOrigin.SE) {
54
+ styles = {
55
+ bottom: 0,
56
+ right: 0,
57
+ };
58
+ }
59
+ else if (this.o === ContainerOrigin.S) {
60
+ styles = {
61
+ bottom: 0,
62
+ left: '50%',
63
+ transform: 'translateX(-50%)',
64
+ };
65
+ }
66
+ else if (this.o === ContainerOrigin.SW) {
67
+ styles = {
68
+ bottom: 0,
69
+ left: 0,
70
+ };
71
+ }
72
+ else if (this.o === ContainerOrigin.W) {
73
+ styles = {
74
+ top: '50%',
75
+ left: 0,
76
+ transform: 'translateY(-50%)',
77
+ };
78
+ }
79
+ else {
80
+ styles = {
81
+ top: '50%',
82
+ left: '50%',
83
+ transform: 'translateX(-50%) translateY(-50%)',
84
+ };
85
+ }
86
+ styles.position = 'absolute';
87
+ styles.overflow = 'hidden';
88
+ return styles;
89
+ };
22
90
  return Container;
23
91
  }(BaseElement));
24
92
  export { Container };
93
+ export var ContainerOrigin;
94
+ (function (ContainerOrigin) {
95
+ ContainerOrigin[ContainerOrigin["NW"] = 1] = "NW";
96
+ ContainerOrigin[ContainerOrigin["N"] = 2] = "N";
97
+ ContainerOrigin[ContainerOrigin["NE"] = 3] = "NE";
98
+ ContainerOrigin[ContainerOrigin["W"] = 4] = "W";
99
+ ContainerOrigin[ContainerOrigin["C"] = 5] = "C";
100
+ ContainerOrigin[ContainerOrigin["E"] = 6] = "E";
101
+ ContainerOrigin[ContainerOrigin["SW"] = 7] = "SW";
102
+ ContainerOrigin[ContainerOrigin["S"] = 8] = "S";
103
+ ContainerOrigin[ContainerOrigin["SE"] = 9] = "SE";
104
+ })(ContainerOrigin || (ContainerOrigin = {}));
@@ -9,9 +9,9 @@ var TriggerData = /** @class */ (function () {
9
9
  * @param {Props} data payload
10
10
  */
11
11
  function TriggerData(data) {
12
- this.duration = 0;
12
+ this.expireAt = new Date().getTime();
13
13
  this.id = data.id;
14
- this.duration = data.duration;
14
+ this.expireAt = data.expireAt;
15
15
  this.version = data.version;
16
16
  this.engagementID = data.engagementID;
17
17
  this.internal = data.internal;
@@ -0,0 +1,52 @@
1
+ import { LocalStorageHelper } from '../../utils/local-storage-helper';
2
+ import { Constants } from '../../constants';
3
+ import { EmbeddedTrigger } from './embedded-trigger';
4
+ /**
5
+ * A small helper class for any kind of engagement trigger like caching or retrieving from local storage.
6
+ *
7
+ * @author Abhishek Taparia
8
+ * @since 0.0.7
9
+ */
10
+ var TriggerHelper = /** @class */ (function () {
11
+ function TriggerHelper() {
12
+ }
13
+ /**
14
+ * Store the current active trigger details in local storage for "late engagement tracking".
15
+ * @param triggerData trigger data
16
+ */
17
+ TriggerHelper.storeActiveTrigger = function (triggerData) {
18
+ if (triggerData.id === 'test') {
19
+ return;
20
+ }
21
+ var activeTriggers = LocalStorageHelper.getObject(Constants.STORAGE_ACTIVE_TRIGGERS);
22
+ if (!activeTriggers) {
23
+ activeTriggers = [];
24
+ }
25
+ var embeddedTrigger = new EmbeddedTrigger(triggerData);
26
+ if (!embeddedTrigger.isExpired) {
27
+ activeTriggers.push(embeddedTrigger);
28
+ }
29
+ LocalStorageHelper.setObject(Constants.STORAGE_ACTIVE_TRIGGER, embeddedTrigger);
30
+ LocalStorageHelper.setObject(Constants.STORAGE_ACTIVE_TRIGGERS, activeTriggers);
31
+ };
32
+ /**
33
+ * Get the list of non-expired active triggers from local storage for "late engagement tracking".
34
+ *
35
+ * @return EmbeddedTrigger[] list of active triggers
36
+ */
37
+ TriggerHelper.getActiveTriggers = function () {
38
+ var activeTriggers = LocalStorageHelper.getObject(Constants.STORAGE_ACTIVE_TRIGGERS);
39
+ if (!activeTriggers) {
40
+ return [];
41
+ }
42
+ activeTriggers.forEach(function (trigger, index, array) {
43
+ if (new EmbeddedTrigger(trigger).isExpired) {
44
+ array.splice(index, 1);
45
+ }
46
+ });
47
+ LocalStorageHelper.setObject(Constants.STORAGE_ACTIVE_TRIGGERS, activeTriggers);
48
+ return activeTriggers;
49
+ };
50
+ return TriggerHelper;
51
+ }());
52
+ export { TriggerHelper };
@@ -1,5 +1,4 @@
1
1
  import { Renderer } from './renderer';
2
- import UAParser from 'ua-parser-js';
3
2
  import { ClickActionExecutor } from '../models/trigger/action/click-action-executor';
4
3
  import { getScalingFactor } from './index';
5
4
  import { Container } from '../models/trigger/inapp/container';
@@ -10,16 +9,13 @@ import { Container } from '../models/trigger/inapp/container';
10
9
  * @version 0.0.5
11
10
  */
12
11
  var BlockProcessor = /** @class */ (function () {
13
- /**
14
- * Constructor
15
- */
16
12
  function BlockProcessor(parentHTMLEl, inappElement) {
13
+ this.renderer = Renderer.get();
17
14
  this.screenWidth = 0;
18
15
  this.screenHeight = 0;
19
16
  this.scalingFactor = getScalingFactor();
20
17
  this.parentHTMLEl = parentHTMLEl;
21
18
  this.inappElement = inappElement;
22
- this.renderer = new Renderer();
23
19
  this.screenWidth = this.renderer.getWidth();
24
20
  this.screenHeight = this.renderer.getHeight();
25
21
  }
@@ -40,7 +36,6 @@ var BlockProcessor = /** @class */ (function () {
40
36
  this.processSpaceBlock();
41
37
  this.processTransformBlock();
42
38
  this.registerAction();
43
- this.renderer.setStyle(this.inappHTMLEl, 'overflow', 'visible');
44
39
  this.renderer.setStyle(this.inappHTMLEl, 'outline', 'none');
45
40
  };
46
41
  /**
@@ -141,7 +136,8 @@ var BlockProcessor = /** @class */ (function () {
141
136
  if (!action) {
142
137
  return;
143
138
  }
144
- this.inappHTMLEl.addEventListener('click', function () {
139
+ this.inappHTMLEl.addEventListener('click', function (event) {
140
+ event.stopPropagation();
145
141
  new ClickActionExecutor(action).execute();
146
142
  });
147
143
  };
@@ -149,7 +145,6 @@ var BlockProcessor = /** @class */ (function () {
149
145
  * Process background block of the element
150
146
  */
151
147
  BlockProcessor.prototype.processBackgroundBlock = function () {
152
- var _a;
153
148
  var bg = this.inappElement.bg;
154
149
  if (!bg) {
155
150
  return;
@@ -159,12 +154,11 @@ var BlockProcessor = /** @class */ (function () {
159
154
  if (this.inappElement instanceof Container) {
160
155
  htmlElement = htmlElement.parentElement;
161
156
  }
162
- var prefix = '';
163
- if ((_a = new UAParser().getBrowser().name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes('safari')) {
164
- prefix = '-webkit-';
165
- }
166
157
  if (bg.glossy) {
167
- this.renderer.setStyle(htmlElement, prefix + 'backdrop-filter', "blur(" + bg.glossy.radius + "px)");
158
+ // Style for Apple devices
159
+ this.renderer.setStyle(htmlElement, '-webkit-backdrop-filter', "blur(" + bg.glossy.radius + "px)");
160
+ // Style for other devices
161
+ this.renderer.setStyle(htmlElement, 'backdrop-filter', "blur(" + bg.glossy.radius + "px)");
168
162
  if (bg.glossy.color) {
169
163
  this.processColourBlock(bg.glossy.color, 'background', htmlElement);
170
164
  }
@@ -185,7 +179,10 @@ var BlockProcessor = /** @class */ (function () {
185
179
  this.renderer.setStyle(htmlElement, 'background', value);
186
180
  this.renderer.setStyle(htmlElement, 'background-size', 'cover');
187
181
  if (bg.img.a) {
188
- this.renderer.setStyle(htmlElement, prefix + 'backdrop-filter', "opacity(" + bg.img.a + ")");
182
+ // Style for Apple devices
183
+ this.renderer.setStyle(htmlElement, '-webkit-backdrop-filter', "opacity(" + bg.img.a + ")");
184
+ // Style for other devices
185
+ this.renderer.setStyle(htmlElement, 'backdrop-filter', "opacity(" + bg.img.a + ")");
189
186
  }
190
187
  }
191
188
  };
@@ -13,7 +13,7 @@ var __extends = (this && this.__extends) || (function () {
13
13
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
14
  };
15
15
  })();
16
- import { ShapeRenderer } from './shape-renderer';
16
+ import { BlockProcessor } from './block-processor';
17
17
  /**
18
18
  * Renders container element.
19
19
  *
@@ -24,6 +24,8 @@ var ContainerRenderer = /** @class */ (function (_super) {
24
24
  __extends(ContainerRenderer, _super);
25
25
  function ContainerRenderer(parentElement, inappElement) {
26
26
  var _this = _super.call(this, parentElement, inappElement) || this;
27
+ _this.inappHTMLEl = _this.renderer.createElement('div');
28
+ _this.insertElement();
27
29
  // Need to figure out the best way of doing this
28
30
  _this.inappElement.w = 1080;
29
31
  _this.inappElement.h = 1920;
@@ -31,14 +33,14 @@ var ContainerRenderer = /** @class */ (function (_super) {
31
33
  }
32
34
  /**
33
35
  * Render group element from layers list in {@link InAppTrigger} block.
36
+ * @return The instance of this renderer.
34
37
  */
35
38
  ContainerRenderer.prototype.render = function () {
36
- _super.prototype.render.call(this);
39
+ this.processCommonBlocks();
37
40
  this.renderer.setStyle(this.inappHTMLEl, 'position', 'relative');
38
- /*this.renderer.setStyle(this.inappHTMLEl, 'width', '100%');
39
- this.renderer.setStyle(this.inappHTMLEl, 'height', '100%');*/
41
+ Object.assign(this.inappHTMLEl.style, this.inappElement.getStyles());
40
42
  return this;
41
43
  };
42
44
  return ContainerRenderer;
43
- }(ShapeRenderer));
45
+ }(BlockProcessor));
44
46
  export { ContainerRenderer };
@@ -7,11 +7,8 @@ import { Constants } from '../constants';
7
7
  * @version 0.0.5
8
8
  */
9
9
  var IFrameRenderer = /** @class */ (function () {
10
- /**
11
- * Constructor
12
- */
13
10
  function IFrameRenderer() {
14
- this.renderer = new Renderer();
11
+ this.renderer = Renderer.get();
15
12
  }
16
13
  /**
17
14
  * Render iFrame element on CTAs.
@@ -20,7 +17,7 @@ var IFrameRenderer = /** @class */ (function () {
20
17
  * @private
21
18
  */
22
19
  IFrameRenderer.prototype.render = function (url) {
23
- var root = this.renderer.getElementById(Constants.IN_APP_CONTAINER_NAME);
20
+ var root = document.querySelector("." + Constants.IN_APP_CONTAINER_NAME);
24
21
  var iFrameDiv = this.createIFrameContainer();
25
22
  this.createIFrameElement(iFrameDiv, url);
26
23
  // Create and render close button for iFrame with anchor tag
@@ -33,8 +33,8 @@ var ImageRenderer = /** @class */ (function (_super) {
33
33
  */
34
34
  ImageRenderer.prototype.render = function () {
35
35
  this.renderer.setAttribute(this.inappHTMLEl, 'src', this.inappElement.src);
36
- this.renderer.setStyle(this.inappHTMLEl, 'max-width', '100%');
37
- this.renderer.setStyle(this.inappHTMLEl, 'max-height', '100%');
36
+ this.renderer.setStyle(this.inappHTMLEl, 'max-width', 'none');
37
+ this.renderer.setStyle(this.inappHTMLEl, 'max-height', 'none');
38
38
  this.renderer.setStyle(this.inappHTMLEl, 'display', 'block');
39
39
  this.renderer.setStyle(this.inappHTMLEl, 'margin', '0 auto');
40
40
  this.processCommonBlocks();
@@ -5,6 +5,9 @@ import { LocalStorageHelper } from '../utils/local-storage-helper';
5
5
  import { Constants } from '../constants';
6
6
  import { ImageRenderer, RootContainerRenderer, ShapeRenderer, TextRenderer } from './';
7
7
  import { ContainerRenderer } from './container-renderer';
8
+ import { TriggerHelper } from '../models/trigger/trigger-helper';
9
+ import { SafeHttpService } from '../services/safe-http-service';
10
+ import { Event } from '../models/event/event';
8
11
  /**
9
12
  * Renders In App trigger
10
13
  *
@@ -13,10 +16,13 @@ import { ContainerRenderer } from './container-renderer';
13
16
  */
14
17
  var InAppRenderer = /** @class */ (function () {
15
18
  /**
16
- * Public constructor
19
+ * Public constructor.
20
+ *
21
+ * @param parent Place the in-app in the given parent instead of the document.body.
17
22
  */
18
- function InAppRenderer() {
19
- this.rootContainer = new RootContainerRenderer().render();
23
+ function InAppRenderer(parent) {
24
+ this.parent = parent;
25
+ this.rootContainer = new RootContainerRenderer(parent).render();
20
26
  }
21
27
  /**
22
28
  * Renders in-app trigger from payload received
@@ -27,11 +33,13 @@ var InAppRenderer = /** @class */ (function () {
27
33
  this.ian = triggerData.ian;
28
34
  try {
29
35
  this.renderContainer();
36
+ var event_1 = new Event('CE Trigger Displayed', { 'triggerID': triggerData.id });
37
+ SafeHttpService.getInstance().sendEvent(event_1);
30
38
  LocalStorageHelper.setNumber(Constants.STORAGE_TRIGGER_START_TIME, new Date().getTime());
31
- LocalStorageHelper.setString(Constants.STORAGE_ACTIVE_TRIGGER_ID, triggerData.id);
39
+ TriggerHelper.storeActiveTrigger(triggerData);
32
40
  }
33
41
  catch (e) {
34
- Log.e(e);
42
+ Log.error(e);
35
43
  }
36
44
  };
37
45
  /**
@@ -50,7 +58,7 @@ var InAppRenderer = /** @class */ (function () {
50
58
  new ShapeRenderer(parentEl, inappElement).render();
51
59
  }
52
60
  else {
53
- Log.e('Unsupported element type- ' + inappElement.type);
61
+ Log.error('Unsupported element type- ' + inappElement.type);
54
62
  }
55
63
  };
56
64
  /**
@@ -1,22 +1,26 @@
1
1
  import { Constants } from '../constants';
2
+ import { Renderer } from './renderer';
2
3
  export { TextRenderer } from './text-renderer';
3
4
  export { ShapeRenderer } from './shape-renderer';
4
5
  export { ImageRenderer } from './image-renderer';
5
6
  export { RootContainerRenderer } from './root-container-renderer';
6
7
  export { IFrameRenderer } from './iFrame-renderer';
7
8
  /**
8
- * Calculate scaling factor according to screen sizes
9
+ * Calculate scaling factor according to parent most container where the in-app's root container will be rendered.
9
10
  * @return number scaling factor
10
11
  */
11
12
  export function getScalingFactor() {
12
- var screenWidth = document.documentElement.clientWidth;
13
- var screenHeight = document.documentElement.clientHeight;
13
+ var screenWidth = Renderer.get().getWidth();
14
+ var screenHeight = Renderer.get().getHeight();
15
+ var scalingFactor;
14
16
  if (screenWidth < screenHeight) {
15
17
  var shortEdge = Math.min(Constants.CANVAS_WIDTH, Constants.CANVAS_HEIGHT);
16
- return screenWidth / shortEdge;
18
+ scalingFactor = screenWidth / shortEdge;
17
19
  }
18
20
  else {
19
21
  var longEdge = Math.max(Constants.CANVAS_WIDTH, Constants.CANVAS_HEIGHT);
20
- return screenHeight / longEdge;
22
+ scalingFactor = screenHeight / longEdge;
21
23
  }
24
+ // The in-app should not scale beyond 100%
25
+ return Math.min(scalingFactor, 1);
22
26
  }
@@ -5,21 +5,34 @@
5
5
  * @version 0.0.5
6
6
  */
7
7
  var Renderer = /** @class */ (function () {
8
+ // No need to instantiate this class.
8
9
  function Renderer() {
9
10
  this.doc = document;
10
11
  }
12
+ Renderer.get = function () {
13
+ if (!Renderer._instance) {
14
+ Renderer._instance = new Renderer();
15
+ }
16
+ return Renderer._instance;
17
+ };
11
18
  /**
12
- * Get width of the browser
13
- * @return {number} inner width of the browser
19
+ * Get width of the parent most container where the Cooee's root div will render.
20
+ * @return width of the parent most container.
14
21
  */
15
22
  Renderer.prototype.getWidth = function () {
23
+ if (this.parentContainer) {
24
+ return this.parentContainer.clientWidth;
25
+ }
16
26
  return document.documentElement.clientWidth;
17
27
  };
18
28
  /**
19
- * Get height of the browser
20
- * @return {number} inner height of the browser
29
+ * Get height of the parent most container where the Cooee's root div will render.
30
+ * @return height of the parent most container.
21
31
  */
22
32
  Renderer.prototype.getHeight = function () {
33
+ if (this.parentContainer) {
34
+ return this.parentContainer.clientHeight;
35
+ }
23
36
  return document.documentElement.clientHeight;
24
37
  };
25
38
  /**
@@ -53,7 +66,7 @@ var Renderer = /** @class */ (function () {
53
66
  element.style.removeProperty(styleName);
54
67
  return;
55
68
  }
56
- element.style.setProperty(styleName, value);
69
+ element.style.setProperty(styleName, value, 'important');
57
70
  };
58
71
  /**
59
72
  * Set style of the element
@@ -65,12 +78,11 @@ var Renderer = /** @class */ (function () {
65
78
  element.setAttribute(attrName, value);
66
79
  };
67
80
  /**
68
- * Get element by tag id
69
- * @param {string} id id of the element
70
- * @return {HTMLElement | null} returns element if present, otherwise null
81
+ * Set the parent most container where the Cooee's In-App's root div will render.
82
+ * @param container The HTML holder element.
71
83
  */
72
- Renderer.prototype.getElementById = function (id) {
73
- return this.doc.getElementById(id);
84
+ Renderer.prototype.setParentContainer = function (container) {
85
+ this.parentContainer = container;
74
86
  };
75
87
  return Renderer;
76
88
  }());