@textback/notification-widget 2.0.0-9450 → 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 (113) hide show
  1. package/.eslintrc.js +291 -291
  2. package/build/index.js +6 -3
  3. package/build/sdk.js +3 -3
  4. package/package.json +11 -8
  5. package/promote_tag.sh +1 -1
  6. package/{README.md → readme.md} +569 -490
  7. package/server.js +134 -134
  8. package/src/libraries/ai.1.0.11.js +4088 -4088
  9. package/src/libraries/localization/getLocale.js +17 -0
  10. package/src/libraries/localization/locales/.tern-port +1 -0
  11. package/src/libraries/localization/locales/cs.js +23 -0
  12. package/src/libraries/localization/locales/en.js +23 -0
  13. package/src/libraries/localization/locales/index.js +9 -0
  14. package/src/libraries/localization/locales/pl.js +23 -0
  15. package/src/libraries/localization/locales/ro.js +23 -0
  16. package/src/libraries/localization/locales/ru.js +22 -0
  17. package/src/libraries/localization/locales/uk.js +23 -0
  18. package/src/libraries/localization/text.js +9 -0
  19. package/src/libraries/t.js +82 -82
  20. package/src/sdk/channels/channel.js +30 -30
  21. package/src/sdk/channels/facebook.js +13 -13
  22. package/src/sdk/channels/factory.js +3 -3
  23. package/src/sdk/channels/skype.js +12 -12
  24. package/src/sdk/channels/telegram.js +18 -13
  25. package/src/sdk/channels/viber.js +12 -12
  26. package/src/sdk/channels/vk-modal/vk-modal.html +17 -17
  27. package/src/sdk/channels/vk-modal/vk-modal.js +25 -25
  28. package/src/sdk/channels/vk-modal/vk-modal.scss +116 -116
  29. package/src/sdk/channels/vk.js +195 -173
  30. package/src/sdk/channels/whatsapp.js +20 -11
  31. package/src/sdk/channels/whatsappb.js +27 -0
  32. package/src/sdk/events/observer.js +46 -46
  33. package/src/sdk/index.js +5 -5
  34. package/src/sdk/sdk.js +67 -30
  35. package/src/sdk/utils/apiErrorHandler.js +11 -11
  36. package/src/sdk/utils/appInsights.js +88 -88
  37. package/src/sdk/utils/browserInfo.js +8 -8
  38. package/src/sdk/utils/constants.js +17 -17
  39. package/src/sdk/utils/cookies.js +67 -50
  40. package/src/sdk/utils/find.js +7 -7
  41. package/src/sdk/utils/loadConfig.js +20 -20
  42. package/src/sdk/utils/loadDeepLink.js +48 -21
  43. package/src/sdk/utils/loadScript.js +25 -25
  44. package/src/sdk/utils/loadSubscriptions.js +6 -6
  45. package/src/sdk/utils/parseQueryString.js +33 -33
  46. package/src/sdk/utils/windowHelper.js +25 -0
  47. package/src/sdk/widget/widget.js +192 -140
  48. package/src/widget/components/index.js +6 -2
  49. package/src/widget/components/tb-notification-button/facebook.js +9 -2
  50. package/src/widget/components/tb-notification-button/index.js +34 -34
  51. package/src/widget/components/tb-notification-button/styles.scss +657 -433
  52. package/src/widget/components/tb-notification-button/telegram.js +9 -2
  53. package/src/widget/components/tb-notification-button/viber.js +9 -2
  54. package/src/widget/components/tb-notification-button/vk.js +60 -47
  55. package/src/widget/components/tb-notification-button/whatsapp.js +15 -8
  56. package/src/widget/components/tb-notification-button/whatsappb.js +58 -0
  57. package/src/widget/components/tb-notification-widget/index.js +597 -353
  58. package/src/widget/components/tb-notification-widget/normalize.scss +395 -394
  59. package/src/widget/components/tb-notification-widget/styles.scss +514 -136
  60. package/src/widget/components/tb-nw-wahunter/index.js +259 -0
  61. package/src/widget/components/tb-nw-wahunter/styles.scss +471 -0
  62. package/src/widget/config.js +5 -5
  63. package/src/widget/icons/icon_chat_window.svg +1 -0
  64. package/src/widget/icons/icon_close.svg +1 -0
  65. package/src/widget/icons/icon_facebook.svg +7 -7
  66. package/src/widget/icons/icon_facebook_circle.svg +7 -9
  67. package/src/widget/icons/icon_instagram_circle.svg +95 -95
  68. package/src/widget/icons/icon_skype.svg +44 -44
  69. package/src/widget/icons/icon_skype_circle.svg +46 -46
  70. package/src/widget/icons/icon_skype_new.svg +113 -113
  71. package/src/widget/icons/icon_tg.svg +25 -25
  72. package/src/widget/icons/icon_tg_circle.svg +17 -27
  73. package/src/widget/icons/icon_viber.svg +75 -75
  74. package/src/widget/icons/icon_viber_circle.svg +67 -77
  75. package/src/widget/icons/icon_viber_new.svg +102 -102
  76. package/src/widget/icons/icon_vk.svg +14 -14
  77. package/src/widget/icons/icon_vk_circle.svg +16 -16
  78. package/src/widget/icons/icon_whatsapp.svg +147 -147
  79. package/src/widget/icons/icon_whatsapp_circle.svg +4 -123
  80. package/src/widget/icons/icon_whatsapp_hollow.svg +128 -0
  81. package/src/widget/icons/icon_whatsapp_new.svg +127 -127
  82. package/src/widget/icons/icon_whatsappb.svg +147 -0
  83. package/src/widget/icons/icon_whatsappb_circle.svg +4 -0
  84. package/src/widget/icons/icon_whatsappb_new.svg +127 -0
  85. package/src/widget/icons/paper-plane-arrow.svg +3 -0
  86. package/src/widget/icons/tb-logo.svg +21 -0
  87. package/src/widget/index.js +28 -28
  88. package/src/widget/locales/cs.js +42 -0
  89. package/src/widget/locales/en.js +42 -20
  90. package/src/widget/locales/index.js +2 -2
  91. package/src/widget/locales/pl.js +41 -19
  92. package/src/widget/locales/ro.js +41 -20
  93. package/src/widget/locales/ru.js +40 -19
  94. package/src/widget/locales/uk.js +40 -19
  95. package/src/widget/utils/cookiesEx.js +41 -41
  96. package/src/widget/utils/getLocale.js +4 -2
  97. package/src/widget/utils/stringifyAttributes.js +19 -19
  98. package/src/widget/utils/text.js +2 -1
  99. package/src/widget/utils/widgetsStorage.js +28 -28
  100. package/src/widget/widget.entry.js +3 -4
  101. package/tests/gf.html +35 -35
  102. package/tests/gf.js +21 -21
  103. package/tests/index.js +61 -61
  104. package/views/examples.ejs +7 -3
  105. package/views/sdk.html +274 -256
  106. package/webpack.common.js +72 -72
  107. package/webpack.dev.js +15 -15
  108. package/webpack.prod.js +10 -17
  109. package/build/index.js.map +0 -1
  110. package/build/sdk.js.map +0 -1
  111. package/src/widget/components/tb-notification-button/skype.js +0 -47
  112. package/src/widget/icons/text-back-badge.png +0 -0
  113. 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,422 +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
