web-manager 3.2.54 → 3.2.57

Sign up to get free protection for your applications and to get access to all the features.
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;