react-onesignal 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts CHANGED
@@ -1,17 +1,45 @@
1
1
  const ONESIGNAL_SDK_ID = 'onesignal-sdk';
2
2
  const ONE_SIGNAL_SCRIPT_SRC = 'https://cdn.onesignal.com/sdks/OneSignalSDK.js';
3
- const ONESIGNAL_NOT_SETUP_ERROR = 'OneSignal is not setup correctly.';
4
3
  const reactOneSignalFunctionQueue = [];
5
- const MAX_TIMEOUT = 30;
6
4
 
5
+ // true if the script is successfully loaded from CDN.
7
6
  let isOneSignalInitialized = false;
7
+ // true if the script fails to load from CDN. A separate flag is necessary
8
+ // to disambiguate between a CDN load failure and a delayed call to
9
+ // OneSignal#init.
10
+ let isOneSignalScriptFailed = false;
8
11
 
9
- const injectScript = () => {
10
- const script = document.createElement('script');
11
- script.id = ONESIGNAL_SDK_ID;
12
- script.src = ONE_SIGNAL_SCRIPT_SRC;
13
- script.async = true;
14
- document.head.appendChild(script);
12
+ const doesOneSignalExist = () => {
13
+ if (window["OneSignal"]) {
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+
19
+ const handleOnLoad = (resolve: () => void, options: IInitObject) => {
20
+ isOneSignalInitialized = true;
21
+
22
+ // OneSignal is assumed to be loaded correctly because this method
23
+ // is called after the script is successfully loaded by CDN, but
24
+ // just in case.
25
+ window["OneSignal"] = window["OneSignal"] || []
26
+
27
+ window["OneSignal"].push(() => {
28
+ window["OneSignal"].init(options);
29
+ });
30
+
31
+ window["OneSignal"].push(() => {
32
+ processQueuedOneSignalFunctions();
33
+ resolve();
34
+ });
35
+ }
36
+
37
+ const handleOnError = (resolve: () => void) => {
38
+ isOneSignalScriptFailed = true;
39
+ // Ensure that any unresolved functions are cleared from the queue,
40
+ // even in the event of a CDN load failure.
41
+ processQueuedOneSignalFunctions();
42
+ resolve();
15
43
  }
16
44
 
17
45
  const processQueuedOneSignalFunctions = () => {
@@ -28,21 +56,9 @@ const processQueuedOneSignalFunctions = () => {
28
56
  });
29
57
  }
30
58
 
31
- const doesOneSignalExist = () => {
32
- if (window["OneSignal"]) {
33
- return true;
34
- }
35
- return false;
36
- }
37
-
38
- const setupOneSignalIfMissing = () => {
39
- if (!doesOneSignalExist()) {
40
- window["OneSignal"] = window["OneSignal"] || [];
41
- }
42
- }
43
-
44
59
  const init = (options: IInitObject) => new Promise<void>(resolve => {
45
60
  if (isOneSignalInitialized) {
61
+ resolve();
46
62
  return;
47
63
  }
48
64
 
@@ -50,29 +66,29 @@ const init = (options: IInitObject) => new Promise<void>(resolve => {
50
66
  throw new Error('You need to provide your OneSignal appId.');
51
67
  }
52
68
  if (!document) {
69
+ resolve();
53
70
  return;
54
71
  }
55
- injectScript();
56
- setupOneSignalIfMissing();
57
- window["OneSignal"].push(() => {
58
- window["OneSignal"].init(options);
59
- });
60
72
 
61
- const timeout = setTimeout(() => {
62
- console.error(ONESIGNAL_NOT_SETUP_ERROR);
63
- }, MAX_TIMEOUT * 1_000);
73
+ const script = document.createElement('script');
74
+ script.id = ONESIGNAL_SDK_ID;
75
+ script.src = ONE_SIGNAL_SCRIPT_SRC;
76
+ script.async = true;
64
77
 
78
+ script.onload = () => {
79
+ handleOnLoad(resolve, options);
80
+ };
65
81
 
66
- window["OneSignal"].push(() => {
67
- clearTimeout(timeout);
68
- processQueuedOneSignalFunctions();
69
- resolve();
70
- });
82
+ // Always resolve whether or not the script is successfully initialized.
83
+ // This is important for users who may block cdn.onesignal.com w/ adblock.
84
+ script.onerror = () => {
85
+ handleOnError(resolve);
86
+ }
71
87
 
72
- isOneSignalInitialized = true;
88
+ document.head.appendChild(script);
73
89
  });
74
90
 
75
- interface Action<T>{ (item: T): void; }
91
+ type Action<T> = (item: T) => void;
76
92
  interface AutoPromptOptions { force?: boolean; forceSlidedownOverNative?: boolean; slidedownPromptOptions?: IOneSignalAutoPromptOptions; }
77
93
  interface RegisterOptions { modalPrompt?: boolean; httpPermissionRequest?: boolean; slidedown?: boolean; autoAccept?: boolean }
78
94
  interface SetSMSOptions { identifierAuthHash?: string; }
@@ -82,16 +98,15 @@ interface IOneSignalAutoPromptOptions { force?: boolean; forceSlidedownOverNativ
82
98
  interface IOneSignalCategories { positiveUpdateButton: string; negativeUpdateButton: string; savingButtonText: string; errorButtonText: string; updateMessage: string; tags: IOneSignalTagCategory[]; }
83
99
  interface IOneSignalTagCategory { tag: string; label: string; checked?: boolean; }
84
100
 
85
-
86
101
  interface IInitObject {
87
102
  appId: string;
88
103
  subdomainName?: string;
89
104
  requiresUserPrivacyConsent?: boolean;
90
- promptOptions?: Object;
91
- welcomeNotification?: Object;
92
- notifyButton?: Object;
105
+ promptOptions?: object;
106
+ welcomeNotification?: object;
107
+ notifyButton?: object;
93
108
  persistNotification?: boolean;
94
- webhooks?: Object;
109
+ webhooks?: object;
95
110
  autoResubscribe?: boolean;
96
111
  autoRegister?: boolean;
97
112
  notificationClickHandlerMatch?: string;
@@ -100,14 +115,15 @@ interface IInitObject {
100
115
  serviceWorkerPath?: string;
101
116
  serviceWorkerUpdaterPath?: string;
102
117
  path?: string;
118
+ allowLocalhostAsSecureOrigin?: boolean;
103
119
  [key: string]: any;
104
120
  }
105
121
 
106
122
  interface IOneSignal {
107
- init(options?: IInitObject): Promise<void>
108
- on(event: string, listener: Function): void
109
- off(event: string, listener: Function): void
110
- once(event: string, listener: Function): void
123
+ init(options: IInitObject): Promise<void>
124
+ on(event: string, listener: () => void): void
125
+ off(event: string, listener: () => void): void
126
+ once(event: string, listener: () => void): void
111
127
  isPushNotificationsEnabled(callback?: Action<boolean>): Promise<boolean>
112
128
  showHttpPrompt(options?: AutoPromptOptions): Promise<void>
113
129
  registerForPushNotifications(options?: RegisterOptions): Promise<void>
@@ -127,7 +143,7 @@ interface IOneSignal {
127
143
  showSmsSlidedown(options?: AutoPromptOptions): Promise<void>
128
144
  showEmailSlidedown(options?: AutoPromptOptions): Promise<void>
129
145
  showSmsAndEmailSlidedown(options?: AutoPromptOptions): Promise<void>
130
- getNotificationPermission(onComplete?: Function): Promise<NotificationPermission>
146
+ getNotificationPermission(onComplete?: Action<NotificationPermission>): Promise<NotificationPermission>
131
147
  getUserId(callback?: Action<string | undefined | null>): Promise<string | undefined | null>
132
148
  getSubscription(callback?: Action<boolean>): Promise<boolean>
133
149
  setEmail(email: string, options?: SetEmailOptions): Promise<string|null>
@@ -146,10 +162,10 @@ interface IOneSignal {
146
162
 
147
163
 
148
164
 
149
- function on(event: string, listener: Function): void {
165
+ function on(event: string, listener: () => void): void {
150
166
  if (!doesOneSignalExist()) {
151
167
  reactOneSignalFunctionQueue.push({
152
- name: "on",
168
+ name: 'on',
153
169
  args: arguments,
154
170
  });
155
171
  return;
@@ -158,12 +174,12 @@ interface IOneSignal {
158
174
  window["OneSignal"].push(() => {
159
175
  window["OneSignal"].on(event, listener)
160
176
  });
161
- };
177
+ }
162
178
 
163
- function off(event: string, listener: Function): void {
179
+ function off(event: string, listener: () => void): void {
164
180
  if (!doesOneSignalExist()) {
165
181
  reactOneSignalFunctionQueue.push({
166
- name: "off",
182
+ name: 'off',
167
183
  args: arguments,
168
184
  });
169
185
  return;
@@ -172,12 +188,12 @@ interface IOneSignal {
172
188
  window["OneSignal"].push(() => {
173
189
  window["OneSignal"].off(event, listener)
174
190
  });
175
- };
191
+ }
176
192
 
177
- function once(event: string, listener: Function): void {
193
+ function once(event: string, listener: () => void): void {
178
194
  if (!doesOneSignalExist()) {
179
195
  reactOneSignalFunctionQueue.push({
180
- name: "once",
196
+ name: 'once',
181
197
  args: arguments,
182
198
  });
183
199
  return;
@@ -186,13 +202,18 @@ interface IOneSignal {
186
202
  window["OneSignal"].push(() => {
187
203
  window["OneSignal"].once(event, listener)
188
204
  });
189
- };
205
+ }
190
206
 
191
207
  function isPushNotificationsEnabled(callback?: Action<boolean>): Promise<boolean> {
192
208
  return new Promise((resolve, reject) => {
209
+ if (isOneSignalScriptFailed) {
210
+ resolve();
211
+ return;
212
+ }
213
+
193
214
  if (!doesOneSignalExist()) {
194
215
  reactOneSignalFunctionQueue.push({
195
- name: "isPushNotificationsEnabled",
216
+ name: 'isPushNotificationsEnabled',
196
217
  args: arguments,
197
218
  promiseResolver: resolve,
198
219
  });
@@ -209,13 +230,18 @@ interface IOneSignal {
209
230
  reject(error);
210
231
  }
211
232
  });
212
- };
233
+ }
213
234
 
214
235
  function showHttpPrompt(options?: AutoPromptOptions): Promise<void> {
215
236
  return new Promise((resolve, reject) => {
237
+ if (isOneSignalScriptFailed) {
238
+ resolve();
239
+ return;
240
+ }
241
+
216
242
  if (!doesOneSignalExist()) {
217
243
  reactOneSignalFunctionQueue.push({
218
- name: "showHttpPrompt",
244
+ name: 'showHttpPrompt',
219
245
  args: arguments,
220
246
  promiseResolver: resolve,
221
247
  });
@@ -232,13 +258,18 @@ interface IOneSignal {
232
258
  reject(error);
233
259
  }
234
260
  });
235
- };
261
+ }
236
262
 
237
263
  function registerForPushNotifications(options?: RegisterOptions): Promise<void> {
238
264
  return new Promise((resolve, reject) => {
265
+ if (isOneSignalScriptFailed) {
266
+ resolve();
267
+ return;
268
+ }
269
+
239
270
  if (!doesOneSignalExist()) {
240
271
  reactOneSignalFunctionQueue.push({
241
- name: "registerForPushNotifications",
272
+ name: 'registerForPushNotifications',
242
273
  args: arguments,
243
274
  promiseResolver: resolve,
244
275
  });
@@ -255,13 +286,18 @@ interface IOneSignal {
255
286
  reject(error);
256
287
  }
257
288
  });
258
- };
289
+ }
259
290
 
260
291
  function setDefaultNotificationUrl(url: string): Promise<void> {
261
292
  return new Promise((resolve, reject) => {
293
+ if (isOneSignalScriptFailed) {
294
+ resolve();
295
+ return;
296
+ }
297
+
262
298
  if (!doesOneSignalExist()) {
263
299
  reactOneSignalFunctionQueue.push({
264
- name: "setDefaultNotificationUrl",
300
+ name: 'setDefaultNotificationUrl',
265
301
  args: arguments,
266
302
  promiseResolver: resolve,
267
303
  });
@@ -278,13 +314,18 @@ interface IOneSignal {
278
314
  reject(error);
279
315
  }
280
316
  });
281
- };
317
+ }
282
318
 
283
319
  function setDefaultTitle(title: string): Promise<void> {
284
320
  return new Promise((resolve, reject) => {
321
+ if (isOneSignalScriptFailed) {
322
+ resolve();
323
+ return;
324
+ }
325
+
285
326
  if (!doesOneSignalExist()) {
286
327
  reactOneSignalFunctionQueue.push({
287
- name: "setDefaultTitle",
328
+ name: 'setDefaultTitle',
288
329
  args: arguments,
289
330
  promiseResolver: resolve,
290
331
  });
@@ -301,13 +342,18 @@ interface IOneSignal {
301
342
  reject(error);
302
343
  }
303
344
  });
304
- };
345
+ }
305
346
 
306
347
  function getTags(callback?: Action<any>): Promise<void> {
307
348
  return new Promise((resolve, reject) => {
349
+ if (isOneSignalScriptFailed) {
350
+ resolve();
351
+ return;
352
+ }
353
+
308
354
  if (!doesOneSignalExist()) {
309
355
  reactOneSignalFunctionQueue.push({
310
- name: "getTags",
356
+ name: 'getTags',
311
357
  args: arguments,
312
358
  promiseResolver: resolve,
313
359
  });
@@ -324,13 +370,18 @@ interface IOneSignal {
324
370
  reject(error);
325
371
  }
326
372
  });
327
- };
373
+ }
328
374
 
329
375
  function sendTag(key: string, value: any, callback?: Action<Object>): Promise<Object | null> {
330
376
  return new Promise((resolve, reject) => {
377
+ if (isOneSignalScriptFailed) {
378
+ resolve();
379
+ return;
380
+ }
381
+
331
382
  if (!doesOneSignalExist()) {
332
383
  reactOneSignalFunctionQueue.push({
333
- name: "sendTag",
384
+ name: 'sendTag',
334
385
  args: arguments,
335
386
  promiseResolver: resolve,
336
387
  });
@@ -347,13 +398,18 @@ interface IOneSignal {
347
398
  reject(error);
348
399
  }
349
400
  });
350
- };
401
+ }
351
402
 
352
403
  function sendTags(tags: TagsObject<any>, callback?: Action<Object>): Promise<Object | null> {
353
404
  return new Promise((resolve, reject) => {
405
+ if (isOneSignalScriptFailed) {
406
+ resolve();
407
+ return;
408
+ }
409
+
354
410
  if (!doesOneSignalExist()) {
355
411
  reactOneSignalFunctionQueue.push({
356
- name: "sendTags",
412
+ name: 'sendTags',
357
413
  args: arguments,
358
414
  promiseResolver: resolve,
359
415
  });
@@ -370,13 +426,18 @@ interface IOneSignal {
370
426
  reject(error);
371
427
  }
372
428
  });
373
- };
429
+ }
374
430
 
375
431
  function deleteTag(tag: string): Promise<Array<string>> {
376
432
  return new Promise((resolve, reject) => {
433
+ if (isOneSignalScriptFailed) {
434
+ resolve();
435
+ return;
436
+ }
437
+
377
438
  if (!doesOneSignalExist()) {
378
439
  reactOneSignalFunctionQueue.push({
379
- name: "deleteTag",
440
+ name: 'deleteTag',
380
441
  args: arguments,
381
442
  promiseResolver: resolve,
382
443
  });
@@ -393,13 +454,18 @@ interface IOneSignal {
393
454
  reject(error);
394
455
  }
395
456
  });
396
- };
457
+ }
397
458
 
398
459
  function deleteTags(tags: Array<string>, callback?: Action<Array<string>>): Promise<Array<string>> {
399
460
  return new Promise((resolve, reject) => {
461
+ if (isOneSignalScriptFailed) {
462
+ resolve();
463
+ return;
464
+ }
465
+
400
466
  if (!doesOneSignalExist()) {
401
467
  reactOneSignalFunctionQueue.push({
402
- name: "deleteTags",
468
+ name: 'deleteTags',
403
469
  args: arguments,
404
470
  promiseResolver: resolve,
405
471
  });
@@ -416,13 +482,18 @@ interface IOneSignal {
416
482
  reject(error);
417
483
  }
418
484
  });
419
- };
485
+ }
420
486
 
421
487
  function addListenerForNotificationOpened(callback?: Action<Notification>): Promise<void> {
422
488
  return new Promise((resolve, reject) => {
489
+ if (isOneSignalScriptFailed) {
490
+ resolve();
491
+ return;
492
+ }
493
+
423
494
  if (!doesOneSignalExist()) {
424
495
  reactOneSignalFunctionQueue.push({
425
- name: "addListenerForNotificationOpened",
496
+ name: 'addListenerForNotificationOpened',
426
497
  args: arguments,
427
498
  promiseResolver: resolve,
428
499
  });
@@ -439,13 +510,18 @@ interface IOneSignal {
439
510
  reject(error);
440
511
  }
441
512
  });
442
- };
513
+ }
443
514
 
444
515
  function setSubscription(newSubscription: boolean): Promise<void> {
445
516
  return new Promise((resolve, reject) => {
517
+ if (isOneSignalScriptFailed) {
518
+ resolve();
519
+ return;
520
+ }
521
+
446
522
  if (!doesOneSignalExist()) {
447
523
  reactOneSignalFunctionQueue.push({
448
- name: "setSubscription",
524
+ name: 'setSubscription',
449
525
  args: arguments,
450
526
  promiseResolver: resolve,
451
527
  });
@@ -462,13 +538,18 @@ interface IOneSignal {
462
538
  reject(error);
463
539
  }
464
540
  });
465
- };
541
+ }
466
542
 
467
543
  function showHttpPermissionRequest(options?: AutoPromptOptions): Promise<any> {
468
544
  return new Promise((resolve, reject) => {
545
+ if (isOneSignalScriptFailed) {
546
+ resolve();
547
+ return;
548
+ }
549
+
469
550
  if (!doesOneSignalExist()) {
470
551
  reactOneSignalFunctionQueue.push({
471
- name: "showHttpPermissionRequest",
552
+ name: 'showHttpPermissionRequest',
472
553
  args: arguments,
473
554
  promiseResolver: resolve,
474
555
  });
@@ -485,13 +566,18 @@ interface IOneSignal {
485
566
  reject(error);
486
567
  }
487
568
  });
488
- };
569
+ }
489
570
 
490
571
  function showNativePrompt(): Promise<void> {
491
572
  return new Promise((resolve, reject) => {
573
+ if (isOneSignalScriptFailed) {
574
+ resolve();
575
+ return;
576
+ }
577
+
492
578
  if (!doesOneSignalExist()) {
493
579
  reactOneSignalFunctionQueue.push({
494
- name: "showNativePrompt",
580
+ name: 'showNativePrompt',
495
581
  args: arguments,
496
582
  promiseResolver: resolve,
497
583
  });
@@ -508,13 +594,18 @@ interface IOneSignal {
508
594
  reject(error);
509
595
  }
510
596
  });
511
- };
597
+ }
512
598
 
513
599
  function showSlidedownPrompt(options?: AutoPromptOptions): Promise<void> {
514
600
  return new Promise((resolve, reject) => {
601
+ if (isOneSignalScriptFailed) {
602
+ resolve();
603
+ return;
604
+ }
605
+
515
606
  if (!doesOneSignalExist()) {
516
607
  reactOneSignalFunctionQueue.push({
517
- name: "showSlidedownPrompt",
608
+ name: 'showSlidedownPrompt',
518
609
  args: arguments,
519
610
  promiseResolver: resolve,
520
611
  });
@@ -531,13 +622,18 @@ interface IOneSignal {
531
622
  reject(error);
532
623
  }
533
624
  });
534
- };
625
+ }
535
626
 
536
627
  function showCategorySlidedown(options?: AutoPromptOptions): Promise<void> {
537
628
  return new Promise((resolve, reject) => {
629
+ if (isOneSignalScriptFailed) {
630
+ resolve();
631
+ return;
632
+ }
633
+
538
634
  if (!doesOneSignalExist()) {
539
635
  reactOneSignalFunctionQueue.push({
540
- name: "showCategorySlidedown",
636
+ name: 'showCategorySlidedown',
541
637
  args: arguments,
542
638
  promiseResolver: resolve,
543
639
  });
@@ -554,13 +650,18 @@ interface IOneSignal {
554
650
  reject(error);
555
651
  }
556
652
  });
557
- };
653
+ }
558
654
 
559
655
  function showSmsSlidedown(options?: AutoPromptOptions): Promise<void> {
560
656
  return new Promise((resolve, reject) => {
657
+ if (isOneSignalScriptFailed) {
658
+ resolve();
659
+ return;
660
+ }
661
+
561
662
  if (!doesOneSignalExist()) {
562
663
  reactOneSignalFunctionQueue.push({
563
- name: "showSmsSlidedown",
664
+ name: 'showSmsSlidedown',
564
665
  args: arguments,
565
666
  promiseResolver: resolve,
566
667
  });
@@ -577,13 +678,18 @@ interface IOneSignal {
577
678
  reject(error);
578
679
  }
579
680
  });
580
- };
681
+ }
581
682
 
582
683
  function showEmailSlidedown(options?: AutoPromptOptions): Promise<void> {
583
684
  return new Promise((resolve, reject) => {
685
+ if (isOneSignalScriptFailed) {
686
+ resolve();
687
+ return;
688
+ }
689
+
584
690
  if (!doesOneSignalExist()) {
585
691
  reactOneSignalFunctionQueue.push({
586
- name: "showEmailSlidedown",
692
+ name: 'showEmailSlidedown',
587
693
  args: arguments,
588
694
  promiseResolver: resolve,
589
695
  });
@@ -600,13 +706,18 @@ interface IOneSignal {
600
706
  reject(error);
601
707
  }
602
708
  });
603
- };
709
+ }
604
710
 
605
711
  function showSmsAndEmailSlidedown(options?: AutoPromptOptions): Promise<void> {
606
712
  return new Promise((resolve, reject) => {
713
+ if (isOneSignalScriptFailed) {
714
+ resolve();
715
+ return;
716
+ }
717
+
607
718
  if (!doesOneSignalExist()) {
608
719
  reactOneSignalFunctionQueue.push({
609
- name: "showSmsAndEmailSlidedown",
720
+ name: 'showSmsAndEmailSlidedown',
610
721
  args: arguments,
611
722
  promiseResolver: resolve,
612
723
  });
@@ -623,13 +734,18 @@ interface IOneSignal {
623
734
  reject(error);
624
735
  }
625
736
  });
626
- };
737
+ }
627
738
 
628
- function getNotificationPermission(onComplete?: Function): Promise<NotificationPermission> {
739
+ function getNotificationPermission(onComplete?: Action<NotificationPermission>): Promise<NotificationPermission> {
629
740
  return new Promise((resolve, reject) => {
741
+ if (isOneSignalScriptFailed) {
742
+ resolve();
743
+ return;
744
+ }
745
+
630
746
  if (!doesOneSignalExist()) {
631
747
  reactOneSignalFunctionQueue.push({
632
- name: "getNotificationPermission",
748
+ name: 'getNotificationPermission',
633
749
  args: arguments,
634
750
  promiseResolver: resolve,
635
751
  });
@@ -646,13 +762,18 @@ interface IOneSignal {
646
762
  reject(error);
647
763
  }
648
764
  });
649
- };
765
+ }
650
766
 
651
767
  function getUserId(callback?: Action<string | undefined | null>): Promise<string | undefined | null> {
652
768
  return new Promise((resolve, reject) => {
769
+ if (isOneSignalScriptFailed) {
770
+ resolve();
771
+ return;
772
+ }
773
+
653
774
  if (!doesOneSignalExist()) {
654
775
  reactOneSignalFunctionQueue.push({
655
- name: "getUserId",
776
+ name: 'getUserId',
656
777
  args: arguments,
657
778
  promiseResolver: resolve,
658
779
  });
@@ -669,13 +790,18 @@ interface IOneSignal {
669
790
  reject(error);
670
791
  }
671
792
  });
672
- };
793
+ }
673
794
 
674
795
  function getSubscription(callback?: Action<boolean>): Promise<boolean> {
675
796
  return new Promise((resolve, reject) => {
797
+ if (isOneSignalScriptFailed) {
798
+ resolve();
799
+ return;
800
+ }
801
+
676
802
  if (!doesOneSignalExist()) {
677
803
  reactOneSignalFunctionQueue.push({
678
- name: "getSubscription",
804
+ name: 'getSubscription',
679
805
  args: arguments,
680
806
  promiseResolver: resolve,
681
807
  });
@@ -692,13 +818,18 @@ interface IOneSignal {
692
818
  reject(error);
693
819
  }
694
820
  });
695
- };
821
+ }
696
822
 
697
823
  function setEmail(email: string, options?: SetEmailOptions): Promise<string|null> {
698
824
  return new Promise((resolve, reject) => {
825
+ if (isOneSignalScriptFailed) {
826
+ resolve();
827
+ return;
828
+ }
829
+
699
830
  if (!doesOneSignalExist()) {
700
831
  reactOneSignalFunctionQueue.push({
701
- name: "setEmail",
832
+ name: 'setEmail',
702
833
  args: arguments,
703
834
  promiseResolver: resolve,
704
835
  });
@@ -715,13 +846,18 @@ interface IOneSignal {
715
846
  reject(error);
716
847
  }
717
848
  });
718
- };
849
+ }
719
850
 
720
851
  function setSMSNumber(smsNumber: string, options?: SetSMSOptions): Promise<string | null> {
721
852
  return new Promise((resolve, reject) => {
853
+ if (isOneSignalScriptFailed) {
854
+ resolve();
855
+ return;
856
+ }
857
+
722
858
  if (!doesOneSignalExist()) {
723
859
  reactOneSignalFunctionQueue.push({
724
- name: "setSMSNumber",
860
+ name: 'setSMSNumber',
725
861
  args: arguments,
726
862
  promiseResolver: resolve,
727
863
  });
@@ -738,13 +874,18 @@ interface IOneSignal {
738
874
  reject(error);
739
875
  }
740
876
  });
741
- };
877
+ }
742
878
 
743
879
  function logoutEmail(): Promise<void> {
744
880
  return new Promise((resolve, reject) => {
881
+ if (isOneSignalScriptFailed) {
882
+ resolve();
883
+ return;
884
+ }
885
+
745
886
  if (!doesOneSignalExist()) {
746
887
  reactOneSignalFunctionQueue.push({
747
- name: "logoutEmail",
888
+ name: 'logoutEmail',
748
889
  args: arguments,
749
890
  promiseResolver: resolve,
750
891
  });
@@ -761,13 +902,18 @@ interface IOneSignal {
761
902
  reject(error);
762
903
  }
763
904
  });
764
- };
905
+ }
765
906
 
766
907
  function logoutSMS(): Promise<void> {
767
908
  return new Promise((resolve, reject) => {
909
+ if (isOneSignalScriptFailed) {
910
+ resolve();
911
+ return;
912
+ }
913
+
768
914
  if (!doesOneSignalExist()) {
769
915
  reactOneSignalFunctionQueue.push({
770
- name: "logoutSMS",
916
+ name: 'logoutSMS',
771
917
  args: arguments,
772
918
  promiseResolver: resolve,
773
919
  });
@@ -784,13 +930,18 @@ interface IOneSignal {
784
930
  reject(error);
785
931
  }
786
932
  });
787
- };
933
+ }
788
934
 
789
935
  function setExternalUserId(externalUserId: string | undefined | null, authHash?: string): Promise<void> {
790
936
  return new Promise((resolve, reject) => {
937
+ if (isOneSignalScriptFailed) {
938
+ resolve();
939
+ return;
940
+ }
941
+
791
942
  if (!doesOneSignalExist()) {
792
943
  reactOneSignalFunctionQueue.push({
793
- name: "setExternalUserId",
944
+ name: 'setExternalUserId',
794
945
  args: arguments,
795
946
  promiseResolver: resolve,
796
947
  });
@@ -807,13 +958,18 @@ interface IOneSignal {
807
958
  reject(error);
808
959
  }
809
960
  });
810
- };
961
+ }
811
962
 
812
963
  function removeExternalUserId(): Promise<void> {
813
964
  return new Promise((resolve, reject) => {
965
+ if (isOneSignalScriptFailed) {
966
+ resolve();
967
+ return;
968
+ }
969
+
814
970
  if (!doesOneSignalExist()) {
815
971
  reactOneSignalFunctionQueue.push({
816
- name: "removeExternalUserId",
972
+ name: 'removeExternalUserId',
817
973
  args: arguments,
818
974
  promiseResolver: resolve,
819
975
  });
@@ -830,13 +986,18 @@ interface IOneSignal {
830
986
  reject(error);
831
987
  }
832
988
  });
833
- };
989
+ }
834
990
 
835
991
  function getExternalUserId(): Promise<string | undefined | null> {
836
992
  return new Promise((resolve, reject) => {
993
+ if (isOneSignalScriptFailed) {
994
+ resolve();
995
+ return;
996
+ }
997
+
837
998
  if (!doesOneSignalExist()) {
838
999
  reactOneSignalFunctionQueue.push({
839
- name: "getExternalUserId",
1000
+ name: 'getExternalUserId',
840
1001
  args: arguments,
841
1002
  promiseResolver: resolve,
842
1003
  });
@@ -853,13 +1014,18 @@ interface IOneSignal {
853
1014
  reject(error);
854
1015
  }
855
1016
  });
856
- };
1017
+ }
857
1018
 
858
1019
  function provideUserConsent(consent: boolean): Promise<void> {
859
1020
  return new Promise((resolve, reject) => {
1021
+ if (isOneSignalScriptFailed) {
1022
+ resolve();
1023
+ return;
1024
+ }
1025
+
860
1026
  if (!doesOneSignalExist()) {
861
1027
  reactOneSignalFunctionQueue.push({
862
- name: "provideUserConsent",
1028
+ name: 'provideUserConsent',
863
1029
  args: arguments,
864
1030
  promiseResolver: resolve,
865
1031
  });
@@ -876,13 +1042,18 @@ interface IOneSignal {
876
1042
  reject(error);
877
1043
  }
878
1044
  });
879
- };
1045
+ }
880
1046
 
881
1047
  function getEmailId(callback?: Action<string | undefined>): Promise<string | null | undefined> {
882
1048
  return new Promise((resolve, reject) => {
1049
+ if (isOneSignalScriptFailed) {
1050
+ resolve();
1051
+ return;
1052
+ }
1053
+
883
1054
  if (!doesOneSignalExist()) {
884
1055
  reactOneSignalFunctionQueue.push({
885
- name: "getEmailId",
1056
+ name: 'getEmailId',
886
1057
  args: arguments,
887
1058
  promiseResolver: resolve,
888
1059
  });
@@ -899,13 +1070,18 @@ interface IOneSignal {
899
1070
  reject(error);
900
1071
  }
901
1072
  });
902
- };
1073
+ }
903
1074
 
904
1075
  function getSMSId(callback?: Action<string | undefined>): Promise<string | null | undefined> {
905
1076
  return new Promise((resolve, reject) => {
1077
+ if (isOneSignalScriptFailed) {
1078
+ resolve();
1079
+ return;
1080
+ }
1081
+
906
1082
  if (!doesOneSignalExist()) {
907
1083
  reactOneSignalFunctionQueue.push({
908
- name: "getSMSId",
1084
+ name: 'getSMSId',
909
1085
  args: arguments,
910
1086
  promiseResolver: resolve,
911
1087
  });
@@ -922,13 +1098,18 @@ interface IOneSignal {
922
1098
  reject(error);
923
1099
  }
924
1100
  });
925
- };
1101
+ }
926
1102
 
927
1103
  function sendOutcome(outcomeName: string, outcomeWeight?: number | undefined): Promise<void> {
928
1104
  return new Promise((resolve, reject) => {
1105
+ if (isOneSignalScriptFailed) {
1106
+ resolve();
1107
+ return;
1108
+ }
1109
+
929
1110
  if (!doesOneSignalExist()) {
930
1111
  reactOneSignalFunctionQueue.push({
931
- name: "sendOutcome",
1112
+ name: 'sendOutcome',
932
1113
  args: arguments,
933
1114
  promiseResolver: resolve,
934
1115
  });
@@ -945,7 +1126,7 @@ interface IOneSignal {
945
1126
  reject(error);
946
1127
  }
947
1128
  });
948
- };
1129
+ }
949
1130
 
950
1131
  const OneSignalReact: IOneSignal = {
951
1132
  init,