- document.getElementById("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
+ }
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>'
238
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>'
335
+ }
336
+ else {
337
+ return '';
253
338
  }
339
+ }
254
340
 
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
341
 
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="close">&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
- hide() {
380
- if (this.config && this.config.displayMode && this.config.displayMode === "popup") {
381
- const popup = this.element.getElementsByTagName("tb-notification-widget-overlay")[0];
382
- if (popup.className.indexOf('hidden') !== -1) {
383
- popup.className += 'hidden';
384
- }
385
- }
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
+ `;
386
560
  }
387
561
 
388
- getButtonsClasses() {
389
- console.log(this.config);
390
- const classes = [];
562
+ return '';
563
+ }
391
564
 
392
- if (this.config.markUp && this.config.markUp.buttons) {
393
- const markUp = this.config.markUp.buttons;
394
- classes.push( getButtonsStyleClass(markUp.style) );
395
- classes.push( getButtonsAlignmentClass(markUp.align) );
396
- classes.push( getButtonsDisplayModeClass(markUp.displayMode) );
397
- }
565
+ static get tagName() {
566
+ return 'tb-notification-widget';
567
+ }
398
568
 
399
- function getButtonsStyleClass(style) {
400
- const prefix = 'tb-btn-style';
401
- switch (style) {
402
- case 'rounded':
403
- return `${prefix}-rounded`;
404
- case 'icons':
405
- return `${prefix}-icons`;
406
- default:
407
- return `${prefix}-square`;
408
- }
409
- }
569
+ static getWidget(widgetId) {
570
+ return widgetsStorage.getWidget(widgetId);
571
+ }
410
572
 
411
- function getButtonsAlignmentClass(align) {
412
- const prefix = 'tb-btn-align';
413
- switch (align) {
414
- case 'left':
415
- return `${prefix}-left`;
416
- case 'right':
417
- return `${prefix}-right`;
418
- default:
419
- return `${prefix}-center`;
420
- }
421
- }
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';
589
+
590
+ if (showWidgetSetting) {
591
+ if (!showWidgetSetting.showIfSubscribed && this.widgetSubscriptions.length > 0) {
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
+ }
608
+ }
422
609
 
423
- function getButtonsDisplayModeClass(mode) {
424
- const prefix = 'tb-btn-mode';
425
- if (mode === 'vertical') {
426
- return `${prefix}-vertical`;
427
- } else {
428
- return `${prefix}-horizontal`;
429
- }
430
- }
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;
617
+ }
431
618
 
432
- return classes.join(' ');
619
+ return false;
620
+ }
621
+
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
+ }
433
628
  }
434
- };
629
+ }
630
+
631
+ getButtonsClasses() {
632
+ const classes = [];
633
+
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
+ }
640
+
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
+ }
654
+
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
+ }
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
+ }
678
+ };