@textback/notification-widget 2.0.0 → 2.0.1-102913

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 (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
  };