@textback/notification-widget 2.0.0 → 2.0.1-102913

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. package/.eslintrc.js +291 -291
  2. package/build/index.js +12 -0
  3. package/build/sdk.js +9 -0
  4. package/package.json +70 -68
  5. package/promote_tag.sh +1 -1
  6. package/readme.md +569 -490
  7. package/server.js +8 -4
  8. package/src/libraries/ai.1.0.11.js +4088 -4088
  9. package/src/libraries/localization/locales/cs.js +14 -12
  10. package/src/libraries/localization/locales/en.js +14 -12
  11. package/src/libraries/localization/locales/index.js +8 -8
  12. package/src/libraries/localization/locales/pl.js +14 -12
  13. package/src/libraries/localization/locales/ro.js +14 -12
  14. package/src/libraries/localization/locales/ru.js +13 -12
  15. package/src/libraries/localization/locales/uk.js +14 -12
  16. package/src/libraries/localization/text.js +9 -9
  17. package/src/libraries/t.js +82 -82
  18. package/src/sdk/channels/channel.js +30 -30
  19. package/src/sdk/channels/facebook.js +13 -13
  20. package/src/sdk/channels/factory.js +3 -3
  21. package/src/sdk/channels/skype.js +12 -12
  22. package/src/sdk/channels/telegram.js +18 -18
  23. package/src/sdk/channels/viber.js +12 -12
  24. package/src/sdk/channels/vk-modal/vk-modal.html +17 -17
  25. package/src/sdk/channels/vk-modal/vk-modal.js +25 -25
  26. package/src/sdk/channels/vk-modal/vk-modal.scss +116 -116
  27. package/src/sdk/channels/vk.js +195 -184
  28. package/src/sdk/channels/whatsapp.js +16 -10
  29. package/src/sdk/channels/whatsappb.js +27 -0
  30. package/src/sdk/events/observer.js +46 -46
  31. package/src/sdk/index.js +5 -5
  32. package/src/sdk/sdk.js +67 -30
  33. package/src/sdk/utils/apiErrorHandler.js +11 -11
  34. package/src/sdk/utils/appInsights.js +88 -88
  35. package/src/sdk/utils/browserInfo.js +8 -8
  36. package/src/sdk/utils/constants.js +17 -17
  37. package/src/sdk/utils/cookies.js +67 -50
  38. package/src/sdk/utils/find.js +7 -7
  39. package/src/sdk/utils/loadConfig.js +20 -20
  40. package/src/sdk/utils/loadDeepLink.js +48 -21
  41. package/src/sdk/utils/loadScript.js +25 -25
  42. package/src/sdk/utils/loadSubscriptions.js +6 -6
  43. package/src/sdk/utils/parseQueryString.js +33 -33
  44. package/src/sdk/utils/windowHelper.js +25 -25
  45. package/src/sdk/widget/widget.js +192 -140
  46. package/src/widget/components/index.js +6 -2
  47. package/src/widget/components/tb-notification-button/facebook.js +9 -2
  48. package/src/widget/components/tb-notification-button/index.js +34 -34
  49. package/src/widget/components/tb-notification-button/styles.scss +657 -433
  50. package/src/widget/components/tb-notification-button/telegram.js +9 -2
  51. package/src/widget/components/tb-notification-button/viber.js +9 -2
  52. package/src/widget/components/tb-notification-button/vk.js +59 -50
  53. package/src/widget/components/tb-notification-button/whatsapp.js +15 -8
  54. package/src/widget/components/tb-notification-button/whatsappb.js +58 -0
  55. package/src/widget/components/tb-notification-widget/index.js +589 -384
  56. package/src/widget/components/tb-notification-widget/normalize.scss +395 -394
  57. package/src/widget/components/tb-notification-widget/styles.scss +502 -139
  58. package/src/widget/components/tb-nw-wahunter/index.js +259 -0
  59. package/src/widget/components/tb-nw-wahunter/styles.scss +471 -0
  60. package/src/widget/config.js +5 -5
  61. package/src/widget/icons/icon_chat_window.svg +1 -0
  62. package/src/widget/icons/icon_close.svg +1 -0
  63. package/src/widget/icons/icon_facebook.svg +7 -7
  64. package/src/widget/icons/icon_facebook_circle.svg +7 -9
  65. package/src/widget/icons/icon_instagram_circle.svg +95 -95
  66. package/src/widget/icons/icon_skype.svg +44 -44
  67. package/src/widget/icons/icon_skype_circle.svg +46 -46
  68. package/src/widget/icons/icon_skype_new.svg +113 -113
  69. package/src/widget/icons/icon_tg.svg +25 -25
  70. package/src/widget/icons/icon_tg_circle.svg +17 -27
  71. package/src/widget/icons/icon_viber.svg +75 -75
  72. package/src/widget/icons/icon_viber_circle.svg +67 -77
  73. package/src/widget/icons/icon_viber_new.svg +102 -102
  74. package/src/widget/icons/icon_vk.svg +14 -14
  75. package/src/widget/icons/icon_vk_circle.svg +16 -16
  76. package/src/widget/icons/icon_whatsapp.svg +147 -147
  77. package/src/widget/icons/icon_whatsapp_circle.svg +3 -3
  78. package/src/widget/icons/icon_whatsapp_hollow.svg +128 -0
  79. package/src/widget/icons/icon_whatsapp_new.svg +127 -127
  80. package/src/widget/icons/icon_whatsappb.svg +147 -0
  81. package/src/widget/icons/icon_whatsappb_circle.svg +4 -0
  82. package/src/widget/icons/icon_whatsappb_new.svg +127 -0
  83. package/src/widget/icons/paper-plane-arrow.svg +3 -0
  84. package/src/widget/icons/tb-logo.svg +21 -0
  85. package/src/widget/index.js +28 -28
  86. package/src/widget/locales/cs.js +42 -0
  87. package/src/widget/locales/en.js +42 -20
  88. package/src/widget/locales/index.js +2 -2
  89. package/src/widget/locales/pl.js +41 -19
  90. package/src/widget/locales/ro.js +41 -20
  91. package/src/widget/locales/ru.js +40 -19
  92. package/src/widget/locales/uk.js +40 -19
  93. package/src/widget/utils/cookiesEx.js +41 -41
  94. package/src/widget/utils/getLocale.js +4 -2
  95. package/src/widget/utils/stringifyAttributes.js +19 -19
  96. package/src/widget/utils/text.js +2 -1
  97. package/src/widget/utils/widgetsStorage.js +28 -28
  98. package/src/widget/widget.entry.js +3 -4
  99. package/tests/gf.html +35 -35
  100. package/tests/gf.js +21 -21
  101. package/tests/index.js +61 -61
  102. package/views/examples.ejs +7 -3
  103. package/views/sdk.html +274 -256
  104. package/webpack.common.js +72 -72
  105. package/webpack.dev.js +15 -15
  106. package/webpack.prod.js +10 -10
  107. package/src/widget/components/tb-notification-button/skype.js +0 -47
  108. package/src/widget/icons/text-back-badge.png +0 -0
  109. package/src/widget/locales/cz.js +0 -20
