web-manager 3.2.54 → 3.2.57

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 (2) hide show
  1. package/index.js +1452 -1382
  2. package/package.json +3 -3
package/index.js CHANGED
@@ -133,1603 +133,1673 @@ function Manager() {
133
133
  store = self.storage();
134
134
  }
135
135
 
136
- /**
137
- * METHODS
138
- */
139
- Manager.prototype.get = function(path) {
140
- var self = this;
136
+ /**
137
+ * METHODS
138
+ */
139
+ Manager.prototype.get = function(path) {
140
+ var self = this;
141
141
 
142
- return utilities.get(self, 'properties.' + path);
143
- }
142
+ return utilities.get(self, 'properties.' + path);
143
+ }
144
144
 
145
- Manager.prototype.set = function(path, value) {
146
- var self = this;
145
+ Manager.prototype.set = function(path, value) {
146
+ var self = this;
147
147
 
148
- return utilities.set(self, 'properties.' + path, value);
149
- }
148
+ return utilities.set(self, 'properties.' + path, value);
149
+ }
150
150
 
151
- Manager.prototype.setEventListeners = function() {
152
- var self = this;
153
-
154
- // Setup click handler
155
- document.addEventListener('click', function (event) {
156
- var target = event.target;
157
-
158
- // auth events
159
- if (target.matches('.auth-signin-email-btn')) {
160
- self.auth().signIn('email');
161
- } else if (target.matches('.auth-signup-email-btn')) {
162
- self.auth().signUp('email');
163
- } else if (target.matches('.auth-signin-provider-btn')) {
164
- self.auth().signIn(target.getAttribute('data-provider'));
165
- } else if (target.matches('.auth-signup-provider-btn')) {
166
- self.auth().signUp(target.getAttribute('data-provider'));
167
- } else if (target.matches('.auth-signout-all-btn')) {
168
- self.auth().signOut();
169
- } else if (target.matches('.auth-forgot-email-btn')) {
170
- self.auth().forgot();
171
- } else if (target.matches('#prechat-btn')) {
172
- load_chatsy(self, self.properties.options);
173
- } else if (target.matches('.auth-subscribe-notifications-btn')) {
174
- self.notifications().subscribe()
175
- } else if (target.matches('.master-alert-close')) {
176
- target.parentElement.setAttribute('hidden', true);
177
- }
151
+ Manager.prototype.setEventListeners = function() {
152
+ var self = this;
178
153
 
179
- // Autorequest
180
- if (!self._notificationRequested && self.properties.options.pushNotifications.autoRequest) {
181
- self._notificationRequested = true;
154
+ // Setup click handler
155
+ document.addEventListener('click', function (event) {
156
+ var target = event.target;
157
+
158
+ // auth events
159
+ if (target.matches('.auth-signin-email-btn')) {
160
+ self.auth().signIn('email');
161
+ } else if (target.matches('.auth-signup-email-btn')) {
162
+ self.auth().signUp('email');
163
+ } else if (target.matches('.auth-signin-provider-btn')) {
164
+ self.auth().signIn(target.getAttribute('data-provider'));
165
+ } else if (target.matches('.auth-signup-provider-btn')) {
166
+ self.auth().signUp(target.getAttribute('data-provider'));
167
+ } else if (target.matches('.auth-signout-all-btn')) {
168
+ self.auth().signOut();
169
+ } else if (target.matches('.auth-forgot-email-btn')) {
170
+ self.auth().forgot();
171
+ } else if (target.matches('#prechat-btn')) {
172
+ load_chatsy(self, self.properties.options);
173
+ } else if (target.matches('.auth-subscribe-notifications-btn')) {
174
+ self.notifications().subscribe()
175
+ } else if (target.matches('.master-alert-close')) {
176
+ target.parentElement.setAttribute('hidden', true);
177
+ }
182
178
 
183
- setTimeout(function () {
184
- self.notifications().subscribe()
185
- }, self.properties.options.pushNotifications.autoRequest * 1000);
186
- }
179
+ // Autorequest
180
+ if (!self._notificationRequested && self.properties.options.pushNotifications.autoRequest) {
181
+ self._notificationRequested = true;
187
182
 
188
- });
189
-
190
- // Mouse leave event
191
- document.addEventListener('mouseleave', function () {
192
- showExitPopup(self);
193
- });
194
-
195
- // Window blur event
196
- window.addEventListener('blur', function () {
197
- showExitPopup(self);
198
- });
199
-
200
- // Re-focus events
201
- window.addEventListener('focus', function () {
202
- refreshNewVersion(self);
203
- });
204
- window.addEventListener('online', function () {
205
- refreshNewVersion(self);
206
- });
207
- setInterval(function () {
208
- refreshNewVersion(self);
209
- }, 1000 * 60 * 60); // Fetch new version every 1 hour
183
+ setTimeout(function () {
184
+ self.notifications().subscribe()
185
+ }, self.properties.options.pushNotifications.autoRequest * 1000);
186
+ }
187
+
188
+ });
189
+
190
+ // Mouse leave event
191
+ document.addEventListener('mouseleave', function () {
192
+ showExitPopup(self);
193
+ });
194
+
195
+ // Window blur event
196
+ window.addEventListener('blur', function () {
197
+ showExitPopup(self);
198
+ });
199
+
200
+ // Re-focus events
201
+ window.addEventListener('focus', function () {
202
+ refreshNewVersion(self);
203
+ });
204
+ window.addEventListener('online', function () {
205
+ refreshNewVersion(self);
206
+ });
207
+ setInterval(function () {
208
+ refreshNewVersion(self);
209
+ }, 1000 * 60 * 60); // Fetch new version every 1 hour
210
210
 
211
+ }
212
+
213
+ function _authStateHandler(self, user) {
214
+ // self.log('----authStateHandler', user);
215
+ if (!user || user.isAnonymous) {
216
+ return _authHandle_out(self);
211
217
  }
212
218
 
213
- function _authStateHandler(self, user) {
214
- // self.log('----authStateHandler', user);
215
- if (!user || user.isAnonymous) {
216
- return _authHandle_out(self);
217
- }
219
+ _authHandle_in_normal(self, user);
218
220
 
219
- _authHandle_in_normal(self, user);
221
+ self.notifications().subscribe().catch(function (e) {
222
+ console.error(e);
223
+ });
224
+ }
220
225
 
221
- self.notifications().subscribe().catch(function (e) {
222
- console.error(e);
223
- });
226
+ // MOVED TO UJ - 12/15/23
227
+ // function _authHandle_in(self, user) {
228
+ // // self.log('_authHandle_in', user);
229
+ // // if (self.properties.page.status.didSignUp) {
230
+ // var done;
231
+ // var hoursSinceCreation = Math.abs(new Date() - new Date(+user.metadata.createdAt)) / 36e5;
232
+
233
+ // function _done() {
234
+ // if (!done) {
235
+ // done = true;
236
+ // store.set('didSignUp', true)
237
+ // _authHandle_in_normal(self, user);
238
+ // }
239
+ // }
240
+
241
+ // if (!store.get('didSignUp') && hoursSinceCreation < 0.5) {
242
+ // user.getIdToken(false)
243
+ // .then(function(token) {
244
+
245
+ // fetch('https://us-central1-' + self.properties.options.libraries.firebase_app.config.projectId + '.cloudfunctions.net/bm_api', {
246
+ // method: 'POST',
247
+ // body: JSON.stringify({
248
+ // authenticationToken: token,
249
+ // command: 'user:sign-up',
250
+ // payload: {
251
+ // newsletterSignUp: select('.auth-newsletter-input').getValue(),
252
+ // // affiliateCode: store.get('auth.affiliateCode', ''),
253
+ // affiliateCode: store.get('affiliateCode', ''),
254
+ // },
255
+ // }),
256
+ // })
257
+ // .catch(function () {})
258
+ // .finally(_done);
259
+
260
+ // setTimeout(function () {
261
+ // _done()
262
+ // }, 5000);
263
+
264
+ // })
265
+ // .catch(function(error) {
266
+ // console.error(error);
267
+ // _done();
268
+ // });
269
+ // } else {
270
+ // _done();
271
+ // }
272
+ // }
273
+
274
+
275
+
276
+ function _authHandle_in_normal(self, user) {
277
+ var returnUrl = self.properties.page.queryString.get('auth_redirect');
278
+
279
+ // Check if we have a return URL and it is valid
280
+ if (returnUrl && self.isValidRedirectUrl(returnUrl)) {
281
+ window.location.href = decodeURIComponent(returnUrl);
282
+ return;
224
283
  }
225
284
 
226
- // MOVED TO UJ - 12/15/23
227
- // function _authHandle_in(self, user) {
228
- // // self.log('_authHandle_in', user);
229
- // // if (self.properties.page.status.didSignUp) {
230
- // var done;
231
- // var hoursSinceCreation = Math.abs(new Date() - new Date(+user.metadata.createdAt)) / 36e5;
232
-
233
- // function _done() {
234
- // if (!done) {
235
- // done = true;
236
- // store.set('didSignUp', true)
237
- // _authHandle_in_normal(self, user);
238
- // }
239
- // }
240
-
241
- // if (!store.get('didSignUp') && hoursSinceCreation < 0.5) {
242
- // user.getIdToken(false)
243
- // .then(function(token) {
244
-
245
- // fetch('https://us-central1-' + self.properties.options.libraries.firebase_app.config.projectId + '.cloudfunctions.net/bm_api', {
246
- // method: 'POST',
247
- // body: JSON.stringify({
248
- // authenticationToken: token,
249
- // command: 'user:sign-up',
250
- // payload: {
251
- // newsletterSignUp: select('.auth-newsletter-input').getValue(),
252
- // // affiliateCode: store.get('auth.affiliateCode', ''),
253
- // affiliateCode: store.get('affiliateCode', ''),
254
- // },
255
- // }),
256
- // })
257
- // .catch(function () {})
258
- // .finally(_done);
259
-
260
- // setTimeout(function () {
261
- // _done()
262
- // }, 5000);
263
-
264
- // })
265
- // .catch(function(error) {
266
- // console.error(error);
267
- // _done();
268
- // });
269
- // } else {
270
- // _done();
271
- // }
272
- // }
273
-
274
-
275
-
276
- function _authHandle_in_normal(self, user) {
277
- var returnUrl = self.properties.page.queryString.get('auth_redirect');
278
- if (returnUrl && self.isValidRedirectUrl(returnUrl)) {
279
- window.location.href = decodeURIComponent(returnUrl);
280
- return;
281
- }
282
- if (self.properties.options.auth.state === 'prohibited') {
283
- window.location.href = self.properties.options.auth.sends.prohibited;
284
- return;
285
- }
286
- select('.auth-signedin-true-element').show();
287
- select('.auth-signedin-false-element').hide();
288
- select('.auth-email-element').each(function(e, i) {
289
- if (e.tagName === 'INPUT') {
290
- select(e).setValue(user.email)
291
- } else {
292
- select(e).setInnerHTML(user.email)
293
- }
294
- });
295
- select('.auth-uid-element').each(function(e, i) {
296
- if (e.tagName === 'INPUT') {
297
- select(e).setValue(user.uid)
298
- } else {
299
- select(e).setInnerHTML(user.uid)
300
- }
301
- });
285
+ // If auth is prohibited, redirect to the prohibited page
286
+ if (self.properties.options.auth.state === 'prohibited') {
287
+ window.location.href = self.properties.options.auth.sends.prohibited;
288
+ return;
302
289
  }
303
290
 
304
- function _authHandle_out(self) {
305
- if (self.properties.options.auth.state === 'required') {
306
- var sendSplit = self.properties.options.auth.sends.required.split('?');
307
- var newQuery = new URLSearchParams(sendSplit[1]);
308
- newQuery.set('auth_redirect', window.location.href);
309
- window.location.href = sendSplit[0] + '?' + newQuery.toString();
310
- return;
291
+ // Handle visibility
292
+ // select('.auth-signedin-true-element').show();
293
+ // select('.auth-signedin-false-element').hide();
294
+ select('.auth-signedin-true-element').each(function ($el) {
295
+ var $el2 = select($el);
296
+ $el2.show();
297
+
298
+ console.warn('DEPRECATED: auth-signedin-true-element', $el);
299
+ });
300
+ select('.auth-signedin-false-element').each(function ($el) {
301
+ var $el2 = select($el);
302
+ $el2.hide();
303
+
304
+ console.warn('DEPRECATED: auth-signedin-false-element', $el);
305
+ });
306
+ _authHandleState(self, 'signed-in');
307
+
308
+ // Set user email
309
+ select('.auth-email-element').each(function(e, i) {
310
+ if (e.tagName === 'INPUT') {
311
+ select(e).setValue(user.email)
312
+ } else {
313
+ select(e).setInnerHTML(user.email)
314
+ }
315
+ });
316
+
317
+ // Set user id
318
+ select('.auth-uid-element').each(function(e, i) {
319
+ if (e.tagName === 'INPUT') {
320
+ select(e).setValue(user.uid)
321
+ } else {
322
+ select(e).setInnerHTML(user.uid)
311
323
  }
324
+ });
325
+ }
312
326
 
313
- select('.auth-signedin-true-element').hide();
314
- select('.auth-signedin-false-element').show();
327
+ function _authHandle_out(self) {
328
+ // If auth is required, redirect to the required page
329
+ if (self.properties.options.auth.state === 'required') {
330
+ var sendSplit = self.properties.options.auth.sends.required.split('?');
331
+ var newQuery = new URLSearchParams(sendSplit[1]);
332
+ newQuery.set('auth_redirect', window.location.href);
333
+ window.location.href = sendSplit[0] + '?' + newQuery.toString();
334
+ return;
315
335
  }
316
336
 
317
- Manager.prototype.ready = function(fn, options) {
318
- var self = this;
319
- var waitFor = true;
337
+ // select('.auth-signedin-true-element').hide();
338
+ // select('.auth-signedin-false-element').show();
339
+ select('.auth-signedin-true-element').each(function ($el) {
340
+ var $el2 = select($el);
341
+ $el2.hide();
320
342
 
321
- options = options || {};
322
- options.interval = options.interval || 100;
343
+ console.warn('DEPRECATED: auth-signedin-true-element', $el);
344
+ });
345
+ select('.auth-signedin-false-element').each(function ($el) {
346
+ var $el2 = select($el);
347
+ $el2.show();
323
348
 
324
- waitFor = !options.waitFor || (options.waitFor && options.waitFor())
349
+ console.warn('DEPRECATED: auth-signedin-false-element', $el);
350
+ });
325
351
 
326
- if (!utilities.get(this, 'properties.page.status.ready', false) || !waitFor) {
327
- setTimeout(function () {
328
- self.ready(fn, options);
329
- }, options.interval);
330
- } else {
331
- // Performance
332
- self.performance().mark('manager_ready');
352
+ _authHandleState(self, 'signed-out');
353
+ }
333
354
 
334
- return fn();
355
+ function _authHandleState(self, state) {
356
+ var $stateAll = select('.auth-state-listener');
357
+
358
+ // Loop through all elements with the class and hide first
359
+ $stateAll
360
+ .each(function ($el) {
361
+ $el.setAttribute('hidden', true);
362
+ })
363
+
364
+ // Loop through all elements with the class and check the data-state attribute
365
+ $stateAll
366
+ .each(function ($el) {
367
+ var s = $el.getAttribute('data-state');
368
+
369
+ // If we are in the correct status
370
+ if (s !== state) {
371
+ // Hide the element
372
+ return $el.setAttribute('hidden', true);
335
373
  }
374
+
375
+ // Show the element
376
+ $el.removeAttribute('hidden');
377
+ })
378
+ }
379
+
380
+ Manager.prototype.ready = function(fn, options) {
381
+ var self = this;
382
+ var waitFor = true;
383
+
384
+ options = options || {};
385
+ options.interval = options.interval || 100;
386
+
387
+ waitFor = !options.waitFor || (options.waitFor && options.waitFor())
388
+
389
+ if (!utilities.get(this, 'properties.page.status.ready', false) || !waitFor) {
390
+ setTimeout(function () {
391
+ self.ready(fn, options);
392
+ }, options.interval);
393
+ } else {
394
+ // Performance
395
+ self.performance().mark('manager_ready');
396
+
397
+ return fn();
336
398
  }
399
+ }
337
400
 
338
- Manager.prototype.serviceWorker = function() {
339
- var self = this;
340
- var SWAvailable = 'serviceWorker' in navigator;
401
+ Manager.prototype.serviceWorker = function() {
402
+ var self = this;
403
+ var SWAvailable = 'serviceWorker' in navigator;
341
404
 
342
- if (SWAvailable) {
343
- try {
344
- var swref = self.properties.references.serviceWorker.active || navigator.serviceWorker.controller;
345
- } catch (e) {}
346
- }
405
+ if (SWAvailable) {
406
+ try {
407
+ var swref = self.properties.references.serviceWorker.active || navigator.serviceWorker.controller;
408
+ } catch (e) {}
409
+ }
347
410
 
348
- return {
349
- postMessage: function() {
350
- // var args = getArgs(arguments);
351
- var args = arguments;
352
- if (!SWAvailable) {return};
353
-
354
- try {
355
- var messageChannel = new MessageChannel();
356
- messageChannel.port1.onmessage = function(event) {
357
- if (!event.data.error && args[1]) {
358
- args[1](event.data);
359
- }
360
- };
361
- // navigator.serviceWorker.controller.postMessage(args[0], [messageChannel.port2]);
362
- swref.postMessage(args[0], [messageChannel.port2]);
363
- } catch (e) {
364
- console.error(e);
365
- }
411
+ return {
412
+ postMessage: function() {
413
+ // var args = getArgs(arguments);
414
+ var args = arguments;
415
+ if (!SWAvailable) {return};
366
416
 
367
- // if (!navigator.serviceWorker.controller) {
368
- // self.log('postMessage...');
369
- // setTimeout(function () {
370
- // self.serviceWorker().postMessage(args[0], args[1]);
371
- // }, 100);
372
- // } else {
373
- // // post message: https://stackoverflow.com/questions/30177782/chrome-serviceworker-postmessage
374
- // var messageChannel = new MessageChannel();
375
- // messageChannel.port1.onmessage = function(event) {
376
- // if (!event.data.error && args[1]) {
377
- // args[1](event.data);
378
- // }
379
- // };
380
- // navigator.serviceWorker.controller.postMessage(args[0], [messageChannel.port2])
381
- // }
417
+ try {
418
+ var messageChannel = new MessageChannel();
419
+ messageChannel.port1.onmessage = function(event) {
420
+ if (!event.data.error && args[1]) {
421
+ args[1](event.data);
422
+ }
423
+ };
424
+ // navigator.serviceWorker.controller.postMessage(args[0], [messageChannel.port2]);
425
+ swref.postMessage(args[0], [messageChannel.port2]);
426
+ } catch (e) {
427
+ console.error(e);
382
428
  }
429
+
430
+ // if (!navigator.serviceWorker.controller) {
431
+ // self.log('postMessage...');
432
+ // setTimeout(function () {
433
+ // self.serviceWorker().postMessage(args[0], args[1]);
434
+ // }, 100);
435
+ // } else {
436
+ // // post message: https://stackoverflow.com/questions/30177782/chrome-serviceworker-postmessage
437
+ // var messageChannel = new MessageChannel();
438
+ // messageChannel.port1.onmessage = function(event) {
439
+ // if (!event.data.error && args[1]) {
440
+ // args[1](event.data);
441
+ // }
442
+ // };
443
+ // navigator.serviceWorker.controller.postMessage(args[0], [messageChannel.port2])
444
+ // }
383
445
  }
384
446
  }
447
+ }
385
448
 
386
- // init with polyfills
387
- Manager.prototype.init = function(configuration, callback) {
388
- var self = this;
389
- var status = self.properties.page.status;
390
-
391
- if (
392
- !status.ready
393
- && !status.initilizing
394
- ) {
395
-
396
- // Performance
397
- self.performance().mark('manager_init');
398
-
399
- // set initializing to true
400
- self.properties.page.status.initializing = true;
401
-
402
- // set other properties
403
- self.properties.meta.environment = window.location.host.match(/:40|ngrok/)
404
- ? 'development'
405
- : 'production';
406
-
407
- // Load polyfills
408
- init_loadPolyfills(self, configuration, function() {
409
- self.properties.page.status.initializing = false;
410
- // self.properties.genericPromise = new Promise(resolve => { resolve() });
411
- var options_defaults = {
412
- // debug: {
413
- // environment: self.properties.meta.environment,
414
- // },
415
- // queryString: {
416
- // saveToStorage: false
417
- // },
418
- pushNotifications: {
419
- autoRequest: 60, // how long to wait before auto ask, 0 to disable
420
- },
421
- serviceWorker: {
422
- path: '',
423
- },
424
- initChecks: {
425
- features: [], // an array of javascript and dom features to check for (NIY)
449
+ // init with polyfills
450
+ Manager.prototype.init = function(configuration, callback) {
451
+ var self = this;
452
+ var status = self.properties.page.status;
453
+
454
+ if (
455
+ !status.ready
456
+ && !status.initilizing
457
+ ) {
458
+
459
+ // Performance
460
+ self.performance().mark('manager_init');
461
+
462
+ // set initializing to true
463
+ self.properties.page.status.initializing = true;
464
+
465
+ // set other properties
466
+ self.properties.meta.environment = window.location.host.match(/:40|ngrok/)
467
+ ? 'development'
468
+ : 'production';
469
+
470
+ // Load polyfills
471
+ init_loadPolyfills(self, configuration, function() {
472
+ self.properties.page.status.initializing = false;
473
+ // self.properties.genericPromise = new Promise(resolve => { resolve() });
474
+ var options_defaults = {
475
+ // debug: {
476
+ // environment: self.properties.meta.environment,
477
+ // },
478
+ // queryString: {
479
+ // saveToStorage: false
480
+ // },
481
+ pushNotifications: {
482
+ autoRequest: 60, // how long to wait before auto ask, 0 to disable
483
+ },
484
+ serviceWorker: {
485
+ path: '',
486
+ },
487
+ initChecks: {
488
+ features: [], // an array of javascript and dom features to check for (NIY)
489
+ },
490
+ auth: {
491
+ state: 'default', // required, prohibited, default
492
+ sends: {
493
+ required: '/signup',
494
+ prohibited: '/',
426
495
  },
427
- auth: {
428
- state: 'default', // required, prohibited, default
429
- sends: {
430
- required: '/signup',
431
- prohibited: '/',
496
+ },
497
+ exitPopup: {
498
+ enabled: true,
499
+ config: {
500
+ timeout: 1000 * 60 * 60 * 4,
501
+ handler: null,
502
+ title: 'Special Offer!',
503
+ message: 'Get 15% off your purchase of our <strong>Premium plans</strong>. <br><br> Get access to all features and unlimited usage.',
504
+ okButton: {
505
+ text: 'Claim 15% Discount',
506
+ link: '/pricing?utm_source=exit-popup&utm_medium=popup&utm_campaign={pathname}',
432
507
  },
433
508
  },
434
- exitPopup: {
509
+ },
510
+ libraries: {
511
+ firebase_app: {
435
512
  enabled: true,
513
+ load: false,
436
514
  config: {
437
- timeout: 1000 * 60 * 60 * 4,
438
- handler: null,
439
- title: 'Special Offer!',
440
- message: 'Get 15% off your purchase of our <strong>Premium plans</strong>. <br><br> Get access to all features and unlimited usage.',
441
- okButton: {
442
- text: 'Claim 15% Discount',
443
- link: '/pricing?utm_source=exit-popup&utm_medium=popup&utm_campaign={pathname}',
444
- },
515
+ apiKey: '',
516
+ authDomain: '',
517
+ databaseURL: '',
518
+ projectId: '',
519
+ storageBucket: '',
520
+ messagingSenderId: '',
521
+ appId: '',
522
+ measurementId: '',
445
523
  },
446
524
  },
447
- libraries: {
448
- firebase_app: {
449
- enabled: true,
450
- load: false,
451
- config: {
452
- apiKey: '',
453
- authDomain: '',
454
- databaseURL: '',
455
- projectId: '',
456
- storageBucket: '',
457
- messagingSenderId: '',
458
- appId: '',
459
- measurementId: '',
460
- },
461
- },
462
- firebase_auth: {
463
- enabled: true,
464
- load: false,
465
- },
466
- firebase_firestore: {
467
- enabled: true,
468
- load: false,
469
- },
470
- firebase_messaging: {
471
- enabled: true,
472
- load: false,
473
- },
474
- firebase_appCheck: {
475
- enabled: true,
476
- load: false,
477
- config: {
478
- siteKey: '',
479
- },
480
- },
481
- lazysizes: {
482
- enabled: true,
525
+ firebase_auth: {
526
+ enabled: true,
527
+ load: false,
528
+ },
529
+ firebase_firestore: {
530
+ enabled: true,
531
+ load: false,
532
+ },
533
+ firebase_messaging: {
534
+ enabled: true,
535
+ load: false,
536
+ },
537
+ firebase_appCheck: {
538
+ enabled: true,
539
+ load: false,
540
+ config: {
541
+ siteKey: '',
483
542
  },
484
- sentry: {
485
- enabled: true,
486
- config: {
487
- dsn: '',
488
- release: '',
489
- replaysSessionSampleRate: 0.1,
490
- replaysOnErrorSampleRate: 1.0,
491
- },
543
+ },
544
+ lazysizes: {
545
+ enabled: true,
546
+ },
547
+ sentry: {
548
+ enabled: true,
549
+ config: {
550
+ dsn: '',
551
+ release: '',
552
+ replaysSessionSampleRate: 0.01,
553
+ replaysOnErrorSampleRate: 0.01,
492
554
  },
493
- chatsy: {
494
- enabled: true,
495
- config: {
496
- accountId: '',
497
- chatId: '',
498
- settings: {
499
- openChatButton: {
500
- background: '#237afc',
501
- text: '#fff',
502
- },
555
+ },
556
+ chatsy: {
557
+ enabled: true,
558
+ config: {
559
+ accountId: '',
560
+ chatId: '',
561
+ settings: {
562
+ openChatButton: {
563
+ background: '#237afc',
564
+ text: '#fff',
503
565
  },
504
566
  },
505
567
  },
506
- cookieconsent: {
507
- enabled: true,
508
- config: {
509
- palette: {
510
- popup: {
511
- background: '#237afc',
512
- text: '#fff',
513
- },
514
- button: {
515
- background: '#fff',
516
- text: '#237afc',
517
- },
568
+ },
569
+ cookieconsent: {
570
+ enabled: true,
571
+ config: {
572
+ palette: {
573
+ popup: {
574
+ background: '#237afc',
575
+ text: '#fff',
518
576
  },
519
- theme: 'classic',
520
- position: 'bottom-left',
521
- type: '',
522
- showLink: false,
523
- content: {
524
- message: 'We use cookies to ensure you get the best experience on our website. By continuing to use the site, you agree to our<a href="/terms" class="cc-link" style="padding-right: 0">terms of service</a>.',
525
- // dismiss: 'Got it!',
526
- dismiss: 'I understand',
577
+ button: {
578
+ background: '#fff',
579
+ text: '#237afc',
527
580
  },
528
581
  },
582
+ theme: 'classic',
583
+ position: 'bottom-left',
584
+ type: '',
585
+ showLink: false,
586
+ content: {
587
+ message: 'We use cookies to ensure you get the best experience on our website. By continuing to use the site, you agree to our<a href="/terms" class="cc-link" style="padding-right: 0">terms of service</a>.',
588
+ // dismiss: 'Got it!',
589
+ dismiss: 'I understand',
590
+ },
529
591
  },
530
592
  },
531
- };
593
+ },
594
+ };
532
595
 
533
- var options_user = {};
534
- function eachRecursive(obj, parent) {
535
- parent = (!parent) ? '' : parent;
596
+ var options_user = {};
597
+ function eachRecursive(obj, parent) {
598
+ parent = (!parent) ? '' : parent;
536
599
 
537
- for (var key in obj) {
538
- if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
539
- eachRecursive(obj[key], parent + key + '.');
540
- } else {
541
- utilities.set(options_user, parent + key, utilities.get(options_defaults, parent + key) );
542
- var t_globalItem = utilities.get(configuration, 'global.settings.' + parent + key, undefined);
543
- var t_pageItem = utilities.get(configuration, 'page.settings.' + parent + key, undefined);
544
- if (typeof t_globalItem !== 'undefined') {
545
- utilities.set(options_user, parent + key, t_globalItem);
546
- }
547
- if (typeof t_pageItem !== 'undefined') {
548
- utilities.set(options_user, parent + key, t_pageItem);
549
- }
600
+ for (var key in obj) {
601
+ if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
602
+ eachRecursive(obj[key], parent + key + '.');
603
+ } else {
604
+ utilities.set(options_user, parent + key, utilities.get(options_defaults, parent + key) );
605
+ var t_globalItem = utilities.get(configuration, 'global.settings.' + parent + key, undefined);
606
+ var t_pageItem = utilities.get(configuration, 'page.settings.' + parent + key, undefined);
607
+ if (typeof t_globalItem !== 'undefined') {
608
+ utilities.set(options_user, parent + key, t_globalItem);
609
+ }
610
+ if (typeof t_pageItem !== 'undefined') {
611
+ utilities.set(options_user, parent + key, t_pageItem);
550
612
  }
551
613
  }
552
614
  }
615
+ }
553
616
 
554
- eachRecursive(options_defaults);
555
- self.properties.options = options_user;
617
+ eachRecursive(options_defaults);
618
+ self.properties.options = options_user;
556
619
 
557
- // set non-option properties
558
- self.properties.global.app = configuration.global.app;
559
- self.properties.global.version = configuration.global.version;
560
- self.properties.global.url = configuration.global.url;
561
- self.properties.global.buildTime = new Date((+configuration.global.buildTime * 1000) || new Date())
562
- self.properties.global.cacheBreaker = configuration.global.cacheBreaker;
620
+ // set non-option properties
621
+ self.properties.global.app = configuration.global.app;
622
+ self.properties.global.version = configuration.global.version;
623
+ self.properties.global.url = configuration.global.url;
624
+ self.properties.global.buildTime = new Date((+configuration.global.buildTime * 1000) || new Date())
625
+ self.properties.global.cacheBreaker = configuration.global.cacheBreaker;
563
626
 
564
- self.properties.global.brand = configuration.global.brand;
565
- self.properties.global.contact = configuration.global.contact;
566
- self.properties.global.download = configuration.global.download;
567
- self.properties.global.extension = configuration.global.extension;
627
+ self.properties.global.brand = configuration.global.brand;
628
+ self.properties.global.contact = configuration.global.contact;
629
+ self.properties.global.download = configuration.global.download;
630
+ self.properties.global.extension = configuration.global.extension;
568
631
 
569
- self.properties.global.validRedirectHosts = configuration.global.validRedirectHosts;
570
- self.properties.meta.environment = utilities.get(configuration, 'global.settings.debug.environment', self.properties.meta.environment);
571
- self.properties.page.queryString = new URLSearchParams(window.location.search);
632
+ self.properties.global.validRedirectHosts = configuration.global.validRedirectHosts;
633
+ self.properties.meta.environment = utilities.get(configuration, 'global.settings.debug.environment', self.properties.meta.environment);
634
+ self.properties.page.queryString = new URLSearchParams(window.location.search);
572
635
 
573
- var pagePathname = window.location.pathname;
574
- var redirect = false;
636
+ var pagePathname = window.location.pathname;
637
+ var redirect = false;
575
638
 
576
- var previousUTMTimestamp = new Date(store.get('utm.timestamp', 0));
577
- var UTMDifferenceInHours = (new Date() - previousUTMTimestamp) / 36e5;
639
+ var previousUTMTimestamp = new Date(store.get('utm.timestamp', 0));
640
+ var UTMDifferenceInHours = (new Date() - previousUTMTimestamp) / 36e5;
578
641
 
579
- self.properties.page.queryString.forEach(function (value, key) {
580
- if (key.startsWith('utm_') && UTMDifferenceInHours > 72) {
581
- store.set('utm.tags.' + key, value);
582
- store.set('utm.timestamp', new Date().toISOString());
583
- }
642
+ self.properties.page.queryString.forEach(function (value, key) {
643
+ if (key.startsWith('utm_') && UTMDifferenceInHours > 72) {
644
+ store.set('utm.tags.' + key, value);
645
+ store.set('utm.timestamp', new Date().toISOString());
646
+ }
584
647
 
585
- if (key === 'aff') {
586
- store.set('affiliateCode', value);
587
- }
648
+ if (key === 'aff') {
649
+ store.set('affiliateCode', value);
650
+ }
588
651
 
589
- if (key === 'redirect') {
590
- // redirect = decodeURIComponent(value) // 9/22/23 - Removed this and replace without the decode
591
- redirect = value;
592
- }
652
+ if (key === 'redirect') {
653
+ // redirect = decodeURIComponent(value) // 9/22/23 - Removed this and replace without the decode
654
+ redirect = value;
655
+ }
656
+ })
657
+
658
+ // Redirect if we have a redirect query
659
+ if (redirect && self.isValidRedirectUrl(redirect)) {
660
+ return window.location.href = redirect;
661
+ }
662
+
663
+ // Detect if we are on a page that requires authentication
664
+ if (pagePathname.match(/\/(authentication-required|authentication-success|authentication-token|forgot|oauth2|signin|signout|signup)/)) {
665
+ import('./helpers/auth-pages.js')
666
+ .then(function(mod) {
667
+ mod.default()
593
668
  })
669
+ }
594
670
 
595
- if (redirect && self.isValidRedirectUrl(redirect)) {
596
- return window.location.href = redirect;
597
- }
671
+ // load critical libraries
672
+ function postCrucial() {
673
+ // console.log('HERE 5');
598
674
 
599
- if (pagePathname.match(/\/(authentication-required|authentication-success|authentication-token|forgot|oauth2|signin|signout|signup)/)) {
600
- import('./helpers/auth-pages.js')
601
- .then(function(mod) {
602
- mod.default()
675
+ // handle firebase user
676
+ if (typeof firebase !== 'undefined' && firebase.auth) {
677
+ firebase.auth().onAuthStateChanged(function(user) {
678
+ self.properties.page.status.authReady = true;
679
+ self.properties.auth.user = user || false;
680
+ _authStateHandler(self, user);
603
681
  })
604
682
  }
605
683
 
606
- // load critical libraries
607
- function postCrucial() {
608
- // console.log('HERE 5');
609
-
610
- // handle firebase user
611
- if (typeof firebase !== 'undefined' && firebase.auth) {
612
- firebase.auth().onAuthStateChanged(function(user) {
613
- self.properties.page.status.authReady = true;
614
- self.properties.auth.user = user || false;
615
- _authStateHandler(self, user);
616
- })
684
+ // setup
685
+ self.setEventListeners();
686
+
687
+ // display outdated if it is
688
+ try {
689
+ if (!self.properties.page.isSupportedBrowser) {
690
+ var box = document.getElementsByClassName('master-alert-outdated')[0];
691
+ box.removeAttribute('hidden');
617
692
  }
693
+ } catch (e) {
694
+ console.error(e);
695
+ }
618
696
 
619
- // setup
620
- self.setEventListeners();
697
+ // run the init callback
698
+ self.properties.page.status.ready = true;
621
699
 
622
- // display outdated if it is
623
- try {
624
- if (!self.properties.page.isSupportedBrowser) {
625
- var box = document.getElementsByClassName('master-alert-outdated')[0];
626
- box.removeAttribute('hidden');
627
- }
628
- } catch (e) {
629
- console.error(e);
630
- }
700
+ try {
701
+ callback();
702
+ } catch (e) {
703
+ console.error(e);
704
+ }
631
705
 
632
- // run the init callback
633
- self.properties.page.status.ready = true;
706
+ var chatsyOps = options_user.libraries.chatsy;
707
+ if (chatsyOps.enabled) {
708
+ var $preChatBtn = select('#prechat-btn');
709
+ var $preChatBtnSvg = select('#prechat-btn svg path');
710
+ var openChatButtonSettings = chatsyOps.config.settings.openChatButton;
634
711
 
635
- try {
636
- callback();
637
- } catch (e) {
638
- console.error(e);
712
+ $preChatBtn.css({
713
+ background: openChatButtonSettings.background,
714
+ })
715
+ .show();
716
+
717
+ $preChatBtnSvg.each(function ($el) {
718
+ $el.setAttribute('fill', openChatButtonSettings.text)
719
+ })
720
+
721
+ window.chatsy = {};
722
+ window.chatsy.open = function() {
723
+ $preChatBtn.get(0).click();
639
724
  }
725
+ }
640
726
 
641
- var chatsyOps = options_user.libraries.chatsy;
642
- if (chatsyOps.enabled) {
643
- var $preChatBtn = select('#prechat-btn');
644
- var $preChatBtnSvg = select('#prechat-btn svg path');
645
- var openChatButtonSettings = chatsyOps.config.settings.openChatButton;
727
+ // load non-critical libraries
728
+ load_lazysizes(self, options_user);
729
+ load_cookieconsent(self, options_user);
730
+ subscriptionManager(self, options_user);
646
731
 
647
- $preChatBtn.css({
648
- background: openChatButtonSettings.background,
649
- })
650
- .show();
732
+ // self.log('Manager', self);
733
+ return;
734
+ }
651
735
 
652
- $preChatBtnSvg.each(function ($el) {
653
- $el.setAttribute('fill', openChatButtonSettings.text)
654
- })
736
+ Promise.all([
737
+ load_sentry(self, options_user),
738
+ load_firebase(self, options_user),
739
+ ])
740
+ .then(function() {
741
+ postCrucial();
742
+ })
743
+ .catch(function (e) {
744
+ console.error('Lib error', e);
745
+ })
746
+ })
655
747
 
656
- window.chatsy = {};
657
- window.chatsy.open = function() {
658
- $preChatBtn.get(0).click();
659
- }
660
- }
748
+ } else {
749
+ return;
750
+ }
661
751
 
662
- // load non-critical libraries
663
- load_lazysizes(self, options_user);
664
- load_cookieconsent(self, options_user);
665
- subscriptionManager(self, options_user);
752
+ }
666
753
 
667
- // self.log('Manager', self);
668
- return;
669
- }
754
+ Manager.prototype.sentry = function() {
755
+ // var en = (Sentry && Sentry)
756
+ return {
757
+ configureScope: function (cb) {
758
+ try {
759
+ Sentry.configureScope(function (scope) {
760
+ cb(scope);
761
+ })
762
+ } catch (e) {
670
763
 
671
- Promise.all([
672
- load_sentry(self, options_user),
673
- load_firebase(self, options_user),
674
- ])
675
- .then(function() {
676
- postCrucial();
677
- })
678
- .catch(function (e) {
679
- console.error('Lib error', e);
680
- })
681
- })
764
+ }
765
+ },
766
+ captureException: function (e) {
767
+ try {
768
+ Sentry.captureException(e)
769
+ } catch (e) {
682
770
 
683
- } else {
684
- return;
771
+ }
685
772
  }
773
+ };
774
+ }
775
+
776
+ Manager.prototype.auth = function() {
777
+ var self = this;
778
+ var firebaseActive = typeof firebase !== 'undefined';
779
+ var $error = select('.auth-error-message-element');
686
780
 
781
+ function _displayError(msg) {
782
+ console.error(msg);
783
+ $error.show().setInnerHTML(msg);
784
+ }
785
+ function _preDisplayError() {
786
+ $error.hide().setInnerHTML('');
687
787
  }
688
788
 
689
- Manager.prototype.sentry = function() {
690
- // var en = (Sentry && Sentry)
691
- return {
692
- configureScope: function (cb) {
693
- try {
694
- Sentry.configureScope(function (scope) {
695
- cb(scope);
696
- })
697
- } catch (e) {
789
+ function setAuthButtonDisabled(button, status) {
790
+ var el = select('.auth-' + button + '-email-btn');
791
+ var disabled = 'disabled';
792
+ if (status) {
793
+ el.setAttribute(disabled, true);
794
+ } else {
795
+ el.removeAttribute(disabled);
796
+ }
797
+ }
698
798
 
699
- }
700
- },
701
- captureException: function (e) {
702
- try {
703
- Sentry.captureException(e)
704
- } catch (e) {
799
+ function selectAuthInput(mode, input) {
800
+ var prefix = '.auth-';
801
+ var inputSelector = prefix + input + '-input';
802
+ var formSelector = prefix + mode + '-form ';
803
+ var formInput = select(formSelector + inputSelector);
804
+ var input = select(inputSelector);
705
805
 
706
- }
707
- }
708
- };
806
+ return formInput.exists() ? formInput : input;
709
807
  }
710
808
 
711
- Manager.prototype.auth = function() {
712
- var self = this;
713
- var firebaseActive = typeof firebase !== 'undefined';
714
- var $error = select('.auth-error-message-element');
809
+ function resolveAuthInputValue(existing, mode, input) {
810
+ var result = existing || selectAuthInput(mode, input).getValue();
715
811
 
716
- function _displayError(msg) {
717
- console.error(msg);
718
- $error.show().setInnerHTML(msg);
719
- }
720
- function _preDisplayError() {
721
- $error.hide().setInnerHTML('');
722
- }
812
+ return input === 'email' ? result.trim().toLowerCase() : result;
813
+ }
723
814
 
724
- function setAuthButtonDisabled(button, status) {
725
- var el = select('.auth-' + button + '-email-btn');
726
- var disabled = 'disabled';
727
- if (status) {
728
- el.setAttribute(disabled, true);
729
- } else {
730
- el.removeAttribute(disabled);
815
+ function uxHandler(email, password, passwordConfirm, mode) {
816
+ if (!email) {
817
+ selectAuthInput(mode, 'email').get(0).focus();
818
+ } else {
819
+ selectAuthInput(mode, 'password').get(0).focus();
820
+ if (mode === 'signup') {
821
+ selectAuthInput(mode, 'password-confirm').get(0).focus();
731
822
  }
732
823
  }
824
+ }
733
825
 
734
- function selectAuthInput(mode, input) {
735
- var prefix = '.auth-';
736
- var inputSelector = prefix + input + '-input';
737
- var formSelector = prefix + mode + '-form ';
738
- var formInput = select(formSelector + inputSelector);
739
- var input = select(inputSelector);
826
+ return {
827
+ isAuthenticated: function () {
828
+ return firebaseActive ? !!firebase.auth().currentUser : false;
829
+ },
830
+ getUser: function () {
831
+ var defaultUser = {email: null, uid: null};
832
+ return firebaseActive ? firebase.auth().currentUser || defaultUser : defaultUser;
833
+ },
834
+ ready: function (fn, options) {
835
+ options = options || {};
836
+ options.interval = options.interval || 100;
740
837
 
741
- return formInput.exists() ? formInput : input;
742
- }
838
+ if (!utilities.get(self, 'properties.page.status.authReady', false)) {
839
+ setTimeout(function () {
840
+ self.auth().ready(fn, options);
841
+ }, options.interval);
842
+ } else {
743
843
 
744
- function resolveAuthInputValue(existing, mode, input) {
745
- var result = existing || selectAuthInput(mode, input).getValue();
844
+ // Set up listener for redirect (for provider login)
845
+ // @@@ DISABLED NOV 8, 2023
846
+ // if (!self._redirectResultSetup) {
847
+ // self._redirectResultSetup = true;
848
+ // firebase.auth()
849
+ // .getRedirectResult()
850
+ // .catch(function (error) {
851
+ // _displayError(error.message);
852
+ // });
853
+ // }
746
854
 
747
- return input === 'email' ? result.trim().toLowerCase() : result;
748
- }
855
+ // Performance
856
+ self.performance().mark('manager_authReady');
749
857
 
750
- function uxHandler(email, password, passwordConfirm, mode) {
751
- if (!email) {
752
- selectAuthInput(mode, 'email').get(0).focus();
858
+ return fn(self.auth().getUser());
859
+ }
860
+ },
861
+ signIn: function (method, email, password) {
862
+ var mode = 'signin';
863
+ method = method || 'email';
864
+ _preDisplayError();
865
+ // self.log('Signin attempt: ', method, email, password);
866
+ if (method === 'email') {
867
+ // email = (email || select('.auth-email-input').getValue()).trim().toLowerCase();
868
+ email = resolveAuthInputValue(email, mode, 'email');
869
+ // password = password || select('.auth-password-input').getValue();
870
+ password = resolveAuthInputValue(password, mode, 'password');
871
+ // console.log('Signin attempt: ', method, email, password);
872
+
873
+ // Handler
874
+ uxHandler(email, password, undefined, mode);
875
+
876
+ // signinButtonDisabled(true);
877
+ setAuthButtonDisabled(mode, true);
878
+
879
+ firebase.auth().signInWithEmailAndPassword(email, password)
880
+ .then(function(credential) {
881
+ // _postAuthSubscriptionCheck(self)
882
+ // .then(function () {
883
+ //
884
+ // })
885
+ self.properties.page.status.didSignIn = true;
886
+ // signinButtonDisabled(false);
887
+ setAuthButtonDisabled(mode, false);
888
+ // self.log('Good signin');
889
+ })
890
+ .catch(function(error) {
891
+ // signinButtonDisabled(false);
892
+ setAuthButtonDisabled(mode, false);
893
+ _displayError(error.message);
894
+ // self.log('Error', error.message);
895
+ });
753
896
  } else {
754
- selectAuthInput(mode, 'password').get(0).focus();
755
- if (mode === 'signup') {
756
- selectAuthInput(mode, 'password-confirm').get(0).focus();
757
- }
897
+ firebase.auth().signInWithRedirect(new firebase.auth.OAuthProvider(method))
898
+ .catch(function (e) {
899
+ _displayError(e);
900
+ })
901
+ }
902
+ },
903
+ signUp: function(method, email, password, passwordConfirm) {
904
+ var mode = 'signup';
905
+ method = method || 'email';
906
+
907
+ _preDisplayError();
908
+ // self.log('Signup attempt: ', method, email, password, passwordConfirm);
909
+ // var acceptedTerms
910
+ // var termEl = select('.auth-terms-input');
911
+ // if (termEl.exists() && !termEl.getValue() === true) {
912
+ // _displayError('Please review and accept our terms.');
913
+ // return;
914
+ // }
915
+ var termsSelector = '.auth-terms-input';
916
+ var termSpecificEl = select('.auth-signup-form ' + termsSelector)
917
+ var termGenericEl = select(termsSelector)
918
+ if ((termSpecificEl.exists() && !termSpecificEl.getValue() === true) || (termGenericEl.exists() && !termGenericEl.getValue() === true)) {
919
+ _displayError('Please review and accept our terms.');
920
+ return;
758
921
  }
759
- }
760
922
 
761
- return {
762
- isAuthenticated: function () {
763
- return firebaseActive ? !!firebase.auth().currentUser : false;
764
- },
765
- getUser: function () {
766
- var defaultUser = {email: null, uid: null};
767
- return firebaseActive ? firebase.auth().currentUser || defaultUser : defaultUser;
768
- },
769
- ready: function (fn, options) {
770
- options = options || {};
771
- options.interval = options.interval || 100;
772
-
773
- if (!utilities.get(self, 'properties.page.status.authReady', false)) {
774
- setTimeout(function () {
775
- self.auth().ready(fn, options);
776
- }, options.interval);
777
- } else {
923
+ if (method === 'email') {
924
+ // email = (email || select('.auth-email-input').getValue()).trim().toLowerCase();
925
+ email = resolveAuthInputValue(email, mode, 'email');
926
+ // password = password || select('.auth-password-input').getValue();
927
+ password = resolveAuthInputValue(password, mode, 'password');
928
+ // passwordConfirm = passwordConfirm || select('.auth-password-confirm-input').getValue();
929
+ passwordConfirm = resolveAuthInputValue(passwordConfirm, mode, 'password-confirm');
930
+ // console.log('Signup attempt: ', method, email, password, passwordConfirm);
778
931
 
779
- // Set up listener for redirect (for provider login)
780
- // @@@ DISABLED NOV 8, 2023
781
- // if (!self._redirectResultSetup) {
782
- // self._redirectResultSetup = true;
783
- // firebase.auth()
784
- // .getRedirectResult()
785
- // .catch(function (error) {
786
- // _displayError(error.message);
787
- // });
788
- // }
789
-
790
- // Performance
791
- self.performance().mark('manager_authReady');
792
-
793
- return fn(self.auth().getUser());
794
- }
795
- },
796
- signIn: function (method, email, password) {
797
- var mode = 'signin';
798
- method = method || 'email';
799
- _preDisplayError();
800
- // self.log('Signin attempt: ', method, email, password);
801
- if (method === 'email') {
802
- // email = (email || select('.auth-email-input').getValue()).trim().toLowerCase();
803
- email = resolveAuthInputValue(email, mode, 'email');
804
- // password = password || select('.auth-password-input').getValue();
805
- password = resolveAuthInputValue(password, mode, 'password');
806
- // console.log('Signin attempt: ', method, email, password);
807
-
808
- // Handler
809
- uxHandler(email, password, undefined, mode);
810
-
811
- // signinButtonDisabled(true);
812
- setAuthButtonDisabled(mode, true);
932
+ // Handler
933
+ uxHandler(email, password, passwordConfirm, mode);
813
934
 
814
- firebase.auth().signInWithEmailAndPassword(email, password)
935
+ if (password === passwordConfirm) {
936
+ // signupButtonDisabled(true);
937
+ setAuthButtonDisabled(mode, true);
938
+ firebase.auth().createUserWithEmailAndPassword(email, password)
815
939
  .then(function(credential) {
816
- // _postAuthSubscriptionCheck(self)
817
- // .then(function () {
818
- //
819
- // })
820
- self.properties.page.status.didSignIn = true;
821
- // signinButtonDisabled(false);
822
- setAuthButtonDisabled(mode, false);
823
- // self.log('Good signin');
940
+ // self.properties.page.status.didSignUp = true;
941
+ // self.log('Good signup');
942
+ // signupButtonDisabled(false);
824
943
  })
825
944
  .catch(function(error) {
826
- // signinButtonDisabled(false);
945
+ // signupButtonDisabled(false);
827
946
  setAuthButtonDisabled(mode, false);
828
947
  _displayError(error.message);
829
- // self.log('Error', error.message);
948
+ // self.log('error', error.message);
830
949
  });
831
950
  } else {
832
- firebase.auth().signInWithRedirect(new firebase.auth.OAuthProvider(method))
833
- .catch(function (e) {
834
- _displayError(e);
835
- })
951
+ _displayError("Passwords don't match.");
836
952
  }
837
- },
838
- signUp: function(method, email, password, passwordConfirm) {
839
- var mode = 'signup';
840
- method = method || 'email';
841
-
842
- _preDisplayError();
843
- // self.log('Signup attempt: ', method, email, password, passwordConfirm);
844
- // var acceptedTerms
845
- // var termEl = select('.auth-terms-input');
846
- // if (termEl.exists() && !termEl.getValue() === true) {
847
- // _displayError('Please review and accept our terms.');
848
- // return;
849
- // }
850
- var termsSelector = '.auth-terms-input';
851
- var termSpecificEl = select('.auth-signup-form ' + termsSelector)
852
- var termGenericEl = select(termsSelector)
853
- if ((termSpecificEl.exists() && !termSpecificEl.getValue() === true) || (termGenericEl.exists() && !termGenericEl.getValue() === true)) {
854
- _displayError('Please review and accept our terms.');
855
- return;
856
- }
857
-
858
- if (method === 'email') {
859
- // email = (email || select('.auth-email-input').getValue()).trim().toLowerCase();
860
- email = resolveAuthInputValue(email, mode, 'email');
861
- // password = password || select('.auth-password-input').getValue();
862
- password = resolveAuthInputValue(password, mode, 'password');
863
- // passwordConfirm = passwordConfirm || select('.auth-password-confirm-input').getValue();
864
- passwordConfirm = resolveAuthInputValue(passwordConfirm, mode, 'password-confirm');
865
- // console.log('Signup attempt: ', method, email, password, passwordConfirm);
866
-
867
- // Handler
868
- uxHandler(email, password, passwordConfirm, mode);
869
-
870
- if (password === passwordConfirm) {
871
- // signupButtonDisabled(true);
872
- setAuthButtonDisabled(mode, true);
873
- firebase.auth().createUserWithEmailAndPassword(email, password)
874
- .then(function(credential) {
875
- // self.properties.page.status.didSignUp = true;
876
- // self.log('Good signup');
877
- // signupButtonDisabled(false);
878
- })
879
- .catch(function(error) {
880
- // signupButtonDisabled(false);
881
- setAuthButtonDisabled(mode, false);
882
- _displayError(error.message);
883
- // self.log('error', error.message);
884
- });
885
- } else {
886
- _displayError("Passwords don't match.");
887
- }
888
- } else {
889
- self.auth().signIn(method);
890
- }
891
-
892
- },
893
- signOut: function() {
894
- // self.log('signOut()');
895
- // var self = this;
896
- return firebase.auth().signOut()
897
- .catch(function(e) {
898
- console.error(e);
899
- // self.log('signOut failed: ', error);
900
- });
901
- // return firebase.auth().signOut()
902
- // .then(function() {
903
- // // self.log('signOut success.');
904
- // })
905
- // .catch(function(e) {
906
- // // console.error(e);
907
- // // self.log('signOut failed: ', error);
908
- // });
909
- },
910
- forgot: function(email) {
911
- // self.log('forgot()');
912
- var mode = 'forgot';
913
- // email = email || select('.auth-email-input').getValue();
914
- email = resolveAuthInputValue(email, mode, 'email')
915
-
916
- // forgotButtonDisabled(true);
917
- setAuthButtonDisabled(mode, true);
918
- _preDisplayError();
953
+ } else {
954
+ self.auth().signIn(method);
955
+ }
919
956
 
920
- firebase.auth().sendPasswordResetEmail(email)
921
- .then(function() {
922
- // forgotButtonDisabled(false);
923
- setAuthButtonDisabled(mode, false);
924
- // self.log('forgot success.');
925
- _displayError('A reset link has been sent to you.');
926
- })
927
- .catch(function(error) {
928
- // forgotButtonDisabled(false);
929
- setAuthButtonDisabled(mode, false);
930
- // self.log('forgot failed: ', error);
931
- _displayError(error.message);
932
- });
933
- },
957
+ },
958
+ signOut: function() {
959
+ // self.log('signOut()');
960
+ // var self = this;
961
+ return firebase.auth().signOut()
962
+ .catch(function(e) {
963
+ console.error(e);
964
+ // self.log('signOut failed: ', error);
965
+ });
966
+ // return firebase.auth().signOut()
967
+ // .then(function() {
968
+ // // self.log('signOut success.');
969
+ // })
970
+ // .catch(function(e) {
971
+ // // console.error(e);
972
+ // // self.log('signOut failed: ', error);
973
+ // });
974
+ },
975
+ forgot: function(email) {
976
+ // self.log('forgot()');
977
+ var mode = 'forgot';
978
+ // email = email || select('.auth-email-input').getValue();
979
+ email = resolveAuthInputValue(email, mode, 'email')
980
+
981
+ // forgotButtonDisabled(true);
982
+ setAuthButtonDisabled(mode, true);
983
+ _preDisplayError();
984
+
985
+ firebase.auth().sendPasswordResetEmail(email)
986
+ .then(function() {
987
+ // forgotButtonDisabled(false);
988
+ setAuthButtonDisabled(mode, false);
989
+ // self.log('forgot success.');
990
+ _displayError('A reset link has been sent to you.');
991
+ })
992
+ .catch(function(error) {
993
+ // forgotButtonDisabled(false);
994
+ setAuthButtonDisabled(mode, false);
995
+ // self.log('forgot failed: ', error);
996
+ _displayError(error.message);
997
+ });
998
+ },
934
999
 
935
- }
936
1000
  }
1001
+ }
937
1002
 
938
- //@@@NOTIFICATIONS
939
- Manager.prototype.notifications = function(options) {
940
- var self = this;
941
- var supported = (typeof firebase.messaging !== 'undefined') && ('serviceWorker' in navigator) && ('Notification' in window);
942
-
943
- return {
944
- isSubscribed: function () {
945
- // self.log('isSubscribed()');
946
- return new Promise(function(resolve, reject) {
947
- if (!supported || Notification.permission !== 'granted') {return resolve(false)};
948
- return resolve(true);
1003
+ //@@@NOTIFICATIONS
1004
+ Manager.prototype.notifications = function(options) {
1005
+ var self = this;
1006
+ var supported = (typeof firebase.messaging !== 'undefined') && ('serviceWorker' in navigator) && ('Notification' in window);
1007
+
1008
+ return {
1009
+ isSubscribed: function () {
1010
+ // self.log('isSubscribed()');
1011
+ return new Promise(function(resolve, reject) {
1012
+ if (!supported || Notification.permission !== 'granted') {return resolve(false)};
1013
+ return resolve(true);
1014
+ })
1015
+ },
1016
+ subscribe: function () {
1017
+ // self.log('subscribe()');
1018
+ return new Promise(function(resolve, reject) {
1019
+ // var subscribed = !self.notifications().isSubscribed();
1020
+ if (!supported) {
1021
+ return resolve(false)
1022
+ }
1023
+ firebase.messaging().getToken({
1024
+ serviceWorkerRegistration: self.properties.references.serviceWorker,
949
1025
  })
950
- },
951
- subscribe: function () {
952
- // self.log('subscribe()');
953
- return new Promise(function(resolve, reject) {
954
- // var subscribed = !self.notifications().isSubscribed();
955
- if (!supported) {
956
- return resolve(false)
957
- }
958
- firebase.messaging().getToken({
959
- serviceWorkerRegistration: self.properties.references.serviceWorker,
960
- })
961
- .then(function (token) {
962
- var user = self.auth().getUser();
963
- var localSubscription = store.get('notifications', {});
964
- var localHash = localSubscription.token + '|' + localSubscription.uid;
965
- var userHash = token + '|' + user.uid;
966
- // console.log('user', user);
967
- // console.log('localHash', localHash);
968
- // console.log('userHash', userHash);
969
-
970
- // var override = false;
971
- var currentDate = new Date();
972
- var dateDifference = (currentDate.getTime() - new Date(localSubscription.lastSynced || 0).getTime()) / (1000 * 3600 * 24);
973
-
974
- // Run if local hash is different than the user hash OR it was last updated more than 1 day ago
975
- if (localHash !== userHash || dateDifference > 1) {
976
- var timestamp = currentDate.toISOString();
977
- var timestampUNIX = Math.floor((+new Date(timestamp)) / 1000);
978
- var subscriptionRef = firebase.firestore().doc('notifications/subscriptions/all/' + token);
979
-
980
- function saveLocal() {
981
- // console.log('---------saveLocal');
982
- // self.log('Saved local token: ', token);
983
- store.set('notifications', {uid: user.uid, token: token, lastSynced: timestamp});
984
- }
1026
+ .then(function (token) {
1027
+ var user = self.auth().getUser();
1028
+ var localSubscription = store.get('notifications', {});
1029
+ var localHash = localSubscription.token + '|' + localSubscription.uid;
1030
+ var userHash = token + '|' + user.uid;
1031
+ // console.log('user', user);
1032
+ // console.log('localHash', localHash);
1033
+ // console.log('userHash', userHash);
1034
+
1035
+ // var override = false;
1036
+ var currentDate = new Date();
1037
+ var dateDifference = (currentDate.getTime() - new Date(localSubscription.lastSynced || 0).getTime()) / (1000 * 3600 * 24);
1038
+
1039
+ // Run if local hash is different than the user hash OR it was last updated more than 1 day ago
1040
+ if (localHash !== userHash || dateDifference > 1) {
1041
+ var timestamp = currentDate.toISOString();
1042
+ var timestampUNIX = Math.floor((+new Date(timestamp)) / 1000);
1043
+ var subscriptionRef = firebase.firestore().doc('notifications/subscriptions/all/' + token);
1044
+
1045
+ function saveLocal() {
1046
+ // console.log('---------saveLocal');
1047
+ // self.log('Saved local token: ', token);
1048
+ store.set('notifications', {uid: user.uid, token: token, lastSynced: timestamp});
1049
+ }
985
1050
 
986
- function saveServer(doc) {
987
- // console.log('-------saveServer', !doc.exists, !self.utilities().get(doc.data(), 'link.user.data.uid', ''), user.uid);
988
- // Run if it (DOES NOT EXIST on server) OR (it does AND the uid field is null AND the current user is not null)
989
- if (!doc.exists || (doc.exists && !self.utilities().get(doc.data(), 'link.user.data.uid', '') && user.uid)) {
990
- subscriptionRef
991
- .set(
992
- {
993
- meta: {
994
- dateSubscribed: {
1051
+ function saveServer(doc) {
1052
+ // console.log('-------saveServer', !doc.exists, !self.utilities().get(doc.data(), 'link.user.data.uid', ''), user.uid);
1053
+ // Run if it (DOES NOT EXIST on server) OR (it does AND the uid field is null AND the current user is not null)
1054
+ if (!doc.exists || (doc.exists && !self.utilities().get(doc.data(), 'link.user.data.uid', '') && user.uid)) {
1055
+ subscriptionRef
1056
+ .set(
1057
+ {
1058
+ meta: {
1059
+ dateSubscribed: {
1060
+ timestamp: timestamp,
1061
+ timestampUNIX: timestampUNIX
1062
+ },
1063
+ url: window.location.href,
1064
+ },
1065
+ token: token,
1066
+ link: {
1067
+ user: {
1068
+ lastLinked: {
995
1069
  timestamp: timestamp,
996
1070
  timestampUNIX: timestampUNIX
997
1071
  },
998
- url: window.location.href,
999
- },
1000
- token: token,
1001
- link: {
1002
- user: {
1003
- lastLinked: {
1004
- timestamp: timestamp,
1005
- timestampUNIX: timestampUNIX
1006
- },
1007
- pk: user.uid,
1008
- data: {
1009
- uid: user.uid,
1010
- email: user.email
1011
- }
1072
+ pk: user.uid,
1073
+ data: {
1074
+ uid: user.uid,
1075
+ email: user.email
1012
1076
  }
1013
- },
1014
- tags: ['general']
1077
+ }
1015
1078
  },
1016
- {
1017
- merge: true
1018
- }
1019
- )
1020
- .then(function(data) {
1021
- // self.log('Updated token: ', token);
1022
- saveLocal();
1023
- resolve(true);
1024
- })
1025
- } else {
1079
+ tags: ['general']
1080
+ },
1081
+ {
1082
+ merge: true
1083
+ }
1084
+ )
1085
+ .then(function(data) {
1086
+ // self.log('Updated token: ', token);
1026
1087
  saveLocal();
1027
- // self.log('Skip sync, server data exists.');
1028
- resolve(false);
1029
- }
1088
+ resolve(true);
1089
+ })
1090
+ } else {
1091
+ saveLocal();
1092
+ // self.log('Skip sync, server data exists.');
1093
+ resolve(false);
1030
1094
  }
1031
-
1032
- // Get the doc first and then run a check to see if it needs to be updated
1033
- subscriptionRef
1034
- .get()
1035
- .then(function (doc) {
1036
- saveServer(doc);
1037
- })
1038
- .catch(function () {
1039
- saveServer({exists: false})
1040
- })
1041
- } else {
1042
- // self.log('Skip sync, recently done.');
1043
- resolve(false);
1044
1095
  }
1045
1096
 
1046
- })
1047
- .catch(function (e) {
1048
- reject(e);
1049
- })
1097
+ // Get the doc first and then run a check to see if it needs to be updated
1098
+ subscriptionRef
1099
+ .get()
1100
+ .then(function (doc) {
1101
+ saveServer(doc);
1102
+ })
1103
+ .catch(function () {
1104
+ saveServer({exists: false})
1105
+ })
1106
+ } else {
1107
+ // self.log('Skip sync, recently done.');
1108
+ resolve(false);
1109
+ }
1110
+
1050
1111
  })
1051
- }
1112
+ .catch(function (e) {
1113
+ reject(e);
1114
+ })
1115
+ })
1052
1116
  }
1053
1117
  }
1118
+ }
1054
1119
 
1055
- /*
1056
- HELPERS
1057
- */
1058
- function subscriptionManager(self, options_user) {
1059
- if (
1060
- !('serviceWorker' in navigator)
1061
- || (typeof firebase === 'undefined')
1062
- || (typeof firebase.messaging === 'undefined')
1063
- ) {
1064
- return
1120
+ /*
1121
+ HELPERS
1122
+ */
1123
+ function subscriptionManager(self, options_user) {
1124
+ if (
1125
+ !('serviceWorker' in navigator)
1126
+ || (typeof firebase === 'undefined')
1127
+ || (typeof firebase.messaging === 'undefined')
1128
+ ) {
1129
+ return
1130
+ }
1131
+
1132
+ // service worker guide: https://developers.google.com/web/updates/2018/06/fresher-sw
1133
+ navigator.serviceWorker.register(
1134
+ '/' + (options_user.serviceWorker.path || 'master-service-worker.js')
1135
+ + '?config=' + encodeURIComponent(JSON.stringify({
1136
+ name: self.properties.global.brand.name,
1137
+ app: self.properties.global.app,
1138
+ env: self.properties.meta.environment,
1139
+ v: self.properties.global.version,
1140
+ cb: self.properties.global.cacheBreaker,
1141
+ firebase: options_user.libraries.firebase_app.config
1142
+ }))
1143
+ )
1144
+ .then(function (registration) {
1145
+ // firebase.messaging().useServiceWorker(registration);
1146
+ self.properties.references.serviceWorker = registration;
1147
+
1148
+ // TODO: https://googlechrome.github.io/samples/service-worker/post-message/
1149
+ // --- leverage this example ^^^ for caching! It's grat and you can do one page at a time through postMessage!
1150
+
1151
+ // function listenForWaitingServiceWorker(reg, callback) {
1152
+ // function awaitStateChange() {
1153
+ // reg.installing.addEventListener('statechange', function() {
1154
+ // if (this.state === 'installed') callback(reg);
1155
+ // });
1156
+ // }
1157
+ // if (!reg) return;
1158
+ // if (reg.waiting) return callback(reg);
1159
+ // if (reg.installing) awaitStateChange();
1160
+ // reg.addEventListener('updatefound', awaitStateChange);
1161
+ // }
1162
+ //
1163
+ // // reload once when the new Service Worker starts activating
1164
+ // var refreshing;
1165
+ // navigator.serviceWorker.addEventListener('controllerchange',
1166
+ // function() {
1167
+ // if (refreshing) return;
1168
+ // refreshing = true;
1169
+ // window.location.reload();
1170
+ // }
1171
+ // );
1172
+ // function promptUserToRefresh(reg) {
1173
+ // // this is just an example
1174
+ // // don't use window.confirm in real life; it's terrible
1175
+ // if (window.confirm("New version available! OK to refresh?")) {
1176
+ // reg.waiting.postMessage({command: 'skipWaiting'});
1177
+ // }
1178
+ // }
1179
+ // listenForWaitingServiceWorker(registration, promptUserToRefresh);
1180
+
1181
+ // self.log('SW Registered.');
1182
+ //@@@NOTIFICATIONS
1183
+ // _setupTokenRefreshHandler(self);
1184
+
1185
+ try {
1186
+ // Normally, notifications are not displayed when user is ON PAGE but we will display it here anyway
1187
+ firebase.messaging().onMessage(function (payload) {
1188
+ new Notification(payload.notification.title, payload.notification)
1189
+ .onclick = function(event) {
1190
+ event.preventDefault(); // prevent the browser from focusing the Notification's tab
1191
+ window.open(payload.notification.click_action, '_blank');
1192
+ }
1193
+ })
1194
+ } catch (e) {
1195
+ console.error(e);
1065
1196
  }
1066
1197
 
1067
- // service worker guide: https://developers.google.com/web/updates/2018/06/fresher-sw
1068
- navigator.serviceWorker.register(
1069
- '/' + (options_user.serviceWorker.path || 'master-service-worker.js')
1070
- + '?config=' + encodeURIComponent(JSON.stringify({
1071
- name: self.properties.global.brand.name,
1072
- app: self.properties.global.app,
1073
- env: self.properties.meta.environment,
1074
- v: self.properties.global.version,
1075
- cb: self.properties.global.cacheBreaker,
1076
- firebase: options_user.libraries.firebase_app.config
1077
- }))
1078
- )
1079
- .then(function (registration) {
1080
- // firebase.messaging().useServiceWorker(registration);
1081
- self.properties.references.serviceWorker = registration;
1082
-
1083
- // TODO: https://googlechrome.github.io/samples/service-worker/post-message/
1084
- // --- leverage this example ^^^ for caching! It's grat and you can do one page at a time through postMessage!
1085
-
1086
- // function listenForWaitingServiceWorker(reg, callback) {
1087
- // function awaitStateChange() {
1088
- // reg.installing.addEventListener('statechange', function() {
1089
- // if (this.state === 'installed') callback(reg);
1090
- // });
1091
- // }
1092
- // if (!reg) return;
1093
- // if (reg.waiting) return callback(reg);
1094
- // if (reg.installing) awaitStateChange();
1095
- // reg.addEventListener('updatefound', awaitStateChange);
1096
- // }
1097
- //
1098
- // // reload once when the new Service Worker starts activating
1099
- // var refreshing;
1100
- // navigator.serviceWorker.addEventListener('controllerchange',
1101
- // function() {
1102
- // if (refreshing) return;
1103
- // refreshing = true;
1104
- // window.location.reload();
1105
- // }
1106
- // );
1107
- // function promptUserToRefresh(reg) {
1108
- // // this is just an example
1109
- // // don't use window.confirm in real life; it's terrible
1110
- // if (window.confirm("New version available! OK to refresh?")) {
1111
- // reg.waiting.postMessage({command: 'skipWaiting'});
1112
- // }
1113
- // }
1114
- // listenForWaitingServiceWorker(registration, promptUserToRefresh);
1198
+ })
1199
+ .catch(function (e) {
1200
+ // console.log('***2');
1201
+ console.error(e);
1202
+ });
1115
1203
 
1116
- // self.log('SW Registered.');
1117
- //@@@NOTIFICATIONS
1118
- // _setupTokenRefreshHandler(self);
1204
+ // Service Worker Ready
1205
+ // navigator.serviceWorker.ready.then(function(registration) {
1206
+ // });
1207
+ }
1119
1208
 
1120
- try {
1121
- // Normally, notifications are not displayed when user is ON PAGE but we will display it here anyway
1122
- firebase.messaging().onMessage(function (payload) {
1123
- new Notification(payload.notification.title, payload.notification)
1124
- .onclick = function(event) {
1125
- event.preventDefault(); // prevent the browser from focusing the Notification's tab
1126
- window.open(payload.notification.click_action, '_blank');
1127
- }
1128
- })
1129
- } catch (e) {
1130
- console.error(e);
1131
- }
1209
+ function showExitPopup(self) {
1210
+ var exitPopupSettings = self.properties.options.exitPopup;
1132
1211
 
1133
- })
1134
- .catch(function (e) {
1135
- // console.log('***2');
1136
- console.error(e);
1137
- });
1212
+ if (!exitPopupSettings.enabled) {
1213
+ return;
1214
+ };
1138
1215
 
1139
- // Service Worker Ready
1140
- // navigator.serviceWorker.ready.then(function(registration) {
1141
- // });
1216
+ var lastTriggered = new Date(storage.get('exitPopup.lastTriggered', 0));
1217
+ var now = new Date();
1218
+ var diff = now - lastTriggered;
1219
+
1220
+ if (diff < exitPopupSettings.config.timeout) {
1221
+ return;
1222
+ };
1223
+
1224
+ showBootstrapModal(exitPopupSettings);
1225
+ }
1226
+
1227
+ function showBootstrapModal(exitPopupSettings) {
1228
+ var proceed = exitPopupSettings.config.handler
1229
+ ? exitPopupSettings.config.handler()
1230
+ : true;
1231
+
1232
+ if (!proceed) {
1233
+ return;
1142
1234
  }
1143
1235
 
1144
- function showExitPopup(self) {
1145
- var exitPopupSettings = self.properties.options.exitPopup;
1236
+ var $el = document.getElementById('modal-exit-popup');
1237
+ try {
1238
+ var modal = new bootstrap.Modal($el);
1239
+ modal.show();
1240
+ $el.removeAttribute('hidden');
1146
1241
 
1147
- if (!exitPopupSettings.enabled) {
1148
- return;
1149
- };
1242
+ var $title = $el.querySelector('.modal-title');
1243
+ var $message = $el.querySelector('.modal-body');
1244
+ var $okButton = $el.querySelector('.modal-footer .btn-primary');
1245
+ var config = exitPopupSettings.config;
1150
1246
 
1151
- var lastTriggered = new Date(storage.get('exitPopup.lastTriggered', 0));
1152
- var now = new Date();
1153
- var diff = now - lastTriggered;
1247
+ var link = config.okButton.link
1248
+ .replace(/{pathname}/ig, window.location.pathname)
1154
1249
 
1155
- if (diff < exitPopupSettings.config.timeout) {
1156
- return;
1157
- };
1250
+ $title.innerHTML = config.title;
1251
+ $message.innerHTML = config.message;
1252
+ $okButton.innerHTML = config.okButton.text;
1253
+ $okButton.setAttribute('href', link);
1158
1254
 
1159
- showBootstrapModal(exitPopupSettings);
1255
+ storage.set('exitPopup.lastTriggered', new Date().toISOString());
1256
+ } catch (e) {
1257
+ console.warn(e);
1160
1258
  }
1259
+ }
1161
1260
 
1162
- function showBootstrapModal(exitPopupSettings) {
1163
- var proceed = exitPopupSettings.config.handler
1164
- ? exitPopupSettings.config.handler()
1165
- : true;
1261
+ function refreshNewVersion(self) {
1262
+ console.log('refreshNewVersion()');
1166
1263
 
1167
- if (!proceed) {
1168
- return;
1264
+ // Make request to get the build time (live)
1265
+ fetch('/@output/build/build.json?cb=' + new Date().getTime())
1266
+ .then(function (res) {
1267
+ if (res.ok) {
1268
+ return res.json();
1269
+ } else {
1270
+ throw new Error('Bad response');
1169
1271
  }
1272
+ })
1273
+ .then(function (data) {
1274
+ var buildTimeCurrent = self.properties.global.buildTime;
1275
+ var buildTimeLive = new Date(data['npm-build'].timestamp);
1170
1276
 
1171
- var $el = document.getElementById('modal-exit-popup');
1172
- try {
1173
- var modal = new bootstrap.Modal($el);
1174
- modal.show();
1175
- $el.removeAttribute('hidden');
1277
+ // Set buildTimeCurrent to 1 hour ahead to account for the npm-build time which will ALWAYS be set to later since it happens later
1278
+ buildTimeCurrent.setHours(buildTimeCurrent.getHours() + 1);
1279
+
1280
+ // Log
1281
+ console.log('refreshNewVersion()', data, buildTimeCurrent, buildTimeLive);
1176
1282
 
1177
- var $title = $el.querySelector('.modal-title');
1178
- var $message = $el.querySelector('.modal-body');
1179
- var $okButton = $el.querySelector('.modal-footer .btn-primary');
1180
- var config = exitPopupSettings.config;
1283
+ // If the live time is newer, refresh
1284
+ if (buildTimeCurrent < buildTimeLive) {
1285
+ console.log('refreshNewVersion(): Refreshing...');
1181
1286
 
1182
- var link = config.okButton.link
1183
- .replace(/{pathname}/ig, window.location.pathname)
1287
+ if (self.isDevelopment()) {
1288
+ return;
1289
+ }
1184
1290
 
1185
- $title.innerHTML = config.title;
1186
- $message.innerHTML = config.message;
1187
- $okButton.innerHTML = config.okButton.text;
1188
- $okButton.setAttribute('href', link);
1291
+ // Force page reload
1292
+ window.onbeforeunload = function () {
1293
+ return undefined;
1294
+ }
1189
1295
 
1190
- storage.set('exitPopup.lastTriggered', new Date().toISOString());
1191
- } catch (e) {
1192
- console.warn(e);
1296
+ // Refresh
1297
+ window.location.reload(true);
1193
1298
  }
1194
- }
1299
+ })
1300
+ .catch(function (e) {
1301
+ console.error(e);
1302
+ })
1303
+ }
1195
1304
 
1196
- function refreshNewVersion(self) {
1197
- console.log('refreshNewVersion()');
1305
+ /*
1306
+ EXTERNAL LIBS
1307
+ */
1308
+ var load_firebase = function(self, options) {
1309
+ return new Promise(function(resolve, reject) {
1310
+ // Set shortcuts
1311
+ var setting = options.libraries.firebase_app
1312
+
1313
+ // Skip if not enabled
1314
+ if (!setting.enabled) {
1315
+ return resolve();
1316
+ }
1198
1317
 
1199
- // Make request to get the build time (live)
1200
- fetch('/@output/build/build.json?cb=' + new Date().getTime())
1201
- .then(function (res) {
1202
- if (res.ok) {
1203
- return res.json();
1204
- } else {
1205
- throw new Error('Bad response');
1206
- }
1207
- })
1208
- .then(function (data) {
1209
- var buildTimeCurrent = self.properties.global.buildTime;
1210
- var buildTimeLive = new Date(data['npm-build'].timestamp);
1318
+ // Setup Firebase
1319
+ function _post() {
1320
+ // Initialize Firebase
1321
+ window.app = firebase.initializeApp(setting.config);
1322
+
1323
+ // Load Firebase libraries
1324
+ Promise.all([
1325
+ load_firebase_auth(self, options),
1326
+ load_firebase_firestore(self, options),
1327
+ load_firebase_messaging(self, options),
1328
+ load_firebase_appCheck(self, options),
1329
+ ])
1330
+ .then(resolve)
1331
+ .catch(reject);
1332
+ }
1211
1333
 
1212
- // Set buildTimeCurrent to 1 hour ahead to account for the npm-build time which will ALWAYS be set to later since it happens later
1213
- buildTimeCurrent.setHours(buildTimeCurrent.getHours() + 1);
1334
+ // Load Firebase
1335
+ if (setting.load) {
1336
+ setting.load(self)
1337
+ .then(_post)
1338
+ .catch(reject);
1339
+ } else {
1340
+ // import('firebase/app')
1341
+ import('firebase/compat/app')
1342
+ .then(function(mod) {
1343
+ window.firebase = mod.default;
1344
+ _post()
1345
+ })
1346
+ .catch(reject);
1347
+ }
1348
+ });
1349
+ }
1214
1350
 
1215
- // Log
1216
- console.log('refreshNewVersion()', data, buildTimeCurrent, buildTimeLive);
1217
1351
 
1218
- // If the live time is newer, refresh
1219
- if (buildTimeCurrent < buildTimeLive) {
1220
- console.log('refreshNewVersion(): Refreshing...');
1352
+ var load_firebase_auth = function(self, options) {
1353
+ return new Promise(function(resolve, reject) {
1354
+ // Set shortcuts
1355
+ var setting = options.libraries.firebase_auth;
1221
1356
 
1222
- if (self.isDevelopment()) {
1223
- return;
1224
- }
1357
+ // Skip if not enabled
1358
+ if (!setting.enabled) {
1359
+ return resolve();
1360
+ }
1225
1361
 
1226
- // Force page reload
1227
- window.onbeforeunload = function () {
1228
- return undefined;
1229
- }
1362
+ // Load Firebase Auth
1363
+ if (setting.load) {
1364
+ setting.load(self)
1365
+ .then(resolve)
1366
+ .catch(reject);
1367
+ } else {
1368
+ // import('firebase/auth')
1369
+ import('firebase/compat/auth')
1370
+ .then(resolve)
1371
+ .catch(reject);
1372
+ }
1373
+ });
1374
+ }
1230
1375
 
1231
- // Refresh
1232
- window.location.reload(true);
1233
- }
1234
- })
1235
- .catch(function (e) {
1236
- console.error(e);
1237
- })
1238
- }
1239
1376
 
1240
- /*
1241
- EXTERNAL LIBS
1242
- */
1243
- var load_firebase = function(self, options) {
1244
- return new Promise(function(resolve, reject) {
1245
- // if (typeof window.firebase !== 'undefined') {
1246
- // return resolve();
1247
- // }
1248
- var setting = options.libraries.firebase_app
1249
- if (setting.enabled === true) {
1250
- function _post() {
1251
- // self.log('Loaded Firebase.');
1252
- // console.log('_post.');
1253
- window.app = firebase.initializeApp(setting.config);
1254
-
1255
- Promise.all([
1256
- load_firebase_auth(self, options),
1257
- load_firebase_firestore(self, options),
1258
- load_firebase_messaging(self, options),
1259
- load_firebase_appCheck(self, options),
1260
- ])
1261
- .then(resolve)
1262
- .catch(reject);
1263
- }
1264
- if (setting.load) {
1265
- setting.load(self)
1266
- .then(_post)
1267
- .catch(reject);
1268
- } else {
1269
- // import('firebase/app')
1270
- import('firebase/compat/app')
1271
- .then(function(mod) {
1272
- window.firebase = mod.default;
1273
- _post()
1274
- })
1275
- .catch(reject);
1276
- }
1277
- } else {
1278
- resolve();
1279
- }
1280
- });
1281
- }
1377
+ var load_firebase_firestore = function(self, options) {
1378
+ return new Promise(function(resolve, reject) {
1379
+ // Set shortcuts
1380
+ var setting = options.libraries.firebase_firestore;
1282
1381
 
1382
+ // Skip if not enabled
1383
+ if (!setting.enabled) {
1384
+ return resolve();
1385
+ }
1283
1386
 
1284
- var load_firebase_auth = function(self, options) {
1285
- return new Promise(function(resolve, reject) {
1286
- // if (typeof utilities.get(window, 'firebase.auth', undefined) !== 'undefined') {
1287
- // return resolve();
1288
- // }
1289
- var setting = options.libraries.firebase_auth;
1290
- if (setting.enabled === true) {
1291
- if (setting.load) {
1292
- setting.load(self)
1293
- .then(resolve)
1294
- .catch(reject);
1295
- } else {
1296
- // import('firebase/auth')
1297
- import('firebase/compat/auth')
1298
- .then(resolve)
1299
- .catch(reject);
1300
- }
1301
- } else {
1302
- resolve();
1303
- }
1387
+ // Load Firebase Firestore
1388
+ if (setting.load) {
1389
+ setting.load(self)
1390
+ .then(resolve)
1391
+ .catch(reject);
1392
+ } else {
1393
+ // import('firebase/firestore')
1394
+ import('firebase/compat/firestore')
1395
+ .then(resolve)
1396
+ .catch(reject);
1397
+ }
1398
+ });
1399
+ }
1304
1400
 
1305
- });
1306
- }
1401
+ var load_firebase_messaging = function(self, options) {
1402
+ return new Promise(function(resolve, reject) {
1403
+ // Set shortcuts
1404
+ var setting = options.libraries.firebase_messaging;
1307
1405
 
1406
+ // Skip if not enabled
1407
+ if (!setting.enabled) {
1408
+ return resolve();
1409
+ }
1308
1410
 
1309
- var load_firebase_firestore = function(self, options) {
1310
- return new Promise(function(resolve, reject) {
1311
- // if (typeof utilities.get(window, 'firebase.firestore', undefined) !== 'undefined') {
1312
- // return resolve();
1313
- // }
1314
- var setting = options.libraries.firebase_firestore;
1315
- if (setting.enabled === true) {
1316
- if (setting.load) {
1317
- setting.load(self)
1318
- .then(resolve)
1319
- .catch(reject);
1320
- } else {
1321
- // import('firebase/firestore')
1322
- import('firebase/compat/firestore')
1323
- .then(resolve)
1324
- .catch(reject);
1325
- }
1326
- } else {
1327
- resolve();
1328
- }
1329
- });
1330
- }
1411
+ // Load Firebase Messaging
1412
+ if (setting.load) {
1413
+ setting.load(self)
1414
+ .then(resolve)
1415
+ .catch(reject);
1416
+ } else {
1417
+ // import('firebase/messaging')
1418
+ import('firebase/compat/messaging')
1419
+ .then(resolve)
1420
+ .catch(reject);
1421
+ }
1422
+ });
1423
+ }
1331
1424
 
1332
- var load_firebase_messaging = function(self, options) {
1333
- return new Promise(function(resolve, reject) {
1334
- // if (typeof utilities.get(window, 'firebase.messaging', undefined) !== 'undefined') {
1335
- // return resolve();
1336
- // }
1337
- var setting = options.libraries.firebase_messaging;
1338
- if (setting.enabled === true) {
1339
- if (setting.load) {
1340
- setting.load(self)
1341
- .then(resolve)
1342
- .catch(reject);
1343
- } else {
1344
- // import('firebase/messaging')
1345
- import('firebase/compat/messaging')
1346
- .then(resolve)
1347
- .catch(reject);
1425
+ var load_firebase_appCheck = function(self, options) {
1426
+ return new Promise(function(resolve, reject) {
1427
+ // Set shortcuts
1428
+ var setting = options.libraries.firebase_appCheck;
1429
+
1430
+ // Skip if not enabled
1431
+ if (!setting.enabled) {
1432
+ return resolve();
1433
+ }
1434
+
1435
+ // Load Firebase AppCheck
1436
+ if (setting.load) {
1437
+ setting.load(self)
1438
+ .then(resolve)
1439
+ .catch(reject);
1440
+ } else {
1441
+ // import('firebase/app-check')
1442
+ import('firebase/compat/app-check')
1443
+ .then(function (mod) {
1444
+ var appCheck = firebase.appCheck;
1445
+ var siteKey = setting.config.siteKey;
1446
+
1447
+ if (!siteKey) {
1448
+ return resolve();
1348
1449
  }
1349
- } else {
1450
+
1451
+ appCheck().activate(
1452
+ new appCheck.ReCaptchaEnterpriseProvider(siteKey),
1453
+ true,
1454
+ );
1455
+
1350
1456
  resolve();
1351
- }
1352
- });
1353
- }
1457
+ })
1458
+ .catch(reject);
1459
+ }
1460
+ });
1461
+ }
1354
1462
 
1355
- var load_firebase_appCheck = function(self, options) {
1356
- return new Promise(function(resolve, reject) {
1357
- var setting = options.libraries.firebase_appCheck;
1358
- if (setting.enabled === true) {
1359
- if (setting.load) {
1360
- setting.load(self)
1361
- .then(resolve)
1362
- .catch(reject);
1363
- } else {
1364
- // import('firebase/app-check')
1365
- import('firebase/compat/app-check')
1366
- .then(function (mod) {
1367
- var appCheck = firebase.appCheck;
1368
- var siteKey = setting.config.siteKey;
1369
-
1370
- if (!siteKey) {
1371
- return resolve();
1372
- }
1463
+ var load_lazysizes = function(self, options) {
1464
+ return new Promise(function(resolve, reject) {
1465
+ // Skip if not enabled
1466
+ if (!options.libraries.lazysizes.enabled) {
1467
+ return resolve();
1468
+ }
1373
1469
 
1374
- appCheck().activate(
1375
- new appCheck.ReCaptchaEnterpriseProvider(siteKey),
1376
- true,
1377
- );
1470
+ // Load Lazysizes
1471
+ import('lazysizes')
1472
+ .then(function (mod) {
1473
+ window.lazysizes = mod.default;
1474
+
1475
+ // configs come from official lazysizes demo
1476
+ var expand = Math.max(Math.min(document.documentElement.clientWidth, document.documentElement.clientHeight, 1222) - 1, 359);
1477
+ window.lazySizesConfig = {
1478
+ loadMode: 1,
1479
+ expand: expand,
1480
+ expFactor: expand < 380 ? 3 : 2,
1481
+ };
1482
+ // self.log('Loaded Lazysizes.');
1483
+ })
1484
+ .catch(reject);
1485
+ });
1486
+ }
1378
1487
 
1379
- resolve();
1380
- })
1381
- .catch(reject);
1382
- }
1383
- } else {
1384
- resolve();
1385
- }
1386
- });
1387
- }
1488
+ var load_cookieconsent = function(self, options) {
1489
+ return new Promise(function(resolve, reject) {
1490
+ // Skip if not enabled
1491
+ if (!options.libraries.cookieconsent.enabled) {
1492
+ return resolve();
1493
+ }
1388
1494
 
1389
- var load_lazysizes = function(self, options) {
1390
- return new Promise(function(resolve, reject) {
1391
- // if (typeof window.lazysizes !== 'undefined') {
1392
- // return resolve();
1393
- // }
1394
- if (options.libraries.lazysizes.enabled === true) {
1395
- import('lazysizes')
1396
- .then(function (mod) {
1397
- window.lazysizes = mod.default;
1398
-
1399
- // configs come from official lazysizes demo
1400
- var expand = Math.max(Math.min(document.documentElement.clientWidth, document.documentElement.clientHeight, 1222) - 1, 359);
1401
- window.lazySizesConfig = {
1402
- loadMode: 1,
1403
- expand: expand,
1404
- expFactor: expand < 380 ? 3 : 2,
1405
- };
1406
- // self.log('Loaded Lazysizes.');
1407
- })
1408
- .catch(reject);
1409
- } else {
1410
- resolve();
1411
- }
1412
- });
1413
- }
1495
+ // Load Cookieconsent
1496
+ import('cookieconsent')
1497
+ .then(function(mod) {
1498
+ window.cookieconsent.initialise(options.libraries.cookieconsent.config);
1499
+ // self.log('Loaded Cookieconsent.');
1500
+ resolve();
1501
+ })
1502
+ .catch(reject);
1503
+ });
1504
+ }
1414
1505
 
1415
- var load_cookieconsent = function(self, options) {
1416
- return new Promise(function(resolve, reject) {
1417
- // if (typeof window.cookieconsent !== 'undefined') {
1418
- // return resolve();
1419
- // }
1420
- if (options.libraries.cookieconsent.enabled === true) {
1421
- import('cookieconsent')
1422
- .then(function(mod) {
1423
- window.cookieconsent.initialise(options.libraries.cookieconsent.config);
1424
- // self.log('Loaded Cookieconsent.');
1425
- resolve();
1426
- })
1427
- .catch(reject);
1428
- } else {
1429
- resolve();
1430
- }
1506
+ var load_chatsy = function(self, options) {
1507
+ return new Promise(function(resolve, reject) {
1508
+ // Skip if not enabled or already requested
1509
+ if (!options.libraries.chatsy.enabled || self.properties.page._chatsyRequested) {
1510
+ return resolve();
1511
+ }
1431
1512
 
1432
- });
1433
- }
1513
+ var chatsyPath = 'libraries.chatsy.config';
1514
+
1515
+ // Immediately hide the fake button
1516
+ select('#prechat-btn').hide();
1517
+
1518
+ // Load the script
1519
+ loadScript({
1520
+ src: 'https://app.chatsy.ai/resources/script.js',
1521
+ // src: 'http://localhost:4001/resources/script.js',
1522
+ attributes: [
1523
+ {name: 'data-account-id', value: utilities.get(options, chatsyPath + '.accountId', '')},
1524
+ {name: 'data-chat-id', value: utilities.get(options, chatsyPath + '.chatId', '')},
1525
+ {name: 'data-settings', value: JSON.stringify(utilities.get(options, chatsyPath + '.settings', ''))},
1526
+ ],
1527
+ crossorigin: true,
1528
+ })
1529
+ .then(function () {
1530
+ // Listen for Chatsy status
1531
+ chatsy.on('status', function(event, status) {
1532
+ if (status === 'loaded') {
1533
+ chatsy.open();
1534
+ }
1535
+ })
1434
1536
 
1435
- var load_chatsy = function(self, options) {
1436
- return new Promise(function(resolve, reject) {
1437
-
1438
- if (
1439
- options.libraries.chatsy.enabled === true
1440
- && !self.properties.page._chatsyRequested
1441
- ) {
1442
- var chatsyPath = 'libraries.chatsy.config';
1443
-
1444
- // Immediately hide the fake button
1445
- select('#prechat-btn').hide();
1446
-
1447
- // Load the script
1448
- loadScript({
1449
- src: 'https://app.chatsy.ai/resources/script.js',
1450
- // src: 'http://localhost:4001/resources/script.js',
1451
- attributes: [
1452
- {name: 'data-account-id', value: utilities.get(options, chatsyPath + '.accountId', '')},
1453
- {name: 'data-chat-id', value: utilities.get(options, chatsyPath + '.chatId', '')},
1454
- {name: 'data-settings', value: JSON.stringify(utilities.get(options, chatsyPath + '.settings', ''))},
1455
- ],
1456
- crossorigin: true,
1457
- })
1458
- .then(function () {
1459
- // Listen for Chatsy status
1460
- chatsy.on('status', function(event, status) {
1461
- if (status === 'loaded') {
1462
- chatsy.open();
1463
- }
1464
- })
1537
+ resolve();
1538
+ })
1465
1539
 
1466
- resolve();
1467
- })
1540
+ self.properties.page._chatsyRequested = true;
1541
+ });
1542
+ }
1468
1543
 
1469
- self.properties.page._chatsyRequested = true;
1470
- } else {
1471
- resolve();
1472
- }
1473
- });
1474
- }
1544
+ var load_sentry = function(self, options) {
1545
+ return new Promise(function(resolve, reject) {
1546
+ // Skip if not enabled
1547
+ if (!options.libraries.sentry.enabled) {
1548
+ return resolve();
1549
+ }
1475
1550
 
1476
- var load_sentry = function(self, options) {
1477
- return new Promise(function(resolve, reject) {
1478
- if (options.libraries.sentry.enabled === true) {
1479
- import('@sentry/browser')
1480
- .then(function(mod) {
1481
- // Set global
1482
- window.Sentry = mod;
1483
-
1484
- // Set config
1485
- var config = options.libraries.sentry.config;
1486
- config.release = config.release + '@' + self.properties.global.version;
1487
- config.environment = self.properties.meta.environment;
1488
- config.integrations = config.integrations || [];
1489
-
1490
- // if (self.isDevelopment()) {
1491
- // config.dsn = 'https://901db748bbb9469f860dc36fb07a4374@o1120154.ingest.sentry.io/6155285';
1492
- // }
1493
-
1494
- // Add integration: browser tracing
1495
- config.integrations.push(Sentry.browserTracingIntegration());
1496
-
1497
- // Add integration: replay
1498
- if (config.replaysSessionSampleRate > 0 || config.replaysOnErrorSampleRate > 0) {
1499
- config.integrations.push(Sentry.replayIntegration({
1500
- maskAllText: false,
1501
- blockAllMedia: false,
1502
- }));
1503
- }
1551
+ // Import Sentry
1552
+ import('@sentry/browser')
1553
+ .then(function(mod) {
1554
+ // Set global
1555
+ window.Sentry = mod;
1504
1556
 
1505
- // Setup before send
1506
- config.beforeSend = function (event, hint) {
1507
- var startTime = self.properties.page.startTime;
1508
- var hoursSinceStart = (new Date() - startTime) / (1000 * 3600);
1509
-
1510
- // Setup tags
1511
- event.tags = event.tags || {};
1512
- event.tags['process.type'] = event.tags['process.type'] || 'browser';
1513
- // event.tags['usage.total.opens'] = parseInt(usage.total.opens);
1514
- // event.tags['usage.total.hours'] = usage.total.hours;
1515
- event.tags['usage.session.hours'] = hoursSinceStart.toFixed(2);
1516
- // event.tags['store'] = self.properties().isStore();
1517
-
1518
- // Setup user
1519
- event.user = event.user || {};
1520
- event.user.email = storage.get('user.auth.email', '')
1521
- event.user.uid = storage.get('user.auth.uid', '');
1522
- // event.user.ip = storage.get('user.ip', '');
1523
-
1524
- // Log to console
1525
- console.error('[SENTRY] Caught error', event, hint);
1526
-
1527
- // Skip processing the event
1528
- if (self.isDevelopment()) {
1529
- return null;
1530
- }
1557
+ // Set config
1558
+ var config = options.libraries.sentry.config;
1559
+ config.release = config.release + '@' + self.properties.global.version;
1560
+ config.environment = self.properties.meta.environment;
1561
+ config.integrations = config.integrations || [];
1531
1562
 
1532
- // Process the event
1533
- return event;
1534
- }
1563
+ // if (self.isDevelopment()) {
1564
+ // config.dsn = 'https://901db748bbb9469f860dc36fb07a4374@o1120154.ingest.sentry.io/6155285';
1565
+ // }
1535
1566
 
1536
- // Initialize
1537
- Sentry.init(config);
1567
+ // Add integration: browser tracing
1568
+ config.integrations.push(Sentry.browserTracingIntegration());
1538
1569
 
1539
- // Resolve
1540
- resolve();
1541
- })
1542
- .catch(reject);
1543
- } else {
1544
- resolve();
1570
+ // Add integration: replay
1571
+ if (config.replaysSessionSampleRate > 0 || config.replaysOnErrorSampleRate > 0) {
1572
+ config.integrations.push(Sentry.replayIntegration({
1573
+ maskAllText: false,
1574
+ blockAllMedia: false,
1575
+ }));
1545
1576
  }
1546
- });
1547
- }
1548
1577
 
1549
- Manager.prototype.log = function() {
1550
- var self = this;
1551
-
1552
- if (self.isDevelopment()) {
1553
- // 1. Convert args to a normal array
1554
- var args = Array.prototype.slice.call(arguments);
1555
-
1556
- // 2. Prepend log prefix log string
1557
- args.unshift('[DEV @ ' + new Date().toLocaleTimeString() + ']');
1558
-
1559
- // 3. Pass along arguments to console.log
1560
- if (args[1] === 'error') {
1561
- args.splice(1,1);
1562
- console.error.apply(console, args);
1563
- } else if (args[1] === 'warn') {
1564
- args.splice(1,1);
1565
- console.warn.apply(console, args);
1566
- } else if (args[1] === 'log') {
1567
- args.splice(1,1);
1568
- console.log.apply(console, args);
1569
- } else {
1570
- console.log.apply(console, args);
1578
+ // Setup before send
1579
+ config.beforeSend = function (event, hint) {
1580
+ var startTime = self.properties.page.startTime;
1581
+ var hoursSinceStart = (new Date() - startTime) / (1000 * 3600);
1582
+
1583
+ // Setup tags
1584
+ event.tags = event.tags || {};
1585
+ event.tags['process.type'] = event.tags['process.type'] || 'browser';
1586
+ // event.tags['usage.total.opens'] = parseInt(usage.total.opens);
1587
+ // event.tags['usage.total.hours'] = usage.total.hours;
1588
+ event.tags['usage.session.hours'] = hoursSinceStart.toFixed(2);
1589
+ // event.tags['store'] = self.properties().isStore();
1590
+
1591
+ // Setup user
1592
+ event.user = event.user || {};
1593
+ event.user.email = storage.get('user.auth.email', '')
1594
+ event.user.uid = storage.get('user.auth.uid', '');
1595
+ // event.user.ip = storage.get('user.ip', '');
1596
+
1597
+ // Log to console
1598
+ console.error('[SENTRY] Caught error', event, hint);
1599
+
1600
+ // Skip processing the event
1601
+ if (self.isDevelopment()) {
1602
+ return null;
1603
+ }
1604
+
1605
+ // Process the event
1606
+ return event;
1571
1607
  }
1572
- }
1573
- }
1574
1608
 
1575
- function init_loadPolyfills(self, configuration, cb) {
1576
- // https://github.com/jquintozamora/polyfill-io-feature-detection/blob/master/index.js
1577
- var featuresDefault = (
1578
- typeof Symbol !== 'undefined'
1579
- )
1580
- var featuresCustom = true;
1609
+ // Initialize
1610
+ Sentry.init(config);
1581
1611
 
1582
- if (featuresDefault && featuresCustom) {
1583
- cb();
1612
+ // Resolve
1613
+ resolve();
1614
+ })
1615
+ .catch(reject);
1616
+ });
1617
+ }
1618
+
1619
+ Manager.prototype.log = function() {
1620
+ var self = this;
1621
+
1622
+ if (self.isDevelopment()) {
1623
+ // 1. Convert args to a normal array
1624
+ var args = Array.prototype.slice.call(arguments);
1625
+
1626
+ // 2. Prepend log prefix log string
1627
+ args.unshift('[DEV @ ' + new Date().toLocaleTimeString() + ']');
1628
+
1629
+ // 3. Pass along arguments to console.log
1630
+ if (args[1] === 'error') {
1631
+ args.splice(1,1);
1632
+ console.error.apply(console, args);
1633
+ } else if (args[1] === 'warn') {
1634
+ args.splice(1,1);
1635
+ console.warn.apply(console, args);
1636
+ } else if (args[1] === 'log') {
1637
+ args.splice(1,1);
1638
+ console.log.apply(console, args);
1584
1639
  } else {
1585
- loadScript({src: 'https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?flags=always%2Cgated&features=default%2Ces5%2Ces6%2Ces7%2CPromise.prototype.finally%2C%7Ehtml5-elements%2ClocalStorage%2Cfetch%2CURLSearchParams'})
1586
- .then(function() {
1587
- cb();
1588
- })
1640
+ console.log.apply(console, args);
1589
1641
  }
1590
-
1591
1642
  }
1643
+ }
1592
1644
 
1593
- /**
1594
- * UTILITIES
1595
- */
1596
- Manager.prototype.utilities = function() {
1597
- return utilities;
1645
+ function init_loadPolyfills(self, configuration, cb) {
1646
+ // https://github.com/jquintozamora/polyfill-io-feature-detection/blob/master/index.js
1647
+ var featuresDefault = (
1648
+ typeof Symbol !== 'undefined'
1649
+ )
1650
+ var featuresCustom = true;
1651
+
1652
+ if (featuresDefault && featuresCustom) {
1653
+ cb();
1654
+ } else {
1655
+ loadScript({src: 'https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?flags=always%2Cgated&features=default%2Ces5%2Ces6%2Ces7%2CPromise.prototype.finally%2C%7Ehtml5-elements%2ClocalStorage%2Cfetch%2CURLSearchParams'})
1656
+ .then(function() {
1657
+ cb();
1658
+ })
1598
1659
  }
1599
1660
 
1600
- /**
1601
- * STORAGE
1602
- */
1603
- Manager.prototype.storage = function() {
1604
- return storage;
1605
- }
1661
+ }
1606
1662
 
1607
- /**
1608
- * QUERIES
1609
- */
1610
- // Manager.prototype.query = function() {
1611
- // return query;
1612
- // }
1663
+ /**
1664
+ * UTILITIES
1665
+ */
1666
+ Manager.prototype.utilities = function() {
1667
+ return utilities;
1668
+ }
1613
1669
 
1614
- /**
1615
- * DOM OPERATIONS
1616
- */
1617
- Manager.prototype.dom = function() {
1618
- return dom;
1619
- }
1670
+ /**
1671
+ * STORAGE
1672
+ */
1673
+ Manager.prototype.storage = function() {
1674
+ return storage;
1675
+ }
1620
1676
 
1621
- /**
1622
- * ACCOUNT
1623
- */
1624
- // Manager.prototype.account = function() {
1625
- // var self = this;
1626
- // return {
1627
- // resolve: function (options) {
1628
- // return import('./lib/account.js')
1629
- // .then(function(mod) {
1630
- // self.account = function () { return mod.default }
1631
- // return self.account().resolve(options);
1632
- // })
1633
- // }
1634
- // }
1635
- // }
1636
-
1637
- Manager.prototype.account = function() {
1638
- var self = this;
1639
-
1640
- return {
1641
- import: function () {
1642
- return import('./lib/account.js')
1643
- .then(function(mod) {
1644
- self.account = function () { return mod.default }
1645
- mod.default.prototype.Manager = self;
1646
- return self.account();
1647
- })
1648
- }
1677
+ /**
1678
+ * QUERIES
1679
+ */
1680
+ // Manager.prototype.query = function() {
1681
+ // return query;
1682
+ // }
1683
+
1684
+ /**
1685
+ * DOM OPERATIONS
1686
+ */
1687
+ Manager.prototype.dom = function() {
1688
+ return dom;
1689
+ }
1690
+
1691
+ /**
1692
+ * ACCOUNT
1693
+ */
1694
+ // Manager.prototype.account = function() {
1695
+ // var self = this;
1696
+ // return {
1697
+ // resolve: function (options) {
1698
+ // return import('./lib/account.js')
1699
+ // .then(function(mod) {
1700
+ // self.account = function () { return mod.default }
1701
+ // return self.account().resolve(options);
1702
+ // })
1703
+ // }
1704
+ // }
1705
+ // }
1706
+
1707
+ Manager.prototype.account = function() {
1708
+ var self = this;
1709
+
1710
+ return {
1711
+ import: function () {
1712
+ return import('./lib/account.js')
1713
+ .then(function(mod) {
1714
+ self.account = function () { return mod.default }
1715
+ mod.default.prototype.Manager = self;
1716
+ return self.account();
1717
+ })
1649
1718
  }
1650
1719
  }
1720
+ }
1651
1721
 
1652
- // Manager.prototype.fetch = function(url, options) {
1653
- // var response = {
1654
- // status: 500,
1655
- // };
1656
- // return new Promise(function(resolve, reject) {
1657
- // fetch(url, options)
1658
- // .then(function (res) {
1659
- // response = res;
1660
- // if (res.status >= 200 && res.status < 300) {
1661
- // return resolve({response: res});
1662
- // } else {
1663
- // return res.text()
1664
- // .then(function (data) {
1665
- // throw new Error(data || res.statusTest || 'Unknown error.')
1666
- // })
1667
- // }
1668
- // })
1669
- // .catch(function (e) {
1670
- // return reject({response: response, error: e});
1671
- // });
1672
- // });
1673
- // }
1674
-
1675
- // Manager.prototype.ajax = function() {
1676
- // return ajax;
1677
- // }
1722
+ // Manager.prototype.fetch = function(url, options) {
1723
+ // var response = {
1724
+ // status: 500,
1725
+ // };
1726
+ // return new Promise(function(resolve, reject) {
1727
+ // fetch(url, options)
1728
+ // .then(function (res) {
1729
+ // response = res;
1730
+ // if (res.status >= 200 && res.status < 300) {
1731
+ // return resolve({response: res});
1732
+ // } else {
1733
+ // return res.text()
1734
+ // .then(function (data) {
1735
+ // throw new Error(data || res.statusTest || 'Unknown error.')
1736
+ // })
1737
+ // }
1738
+ // })
1739
+ // .catch(function (e) {
1740
+ // return reject({response: response, error: e});
1741
+ // });
1742
+ // });
1743
+ // }
1744
+
1745
+ // Manager.prototype.ajax = function() {
1746
+ // return ajax;
1747
+ // }
1678
1748
 
1679
- /**
1680
- * OTHER
1681
- */
1682
- // Manager.prototype.performance = function() {
1683
- // var supported = ('performance' in window);
1684
- // return {
1685
- // mark: function(mark) {
1686
- // if (!supported) {return};
1687
- // window.performance.mark(mark);
1688
- // }
1689
- // }
1690
- // }
1691
- Manager.prototype.performance = function () {
1692
- return {
1693
- mark: function(mark) {
1694
- try {
1695
- window.performance.mark(mark);
1696
- } catch (e) {
1697
- }
1749
+ /**
1750
+ * OTHER
1751
+ */
1752
+ // Manager.prototype.performance = function() {
1753
+ // var supported = ('performance' in window);
1754
+ // return {
1755
+ // mark: function(mark) {
1756
+ // if (!supported) {return};
1757
+ // window.performance.mark(mark);
1758
+ // }
1759
+ // }
1760
+ // }
1761
+ Manager.prototype.performance = function () {
1762
+ return {
1763
+ mark: function(mark) {
1764
+ try {
1765
+ window.performance.mark(mark);
1766
+ } catch (e) {
1698
1767
  }
1699
1768
  }
1700
1769
  }
1770
+ }
1701
1771
 
1702
- Manager.prototype.isValidRedirectUrl = function (url) {
1703
- var self = this;
1772
+ Manager.prototype.isValidRedirectUrl = function (url) {
1773
+ var self = this;
1704
1774
 
1705
- var returnUrlObject = new URL(decodeURIComponent(url));
1706
- var currentUrlObject = new URL(window.location.href);
1775
+ var returnUrlObject = new URL(decodeURIComponent(url));
1776
+ var currentUrlObject = new URL(window.location.href);
1707
1777
 
1708
- return returnUrlObject.host === currentUrlObject.host
1709
- || returnUrlObject.protocol === this.properties.global.app + ':'
1710
- || self.properties.global.validRedirectHosts.includes(returnUrlObject.host)
1711
- }
1778
+ return returnUrlObject.host === currentUrlObject.host
1779
+ || returnUrlObject.protocol === this.properties.global.app + ':'
1780
+ || self.properties.global.validRedirectHosts.includes(returnUrlObject.host)
1781
+ }
1712
1782
 
1713
- Manager.prototype.isDevelopment = function () {
1714
- var self = this;
1783
+ Manager.prototype.isDevelopment = function () {
1784
+ var self = this;
1715
1785
 
1716
- return self.properties.meta.environment === 'development';
1717
- }
1786
+ return self.properties.meta.environment === 'development';
1787
+ }
1718
1788
 
1719
- // Manager.prototype.performance = function() {
1720
- // var self = this;
1721
- //
1722
- // return {
1723
- // mark2: function () {
1724
- // return firebaseActive ? !!firebase.auth().currentUser : false;
1725
- // },
1726
- //
1727
- // }
1728
- // }
1789
+ // Manager.prototype.performance = function() {
1790
+ // var self = this;
1791
+ //
1792
+ // return {
1793
+ // mark2: function () {
1794
+ // return firebaseActive ? !!firebase.auth().currentUser : false;
1795
+ // },
1796
+ //
1797
+ // }
1798
+ // }
1729
1799
 
1730
1800
 
1731
- /**
1732
- * HELPERS
1733
- */
1801
+ /**
1802
+ * HELPERS
1803
+ */
1734
1804
 
1735
1805
  module.exports = Manager;