@@ -1,3 +1,4 @@
1
+ import MobileDetect from 'mobile-detect';
1
2
  import assign from 'lodash/assign';
2
3
  import Component from '../index.js';
3
4
 
@@ -13,461 +14,665 @@ import SDK from '../../../sdk/index.js';
13
14
  import iconBell from '../../icons/bell-icon.png';
14
15
  import iconBroadcast from '../../icons/broadcast-icon.png';
15
16
  import iconPaperPlane from '../../icons/paper-plane-icon.png';
16
- import iconTextBackBadge from '../../icons/text-back-badge.png';
17
+ import iconTbLogo from '../../icons/tb-logo.svg'
18
+ import iconChatWindow from '../../icons/icon_whatsapp_hollow.svg';
19
+ import iconClose from '../../icons/icon_close.svg';
17
20
 
18
21
  import './normalize.scss';
19
22
  import './styles.scss';
20
23
 
24
+ import Wahunter from '../tb-nw-wahunter/index.js';
25
+
26
+
21
27
  const channelButtons = {
22
- vk: require('../tb-notification-button/vk'),
23
- tg: require('../tb-notification-button/telegram'),
24
- facebook: require('../tb-notification-button/facebook'),
25
- skype: require('../tb-notification-button/skype'),
26
- viber: require('../tb-notification-button/viber'),
27
- whatsapp: require('../tb-notification-button/whatsapp')
28
+ vk: require('../tb-notification-button/vk'),
29
+ tg: require('../tb-notification-button/telegram'),
30
+ facebook: require('../tb-notification-button/facebook'),
31
+ viber: require('../tb-notification-button/viber'),
32
+ whatsapp: require('../tb-notification-button/whatsapp'),
33
+ whatsappb: require('../tb-notification-button/whatsappb')
28
34
  };
29
35
 
30
-
31
36
  const DEFAULT_BUTTONS_MARKUP = {
32
- style: 'square',
33
- displayMode: 'horizontal',
34
- align: 'center',
37
+ style: 'gradient',
38
+ displayMode: 'horizontal',
39
+ align: 'center',
40
+ };
41
+
42
+ const getDeviceDisplayMap = () => {
43
+ const md = new MobileDetect(window.navigator.userAgent);
44
+ const isDesktop = () => !(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
45
+
46
+ return new Map([
47
+ ['pc', isDesktop()],
48
+ ['mobile', md.phone()],
49
+ ['tablet', md.tablet()]
50
+ ]);
51
+ };
52
+
53
+ const showOnDevice = deviceList => {
54
+ if (deviceList === null || deviceList === undefined) return true;
55
+
56
+ return deviceList.map(i => getDeviceDisplayMap().get(i)).some(x => x);
35
57
  };
36
58
 
37
59
  export default class Widget extends Component {
38
- constructor() {
39
- super(...arguments);
60
+ constructor() {
61
+ super(...arguments);
40
62
 
41
- this.apiPath = this.apiPath || config.apiPath;
42
- this.onlyManual = this.onlyManual || this.element.hasAttribute('only-manual');
63
+ this.apiPath = this.apiPath || config.apiPath;
64
+ this.onlyManual = this.onlyManual || this.element.hasAttribute('only-manual');
65
+ this.previewMode = this.previewMode || this.element.hasAttribute('preview-mode');
43
66
 
44
- const predefinedConfig = this.widgetConfig;
67
+ const predefinedConfig = this.widgetConfig;
45
68
 
46
- //override widgetId property with data from widgetConfig
47
- if (!!predefinedConfig) {
48
- this.widgetId = predefinedConfig.id;
49
- }
69
+ //override widgetId property with data from widgetConfig
70
+ if (!!predefinedConfig) {
71
+ this.widgetId = predefinedConfig.id;
72
+ }
50
73
 
51
- let widgetInitPromise = SDK.getWidget(this.widgetId);
52
- if (!widgetInitPromise) {
53
- // init widget
54
- widgetInitPromise = SDK.initWidget({
55
- widgetId: this.widgetId,
56
- apiPath: this.apiPath,
57
- insecureContext: this.data,
58
- secureContextToken: this.secureContextToken,
59
- overrideConfig: predefinedConfig,
60
- });
61
- }
74
+ let widgetInitPromise = SDK.getWidget(this.widgetId);
75
+
76
+ if (!widgetInitPromise) {
77
+ // init widget
78
+ widgetInitPromise = SDK.initWidget({
79
+ widgetId: this.widgetId,
80
+ apiPath: this.apiPath,
81
+ insecureContext: this.data,
82
+ secureContextToken: this.secureContextToken,
83
+ overrideConfig: predefinedConfig,
84
+ }, this.previewMode);
85
+ }
62
86
 
63
- widgetInitPromise = widgetInitPromise
64
- .then(widget => {
65
- this.widget = widget;
66
-
67
- this.widgetUserId = widget.widgetUserId;
68
- this.config = widget.getConfig();
69
- this.config.type = this.config.type || constants.DEFAULT_WIDGET_TYPE;
70
- this.config.markUp = this.config.markUp || {};
71
- this.config.markUp.buttons = assign({}, DEFAULT_BUTTONS_MARKUP, this.config.markUp.buttons);
72
-
73
- this.widgetSubscriptions = widget.subscriptions;
74
- this.deepLink = widget.deeplink;
75
- const aiKey = widget.aiKey;
76
-
77
- return appInsights.init(aiKey, this.widgetUserId, this.config.accountId);
78
- })
79
- .then(res => {
80
- this.set({
81
- ready: true
82
- });
83
- return this;
84
- }, err => {
85
- console.error(err);
86
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.error', err);
87
- this.set({error: err});
88
- return this;
89
- });
90
-
91
- widgetsStorage.setWidget(this.widgetId, widgetInitPromise);
87
+ widgetInitPromise = widgetInitPromise
88
+ .then(widget => {
89
+ this.widget = widget;
90
+
91
+ this.widgetUserId = widget.widgetUserId;
92
+ this.config = widget.getConfig();
93
+ this.config.type = this.config.type || constants.DEFAULT_WIDGET_TYPE;
94
+ this.config.markUp = this.config.markUp || {};
95
+ this.config.markUp.buttons = assign({}, DEFAULT_BUTTONS_MARKUP, this.config.markUp.buttons);
96
+
97
+ this.widgetSubscriptions = widget.subscriptions;
98
+ this.deepLink = widget.deeplink;
99
+ this.lang = this.config.lang
100
+
101
+ this.showWidgetSetting = (this.widget.config && this.widget.config.showWidgetSetting)
102
+ ? this.widget.config.showWidgetSetting.devices
103
+ : null;
104
+
105
+ const aiKey = widget.aiKey;
106
+
107
+
108
+
109
+ return appInsights.init(aiKey, this.widgetUserId, this.config.accountId);
110
+ })
111
+ .then(res => {
112
+ this.set({
113
+ ready: showOnDevice(this.showWidgetSetting)
114
+ });
115
+ return this;
116
+ }, err => {
117
+ console.error(err);
118
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.error', err);
119
+ this.set({ error: err });
120
+ return this;
121
+ });
122
+
123
+ widgetsStorage.setWidget(this.widgetId, widgetInitPromise);
124
+ }
125
+
126
+ get defaults() {
127
+ return {
128
+ widgetId: this.element.getAttribute('widget-id'),
129
+ secureContextToken: this.element.getAttribute('secure-context-token'),
130
+ apiPath: this.element.getAttribute('api-path') || config.apiPath
131
+ };
132
+ }
133
+
134
+ render() {
135
+ super.render();
136
+
137
+ const wahunterElem = this.element.querySelector('tb-nw-wahunter');
138
+
139
+ if (wahunterElem) {
140
+ new Wahunter({
141
+ element: wahunterElem,
142
+ widgetAPI: this.widget,
143
+ parentElement: this.element,
144
+ });
92
145
  }
93
146
 
94
- get defaults() {
95
- return {
96
- widgetId: this.element.getAttribute('widget-id'),
97
- secureContextToken: this.element.getAttribute('secure-context-token'),
98
- apiPath: this.element.getAttribute('api-path') || config.apiPath
99
- }
147
+ this.element.id = this.element.id ? this.element.id : 'tb-notification-widget';
148
+
149
+ const buttons = this.element.querySelectorAll('tb-notification-button');
150
+
151
+ if (buttons) {
152
+ for (let i = 0; i < buttons.length; i++) {
153
+ const channel = buttons[i].getAttribute('channel');
154
+ new channelButtons[channel]({
155
+ element: buttons[i],
156
+ accountId: this.config.accountId,
157
+ userId: this.userId,
158
+ apiPath: this.apiPath,
159
+ insecureContext: this.data,
160
+ secureContextToken: this.secureContextToken,
161
+ deepLink: this.deepLink,
162
+ lang: this.lang,
163
+ vkApiId: this.config.vkApiId,
164
+ widgetId: this.config.id,
165
+ widget: this,
166
+ widgetAPI: this.widget,
167
+ });
168
+ }
100
169
  }
101
170
 
102
- render() {
103
- super.render();
104
-
105
- this.element.id = this.element.id ? this.element.id : 'tb-notification-widget';
106
-
107
- const buttons = this.element.querySelectorAll('tb-notification-button');
108
-
109
- if (buttons) {
110
- for (let i = 0; i < buttons.length; i++) {
111
- const channel = buttons[i].getAttribute('channel');
112
- new channelButtons[channel]({
113
- element: buttons[i],
114
- accountId: this.config.accountId,
115
- userId: this.userId,
116
- apiPath: this.apiPath,
117
- insecureContext: this.data,
118
- secureContextToken: this.secureContextToken,
119
- deepLink: this.deepLink,
120
- lang: this.lang,
121
- vkApiId: this.config.vkApiId,
122
- widgetId: this.config.id,
123
- widget: this,
124
- widgetAPI: this.widget,
125
- });
126
- }
171
+ if (!this.config || !this.config.displayMode) return;
172
+
173
+ if (this.config.displayMode === "popup") {
174
+ let sessionShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_s_show_counter';
175
+ let daysShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_show_counter';
176
+ let daysCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_close_counter';
177
+ let totalCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_total_close_counter';
178
+ let showWidgetSetting = this.config.showWidgetSetting;
179
+ let popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
180
+
181
+ this.element.addEventListener("click", (e) => {
182
+ const target = e.target;
183
+
184
+ if (!target.matches('#tb-notification-widget-close') && !target.matches('tb-notification-widget-overlay')) return;
185
+
186
+ popup.className += " hidden closed";
187
+ e.preventDefault();
188
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.click.close', 'userAction');
189
+ if (showWidgetSetting) {
190
+ let daysTimeout = showWidgetSetting.showAfterDays * constants.SECONDS_IN_DAY;
191
+
192
+ cookiesEx.incrementIntCookie(daysCloseCounterName, daysTimeout);
193
+ cookiesEx.incrementIntCookie(totalCloseCounterName, constants.WIDGET_USER_ID_COOKIE_TTL);
127
194
  }
195
+ });
128
196
 
129
- if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
130
- let sessionShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_s_show_counter';
131
- let daysShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_show_counter';
132
- let daysCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_close_counter';
133
- let totalCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_total_close_counter';
134
-
135
- let showWidgetSetting = this.config.showWidgetSetting;
136
-
137
- let popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
138
- this.element.querySelector('#tb-notification-widget-close').addEventListener("click", (e) => {
139
- popup.className += " hidden closed";
140
- e.preventDefault();
141
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.click.close', 'userAction');
142
- if (showWidgetSetting) {
143
- let daysTimeout = showWidgetSetting.showAfterDays * constants.SECONDS_IN_DAY;
144
-
145
- cookiesEx.incrementIntCookie(daysCloseCounterName, daysTimeout);
146
- cookiesEx.incrementIntCookie(totalCloseCounterName, constants.WIDGET_USER_ID_COOKIE_TTL);
147
- }
148
- });
149
-
150
-
151
- if (showWidgetSetting) {
152
- if (!showWidgetSetting.showIfSubscribed && this.widgetSubscriptions.length > 0) {
153
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.notShown', 'alreadySubscribed');
154
- return;
155
- }
156
-
157
-
158
- let daysTimeout = showWidgetSetting.showAfterDays * constants.SECONDS_IN_DAY;
159
- let sessionTimeout = showWidgetSetting.showSessionLength * 60;
160
-
161
- let daysShowCounter = cookiesEx.incrementIntCookie(daysShowCounterName, daysTimeout);
162
- let sessionShowCounter = cookiesEx.incrementIntCookie(sessionShowCounterName, sessionTimeout);
163
- let daysCloseCounter = cookiesEx.getIntCookie(daysCloseCounterName) || 0;
164
- let totalCloseCounter = cookiesEx.getIntCookie(totalCloseCounterName) || 0;
165
-
166
- const sendNonDisplayed = (reason) => {
167
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.notShown', reason);
168
- return true;
169
- };
170
-
171
- if (sessionShowCounter > showWidgetSetting.showTimesInSession && sendNonDisplayed('timesPerSession')|| // Не более N раз в сессию
172
- (showWidgetSetting.showTimesInRow > 0 && daysShowCounter > showWidgetSetting.showTimesInRow && sendNonDisplayed('timesPerDays')) ||// Не более N раз в M дней
173
- (showWidgetSetting.closeTimesInRow > 0 && daysCloseCounter >= showWidgetSetting.closeTimesInRow && sendNonDisplayed('closedTimesPerDays')) || // Не более N закрытий в M дней
174
- (showWidgetSetting.closeTimesInTotal > 0 && totalCloseCounter >= showWidgetSetting.closeTimesInTotal && sendNonDisplayed('closedTimes')) // Не более N закрытий всего
175
- ) {
176
- return;
177
- }
178
- }
179
197
 
180
- if (this.onlyManual) {
181
- popup.className = 'hidden';
182
- return;
198
+ if (this.config.widgetKind === 'WAHUNTER') {
199
+ // For uniformity of config object, "showIfSubscribed" here is "show wahunter again if it allready was run"
200
+ const wahunterWasRun = cookiesEx.getBoolCookie(`${constants.COOKIE_NAME_PREFIX + this.widgetId}_wahunter_was_run`);
201
+ const showIfWasRun = showWidgetSetting.showIfSubscribed;
202
+
203
+ if (wahunterWasRun && !showIfWasRun) return;
204
+ }
205
+
206
+
207
+ if (showWidgetSetting) {
208
+ if (!showWidgetSetting.showIfSubscribed && this.widgetSubscriptions.length > 0) {
209
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.notShown', 'alreadySubscribed');
210
+ return;
211
+ }
212
+
213
+ let daysTimeout = showWidgetSetting.showAfterDays * constants.SECONDS_IN_DAY;
214
+ let sessionTimeout = showWidgetSetting.showSessionLength * 60;
215
+ let daysShowCounter = cookiesEx.incrementIntCookie(daysShowCounterName, daysTimeout);
216
+ let sessionShowCounter = cookiesEx.incrementIntCookie(sessionShowCounterName, sessionTimeout);
217
+ let daysCloseCounter = cookiesEx.getIntCookie(daysCloseCounterName) || 0;
218
+ let totalCloseCounter = cookiesEx.getIntCookie(totalCloseCounterName) || 0;
219
+
220
+ const sendNonDisplayed = (reason) => {
221
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.notShown', reason);
222
+ return true;
223
+ };
224
+
225
+ if (sessionShowCounter > showWidgetSetting.showTimesInSession && sendNonDisplayed('timesPerSession') || // Не более N раз в сессию
226
+ (showWidgetSetting.showTimesInRow > 0 && daysShowCounter > showWidgetSetting.showTimesInRow && sendNonDisplayed('timesPerDays')) ||// Не более N раз в M дней
227
+ (showWidgetSetting.closeTimesInRow > 0 && daysCloseCounter >= showWidgetSetting.closeTimesInRow && sendNonDisplayed('closedTimesPerDays')) || // Не более N закрытий в M дней
228
+ (showWidgetSetting.closeTimesInTotal > 0 && totalCloseCounter >= showWidgetSetting.closeTimesInTotal && sendNonDisplayed('closedTimes')) // Не более N закрытий всего
229
+ ) {
230
+ return;
231
+ }
232
+ }
233
+
234
+ if (this.onlyManual) {
235
+ popup.className = 'hidden';
236
+ return;
237
+ }
238
+
239
+ if (this.config.displayOptions && (this.config.displayOptions.onTimeout || this.config.displayOptions.onLeave)) {
240
+ let telemetryFlag = false;
241
+
242
+ if (this.config.displayOptions.onTimeout && showOnDevice(this.showWidgetSetting)) {
243
+ setTimeout(() => {
244
+ if (popup.className.indexOf('closed') === -1 && !telemetryFlag) {
245
+ telemetryFlag = true;
246
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'timeout');
183
247
  }
248
+ popup.className = popup.className.indexOf('closed') === -1 ? "" : popup.className;
249
+ }, +this.config.displayOptions.timeoutDelay * 1000);
250
+ }
184
251
 
185
- if (this.config.displayOptions && (this.config.displayOptions.onTimeout || this.config.displayOptions.onLeave)) {
186
- let telemetryFlag = false;
187
- if (this.config.displayOptions.onTimeout) {
188
- setTimeout(() => {
189
- if(popup.className.indexOf('closed') === -1 && !telemetryFlag){
190
- telemetryFlag = true;
191
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'timeout');
192
- }
193
- popup.className = popup.className.indexOf('closed') === -1 ? "" : popup.className;
194
- }, +this.config.displayOptions.timeoutDelay * 1000);
195
- }
196
- if (this.config.displayOptions.onLeave) {
197
- document.addEventListener('mousemove', (e) => {
198
- if (e.clientY < 50) {
199
- if(popup.className.indexOf('closed') === -1 && !telemetryFlag){
200
- telemetryFlag = true;
201
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'onLeave');
202
- }
203
- popup.className = popup.className.indexOf('closed') === -1 ? "" : popup.className;
204
- }
205
- });
206
- }
252
+ if (this.config.displayOptions.onLeave && showOnDevice(this.showWidgetSetting)) {
253
+ document.addEventListener('mousemove', (e) => {
254
+ if (e.clientY < 50) {
255
+ if (popup.className.indexOf('closed') === -1 && !telemetryFlag) {
256
+ telemetryFlag = true;
257
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'onLeave');
258
+ }
259
+ popup.className = popup.className.indexOf('closed') === -1 ? "" : popup.className;
207
260
  }
261
+ });
208
262
  }
263
+ }
209
264
  }
210
265
 
211
- get header() {
212
- if (this.config.markUp && this.config.markUp.header && this.config.markUp.header.value) {
213
- var color = this.config.markUp.header.color ? 'style="color: ' + this.config.markUp.header.color + '"' : undefined;
214
- var result = '';
266
+ if (this.config.displayMode === "corner-popup" && showOnDevice(this.showWidgetSetting)) {
267
+ const popupControlButtonElem = this.element.querySelector('tb-widget-corner-popup-button');
268
+ const popupElem = popupControlButtonElem.parentElement;
269
+ const popupTooltipContainer = popupElem.querySelector('tb-widget-corner-popup-tooltip-container');
270
+ const fullscreenCloseButtonElem = popupElem.querySelector('.tb-fullscreen-close-rectangle .tb-icon-close');
215
271
 
216
- result += '<tb-widget-header-line ' + color + ' class="tb-widget-header-line">' + this.config.markUp.header.value + '</tb-widget-header-line>';
272
+ fullscreenCloseButtonElem.addEventListener('click', (e) => {
273
+ popupElem.classList.remove('tb-opened-corner-popup');
274
+ });
217
275
 
218
- return '<tb-widget-header-container>' + result + '</tb-widget-header-container>';
219
- }
220
- else {
221
- return '';
222
- }
276
+ popupControlButtonElem.addEventListener('click', (e) => {
277
+ popupElem.classList.toggle('tb-opened-corner-popup');
278
+ });
223
279
 
280
+ popupElem.addEventListener('wahunter-success', (e) => {
281
+ popupTooltipContainer.style.display = 'none';
282
+ });
224
283
  }
284
+ }
225
285
 
226
- get description() {
227
- if (this.config.markUp && this.config.markUp.description && this.config.markUp.description.value) {
228
- var color = this.config.markUp.description.color ? 'style="color: ' + this.config.markUp.description.color + '"' : undefined;
229
- var result = '';
286
+ get header() {
287
+ if (this.config.markUp && this.config.markUp.header && this.config.markUp.header.value) {
288
+ var color = this.config.markUp.header.color ? 'style="color: ' + this.config.markUp.header.color + '"' : undefined;
289
+ var result = '';
230
290
 
231
- result += '<tb-widget-description-line ' + color + ' class="tb-widget-description-line">' + this.config.markUp.description.value + '</tb-widget-description-line>'
291
+ result += '<tb-widget-header-line ' + color + ' class="tb-widget-header-line">' + this.config.markUp.header.value + '</tb-widget-header-line>';
232
292
 
233
- return '<tb-widget-description-container>' + result + '</tb-widget-description-container>';
234
- }
235
- else {
236
- return '';
237
- }
293
+ return '<tb-widget-header-container>' + result + '</tb-widget-header-container>';
294
+ } else {
295
+ return '';
296
+ }
297
+ }
238
298
 
299
+ get description() {
300
+ if (this.config.markUp && this.config.markUp.description && this.config.markUp.description.value) {
301
+ var color = this.config.markUp.description.color ? 'style="color: ' + this.config.markUp.description.color + '"' : undefined;
302
+ var result = '';
303
+
304
+ result += '<tb-widget-description-line ' + color + ' class="tb-widget-description-line">' + this.config.markUp.description.value + '</tb-widget-description-line>'
305
+
306
+ return '<tb-widget-description-container>' + result + '</tb-widget-description-container>';
307
+ }
308
+ else {
309
+ return '';
310
+ }
311
+ }
312
+
313
+ static iconPreset(val) {
314
+ switch (val) {
315
+ case 'widgetIconBell':
316
+ return iconBell;
317
+ case 'widgetIconBroadcast':
318
+ return iconBroadcast;
319
+ case 'widgetIconPaperPlane':
320
+ return iconPaperPlane;
239
321
  }
240
322
 
241
- static iconPreset(val) {
242
- switch (val) {
243
- case 'widgetIconBell':
244
- return iconBell;
245
- case 'widgetIconBroadcast':
246
- return iconBroadcast;
247
- case 'widgetIconPaperPlane':
248
- return iconPaperPlane;
249
- case 'text-back-badge':
250
- return iconTextBackBadge;
251
- }
323
+ }
252
324
 
325
+ get icon() {
326
+ if (this.config.markUp && this.config.markUp.icon && this.config.markUp.icon.type === "custom") {
327
+ return '<tb-notification-widget-icon_body>'
328
+ + '<img src="' + this.config.markUp.icon.url + '">'
329
+ + '</tb-notification-widget-icon_body>'
330
+ }
331
+ if (this.config.markUp && this.config.markUp.icon && this.config.markUp.icon.type === "preset") {
332
+ return '<tb-notification-widget-icon_body>'
333
+ + '<img src="' + Widget.iconPreset(this.config.markUp.icon.value) + '">'
334
+ + '</tb-notification-widget-icon_body>'
253
335
  }
336
+ else {
337
+ return '';
338
+ }
339
+ }
340
+
254
341
 
255
- get icon() {
256
- if (this.config.markUp && this.config.markUp.icon && this.config.markUp.icon.type === "custom") {
257
- return '<tb-notification-widget-icon_body>'
258
- + '<img src="' + this.config.markUp.icon.url + '">'
259
- + '</tb-notification-widget-icon_body>'
260
- }
261
- if (this.config.markUp && this.config.markUp.icon && this.config.markUp.icon.type === "preset") {
262
- return '<tb-notification-widget-icon_body>'
263
- + '<img src="' + Widget.iconPreset(this.config.markUp.icon.value) + '">'
264
- + '</tb-notification-widget-icon_body>'
265
- }
266
- else {
267
- return '';
268
- }
269
342
 
343
+ getTbBrandBadge({ displayMode, widgetKind }) {
344
+ const utmMedium = widgetKind === 'WAHUNTER' ? 'hunter' : 'widget-subscribe';
345
+
346
+ if (widgetKind === 'WAHUNTER') {
347
+ return `
348
+ <a target="_blank"
349
+ href="//textback.ru/?utm_source=TextBack_tool&utm_medium=${utmMedium}&utm_campaign=${window.location.origin}${window.location.pathname}&utm_content=${displayMode}
350
+
351
+ id="tb-notification-brand-badge"
352
+ style="${displayMode === 'inline' ? 'fill:inherit; color: inherit;' : ''}"
353
+ >
354
+ ${this.text('worksFor')} ${iconTbLogo}
355
+ </a>
356
+ `;
270
357
  }
271
358
 
272
- get pallet() {
273
- return this.config && this.config.markUp.body.palette && this.config.markUp.body.palette === "light" ? 'pallet-light' : 'pallet-dark'
359
+ return `
360
+ <a target="_blank"
361
+ href="//textback.ru/?utm_source=TextBack_tool&utm_medium=${utmMedium}&utm_campaign=${window.location.origin}${window.location.pathname}"
362
+
363
+ id="tb-notification-brand-badge"
364
+ style="${displayMode === 'inline' ? 'fill:inherit; color: inherit;' : ''}"
365
+ >
366
+ ${this.text('worksFor')} ${iconTbLogo}
367
+ </a>
368
+ `;
369
+ }
370
+
371
+
372
+ get image() {
373
+ if (!this.config.markUp.image || !this.config.markUp.image.show) return '';
374
+
375
+ return `
376
+ <tb-notification-widget-image style="background-image: url(${this.config.markUp.image.url})">
377
+ <img src="${this.config.markUp.image.url}">
378
+ </tb-notification-widget-image>
379
+ `;
380
+ }
381
+
382
+ get pallet() {
383
+ return this.config && this.config.markUp.body.palette && this.config.markUp.body.palette === "light" ? 'tb-pallet-light' : 'tb-pallet-dark'
384
+ }
385
+
386
+
387
+ get template() {
388
+ if (this.ready && this.config && this.config.displayMode) {
389
+ switch (this.config.displayMode) {
390
+ case 'popup':
391
+ return this.popupTemplate;
392
+ case 'inline':
393
+ return this.inlineTemplate;
394
+ case 'corner-popup':
395
+ return this.cornerPopupTemplate;
396
+ default:
397
+ return '';
398
+ }
399
+ } else if (this.error) {
400
+ console.warn(`could not render widget. reason: ${this.error}`);
274
401
  }
275
402
 
276
- get template() {
277
- if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
278
- this.element.className = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'tb-no-api-call' : '');
279
-
280
- const buttonsStyle = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'square' : 'rounded'),
281
- buttonsStyleClass = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'tb-btn-style-square' : 'tb-btn-style-rounded');
282
-
283
- var body = '';
284
- if (this.ready) {
285
- const channels = this.widget.getEnabledChannels();
286
- body = channels.map((channel, index) => {
287
- const item = assign({}, channel.config, {
288
- type: this.config.type,
289
- markUp: assign({}, this.config.markUp.buttons, { style: buttonsStyle }),
290
- });
291
- const attributes = stringifyAttributes({
292
- channel: item.channel,
293
- config: item,
294
- });
295
-
296
- return item.enabled ? `<div><tb-notification-button id="tb-notification-button-${index}" ${attributes}></tb-notification-button></div>` : '';
297
- }).join('');
298
- } else if (this.error) {
299
- console.warn('could not render widget. reason: ' + this.error);
300
- body = '';
301
- } else {
302
- body = '';
303
- }
403
+ return '';
404
+ }
304
405
 
305
- return `<tb-notification-widget-inner id="tb-notification-widget-inner" class="tb-notification-widget-inner"><tb-notification-widget-overlay class="hidden">
306
- <tb-notification-widget-popup class="${this.pallet}">
307
- <span id="tb-notification-widget-close" class="tb-notification-widget-close-icon">&times;</span>
308
- <a target="_blank" href="//textback.ru/?utm_source=${window.location.host}&utm_medium=link&utm_content=notify_widget_opened&utm_campaign=ref_ad">
309
- <img id="tb-notification-brand-badge" src="${Widget.iconPreset('text-back-badge')}">
310
- </a>
311
- ${this.icon}
312
- ${this.header}
313
- ${this.description}
314
- <div class="tb-widget-buttons tb-btn-align-center ${buttonsStyleClass}">${body}</div>
315
- </tb-notification-widget-popup>
316
- </tb-notification-widget-overlay></tb-notification-widget-inner>`;
317
-
318
- } else {
319
- if (this.ready) {
320
- this.element.className = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'tb-no-api-call' : '');
321
- const buttonsContainerClasses = (this.config.type === constants.WIDGET_TYPE_WIDGET
322
- ? this.getButtonsClasses()
323
- : 'tb-btn-style-rounded tb-btn-mode-horizontal tb-btn-align-left');
324
- // let
325
-
326
- const channels = this.widget.getEnabledChannels();
327
- const body = channels.map((channel, index) => {
328
- const item = assign({}, channel.config, { type: this.config.type, markUp: this.config.markUp.buttons });
329
- const attributes = stringifyAttributes({
330
- channel: item.channel,
331
- config: item,
332
- });
333
-
334
- if (item.enabled) {
335
- let html = `<tb-notification-button id="tb-notification-button-${index}" ${attributes}></tb-notification-button>`;
336
- if (this.config.markUp.buttons.displayMode === 'vertical') {
337
- html = `<div>${html}</div>`;
338
- }
339
- return html;
340
- } else {
341
- return '';
342
- }
343
- }).join('');
344
-
345
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.inline.show', 'displaySettings');
346
- return `<tb-notification-widget-inner id="tb-notification-widget-inner" class="tb-notification-widget-inner">
347
- <div class="tb-widget-buttons ${buttonsContainerClasses}">
348
- ${body}
349
- </div>
350
- </tb-notification-widget-inner>`;
351
- } else if (this.error) {
352
- console.warn('could not render widget. reason: ' + this.error);
353
- return '';
354
- } else {
355
- return ''
356
- }
406
+ get popupTemplate() {
407
+ this.element.className = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'tb-no-api-call' : '');
357
408
 
358
- }
409
+ const markUp = this.config.markUp;
410
+ const isPopupWithImage = markUp.image && markUp.image.show;
411
+
412
+ let imageUrlNotEmpty;
413
+ let popupStyleClass = this.pallet;
414
+
415
+ if (this.config.widgetKind === 'WAHUNTER' || isPopupWithImage) {
416
+ imageUrlNotEmpty = !!markUp.image.url.trim();
417
+ popupStyleClass += ` tb-popup-with-image tb-popup-${(markUp.image.align !== 'top' && imageUrlNotEmpty) ? 'horizontal' : 'vertical'}`;
359
418
  }
360
419
 
361
- static get tagName() {
362
- return 'tb-notification-widget';
420
+ if (this.config.widgetKind === 'WAHUNTER') {
421
+ let wahunterImageAlignClassName = `tb-nw-wahunter_${imageUrlNotEmpty ? ('image-align_' + markUp.image.align) : 'without-image'}`;
422
+
423
+ return `
424
+ <tb-notification-widget-inner id="tb-notification-widget-inner" class="tb-notification-widget-inner">
425
+ <tb-notification-widget-overlay class="hidden">
426
+ <tb-notification-widget-popup class="${popupStyleClass}">
427
+ <span id="tb-notification-widget-close" class="tb-notification-widget-close-icon">&times;</span>
428
+ ${this.getTbBrandBadge(this.config)}
429
+ <tb-nw-wahunter class="tb-nw-wahunter tb-nw-wahunter_mode_popup ${wahunterImageAlignClassName}"></tb-nw-wahunter>
430
+ </tb-notification-widget-popup>
431
+ </tb-notification-widget-overlay>
432
+ </tb-notification-widget-inner>
433
+ `;
363
434
  }
364
435
 
365
- static getWidget(widgetId) {
366
- return widgetsStorage.getWidget(widgetId);
436
+ const buttonsStyle = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'square' : 'rounded');
437
+ const buttonsStyleClass = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'tb-btn-style-square' : 'tb-btn-style-rounded');
438
+ let body = '';
439
+
440
+ const channels = this.widget.getEnabledChannels();
441
+
442
+ body = channels.map((channel, index) => {
443
+ const item = assign({}, channel.config, {
444
+ type: this.config.type,
445
+ markUp: assign({}, markUp.buttons, { style: buttonsStyle }),
446
+ });
447
+
448
+ const attributes = stringifyAttributes({
449
+ channel: item.channel,
450
+ config: item,
451
+ });
452
+
453
+ return item.enabled ? `<div><tb-notification-button id="tb-notification-button-${index}" ${attributes}></tb-notification-button></div>` : '';
454
+ }).join('');
455
+
456
+
457
+ let popupBodyStyleClass = 'tb-notification-widget-popup-body';
458
+
459
+ if (isPopupWithImage) {
460
+ popupBodyStyleClass += ` ${popupBodyStyleClass}_image-align_${imageUrlNotEmpty ? markUp.image.align : 'none'}`
367
461
  }
368
462
 
369
- show() {
370
- if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
371
- const popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
372
- if (popup.className.indexOf('hidden') !== -1 || popup.className.indexOf('closed')) {
373
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'manual');
374
- }
375
- popup.className = '';
463
+ return `
464
+ <tb-notification-widget-inner id="tb-notification-widget-inner" class="tb-notification-widget-inner">
465
+ <tb-notification-widget-overlay class="hidden">
466
+ <tb-notification-widget-popup class="${popupStyleClass}">
467
+ <span id="tb-notification-widget-close" class="tb-notification-widget-close-icon">&times;</span>
468
+ ${this.getTbBrandBadge(this.config)}
469
+ <tb-notification-widget-popup-body class="${popupBodyStyleClass}">
470
+ ${(markUp.image && markUp.image.show) ? this.image : this.icon}
471
+ <tb-notification-widget-popup-main>
472
+ ${this.header}
473
+ ${this.description}
474
+ <div class="tb-widget-buttons tb-btn-align-center ${buttonsStyleClass}">${body}</div>
475
+ </tb-notification-widget-popup-main>
476
+ </tb-notification-widget-popup-body>
477
+ </tb-notification-widget-popup>
478
+ </tb-notification-widget-overlay>
479
+ </tb-notification-widget-inner>
480
+ `;
481
+ }
482
+
483
+ get inlineTemplate() {
484
+
485
+ this.element.className = (this.config.type === constants.WIDGET_TYPE_WIDGET ? 'tb-no-api-call' : '');
486
+
487
+ const buttonsContainerClasses = this.config.type === constants.WIDGET_TYPE_WIDGET
488
+ ? this.getButtonsClasses()
489
+ : 'tb-btn-style-rounded tb-btn-mode-horizontal tb-btn-align-left';
490
+
491
+ const channels = this.widget.getEnabledChannels();
492
+
493
+ const body = channels.map((channel, index) => {
494
+ const item = assign({}, channel.config, { type: this.config.type, markUp: this.config.markUp.buttons });
495
+ const attributes = stringifyAttributes({
496
+ channel: item.channel,
497
+ config: item,
498
+ });
499
+
500
+ if (item.enabled) {
501
+ let html = `<tb-notification-button id="tb-notification-button-${index}" ${attributes}></tb-notification-button>`;
502
+ if (this.config.markUp.buttons.displayMode === 'vertical') {
503
+ html = `<div>${html}</div>`;
376
504
  }
505
+ return html;
506
+ } else {
507
+ return '';
508
+ }
509
+ }).join('');
510
+
511
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.inline.show', 'displaySettings');
512
+
513
+ if (this.config.widgetKind === 'WAHUNTER') {
514
+ return `
515
+ <tb-notification-widget-inner id="tb-notification-widget-inner" class="tb-notification-widget-inner">
516
+ <tb-nw-wahunter class="tb-nw-wahunter tb-nw-wahunter_mode_inline tb-nw-wahunter_inline-mode-align_${this.config.markUp.buttons.align}"></tb-nw-wahunter>
517
+ </tb-notification-widget-inner>
518
+ `;
377
519
  }
378
520
 
379
- showWithRules() {
380
- let showWidgetSetting = this.config.showWidgetSetting;
381
- let sessionShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_s_show_counter';
382
- let daysShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_show_counter';
383
- let daysCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_close_counter';
384
- let totalCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_total_close_counter';
521
+ return `
522
+ <tb-notification-widget-inner id="tb-notification-widget-inner" class="tb-notification-widget-inner">
523
+ <div class="tb-widget-buttons ${buttonsContainerClasses}">
524
+ ${body}
525
+ </div>
526
+ </tb-notification-widget-inner>
527
+ `;
528
+ }
529
+
530
+ get cornerPopupTemplate() {
531
+ const markUp = this.config.markUp;
532
+
533
+ if (this.config.widgetKind === 'WAHUNTER') {
534
+ return `
535
+ <tb-notification-widget-inner id="tb-notification-widget-inner" class="tb-notification-widget-inner">
536
+ <tb-notification-widget-corner-popup>
537
+ <tb-widget-corner-popup-window class="${this.pallet}">
538
+ <div class="tb-fullscreen-close-rectangle">
539
+ ${iconClose}
540
+ </div>
541
+ <tb-nw-wahunter class="tb-nw-wahunter tb-nw-wahunter_mode_corner-popup"></tb-nw-wahunter>
542
+ ${this.getTbBrandBadge(this.config)}
543
+ </tb-widget-corner-popup-window>
544
+ <tb-widget-corner-popup-button style="background: ${markUp.wahunterButton.color}">
545
+ ${iconChatWindow}
546
+ ${iconClose}
547
+ </tb-widget-corner-popup-button>
548
+ <tb-widget-corner-popup-tooltip-container
549
+ class="${markUp.description.showOnMobile ? 'tb-widget-corner-popup-tooltip-container_show-on-mobile' : ''}"
550
+ style="${markUp.description.value.trim() ? '' : 'display:none'}"
551
+ >
552
+ <tb-widget-corner-popup-tooltip style="color:${markUp.description.color}">\
553
+ ${markUp.description.value}\
554
+ </tb-widget-corner-popup-tooltip>
555
+ <tb-widget-corner-popup-tooltip-arrow />
556
+ </tb-widget-corner-popup-tooltip-container>
557
+ </tb-notification-widget-corner-popup>
558
+ </tb-notification-widget-inner>
559
+ `;
560
+ }
385
561
 
386
- if (showWidgetSetting) {
387
- if (!showWidgetSetting.showIfSubscribed && this.widgetSubscriptions.length > 0) {
388
- return false;
389
- }
562
+ return '';
563
+ }
390
564
 
391
- let daysTimeout = showWidgetSetting.showAfterDays * constants.SECONDS_IN_DAY;
392
- let sessionTimeout = showWidgetSetting.showSessionLength * 60;
393
- let daysShowCounter = cookiesEx.incrementIntCookie(daysShowCounterName, daysTimeout);
394
- let sessionShowCounter = cookiesEx.incrementIntCookie(sessionShowCounterName, sessionTimeout);
395
- let daysCloseCounter = cookiesEx.getIntCookie(daysCloseCounterName) || 0;
396
- let totalCloseCounter = cookiesEx.getIntCookie(totalCloseCounterName) || 0;
397
-
398
- if (sessionShowCounter > showWidgetSetting.showTimesInSession ||
399
- (showWidgetSetting.showTimesInRow > 0 && daysShowCounter > showWidgetSetting.showTimesInRow) ||
400
- (showWidgetSetting.closeTimesInRow > 0 && daysCloseCounter >= showWidgetSetting.closeTimesInRow) ||
401
- (showWidgetSetting.closeTimesInTotal > 0 && totalCloseCounter >= showWidgetSetting.closeTimesInTotal)) {
402
- return false;
403
- }
404
- }
565
+ static get tagName() {
566
+ return 'tb-notification-widget';
567
+ }
405
568
 
406
- if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
407
- const popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
408
- if (popup.className.indexOf('hidden') !== -1 || popup.className.indexOf('closed')) {
409
- appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'manual');
410
- }
411
- popup.className = '';
412
- return popup;
413
- }
569
+ static getWidget(widgetId) {
570
+ return widgetsStorage.getWidget(widgetId);
571
+ }
572
+
573
+ show() {
574
+ if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
575
+ const popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
576
+ if (popup.className.indexOf('hidden') !== -1 || popup.className.indexOf('closed')) {
577
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'manual');
578
+ }
579
+ popup.className = '';
580
+ }
581
+ }
582
+
583
+ showWithRules() {
584
+ let showWidgetSetting = this.config.showWidgetSetting;
585
+ let sessionShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_s_show_counter';
586
+ let daysShowCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_show_counter';
587
+ let daysCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_days_close_counter';
588
+ let totalCloseCounterName = constants.COOKIE_NAME_PREFIX + this.widgetId + '_total_close_counter';
414
589
 
590
+ if (showWidgetSetting) {
591
+ if (!showWidgetSetting.showIfSubscribed && this.widgetSubscriptions.length > 0) {
415
592
  return false;
593
+ }
594
+
595
+ let daysTimeout = showWidgetSetting.showAfterDays * constants.SECONDS_IN_DAY;
596
+ let sessionTimeout = showWidgetSetting.showSessionLength * 60;
597
+ let daysShowCounter = cookiesEx.incrementIntCookie(daysShowCounterName, daysTimeout);
598
+ let sessionShowCounter = cookiesEx.incrementIntCookie(sessionShowCounterName, sessionTimeout);
599
+ let daysCloseCounter = cookiesEx.getIntCookie(daysCloseCounterName) || 0;
600
+ let totalCloseCounter = cookiesEx.getIntCookie(totalCloseCounterName) || 0;
601
+
602
+ if (sessionShowCounter > showWidgetSetting.showTimesInSession ||
603
+ (showWidgetSetting.showTimesInRow > 0 && daysShowCounter > showWidgetSetting.showTimesInRow) ||
604
+ (showWidgetSetting.closeTimesInRow > 0 && daysCloseCounter >= showWidgetSetting.closeTimesInRow) ||
605
+ (showWidgetSetting.closeTimesInTotal > 0 && totalCloseCounter >= showWidgetSetting.closeTimesInTotal)) {
606
+ return false;
607
+ }
416
608
  }
417
609
 
418
- hide() {
419
- if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
420
- const popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
421
- if (popup.className.indexOf('hidden') !== -1) {
422
- popup.className += 'hidden';
423
- }
424
- }
610
+ if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
611
+ const popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
612
+ if (popup.className.indexOf('hidden') !== -1 || popup.className.indexOf('closed')) {
613
+ appInsights.trackWidgetEvent(this.config.id, 'notificationWidget.popup.show', 'manual');
614
+ }
615
+ popup.className = '';
616
+ return popup;
425
617
  }
426
618
 
427
- getButtonsClasses() {
428
- console.log(this.config);
429
- const classes = [];
619
+ return false;
620
+ }
430
621
 
431
- if (this.config.markUp && this.config.markUp.buttons) {
432
- const markUp = this.config.markUp.buttons;
433
- classes.push( getButtonsStyleClass(markUp.style) );
434
- classes.push( getButtonsAlignmentClass(markUp.align) );
435
- classes.push( getButtonsDisplayModeClass(markUp.displayMode) );
436
- }
622
+ hide() {
623
+ if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
624
+ const popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
625
+ if (popup.className.indexOf('hidden') !== -1) {
626
+ popup.className += 'hidden';
627
+ }
628
+ }
629
+ }
437
630
 
438
- function getButtonsStyleClass(style) {
439
- const prefix = 'tb-btn-style';
440
- switch (style) {
441
- case 'rounded':
442
- return `${prefix}-rounded`;
443
- case 'icons':
444
- return `${prefix}-icons`;
445
- default:
446
- return `${prefix}-square`;
447
- }
448
- }
631
+ getButtonsClasses() {
632
+ const classes = [];
449
633
 
450
- function getButtonsAlignmentClass(align) {
451
- const prefix = 'tb-btn-align';
452
- switch (align) {
453
- case 'left':
454
- return `${prefix}-left`;
455
- case 'right':
456
- return `${prefix}-right`;
457
- default:
458
- return `${prefix}-center`;
459
- }
460
- }
634
+ if (this.config.markUp && this.config.markUp.buttons) {
635
+ const markUp = this.config.markUp.buttons;
636
+ classes.push(getButtonsStyleClass(markUp.style));
637
+ classes.push(getButtonsAlignmentClass(markUp.align));
638
+ classes.push(getButtonsDisplayModeClass(markUp.displayMode));
639
+ }
461
640
 
462
- function getButtonsDisplayModeClass(mode) {
463
- const prefix = 'tb-btn-mode';
464
- if (mode === 'vertical') {
465
- return `${prefix}-vertical`;
466
- } else {
467
- return `${prefix}-horizontal`;
468
- }
469
- }
641
+ function getButtonsStyleClass(style) {
642
+ const prefix = 'tb-btn-style';
643
+ switch (style) {
644
+ case 'rounded':
645
+ return `${prefix}-rounded`;
646
+ case 'icons':
647
+ return `${prefix}-icons`;
648
+ case 'gradient':
649
+ return `${prefix}-gradient`;
650
+ default:
651
+ return `${prefix}-square`;
652
+ }
653
+ }
470
654
 
471
- return classes.join(' ');
655
+ function getButtonsAlignmentClass(align) {
656
+ const prefix = 'tb-btn-align';
657
+ switch (align) {
658
+ case 'left':
659
+ return `${prefix}-left`;
660
+ case 'right':
661
+ return `${prefix}-right`;
662
+ default:
663
+ return `${prefix}-center`;
664
+ }
472
665
  }
666
+
667
+ function getButtonsDisplayModeClass(mode) {
668
+ const prefix = 'tb-btn-mode';
669
+ if (mode === 'vertical') {
670
+ return `${prefix}-vertical`;
671
+ } else {
672
+ return `${prefix}-horizontal`;
673
+ }
674
+ }
675
+
676
+ return classes.join(' ');
677
+ }
473
678
  };