@trycourier/courier-react-native 5.4.3 → 5.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/android/build.gradle +2 -2
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/java/com/courierreactnative/CourierClientModule.kt +298 -303
  4. package/android/src/main/java/com/courierreactnative/CourierSharedModule.kt +194 -165
  5. package/android/src/main/java/com/courierreactnative/Utils.kt +1 -1
  6. package/courier-react-native.podspec +1 -1
  7. package/ios/CourierReactNativeDelegate.m +12 -8
  8. package/ios/CourierReactNativeEventEmitter.swift +1 -1
  9. package/ios/CourierReactNativeModule.m +3 -5
  10. package/ios/CourierSharedModule.swift +88 -112
  11. package/lib/commonjs/index.js +75 -93
  12. package/lib/commonjs/index.js.map +1 -1
  13. package/lib/commonjs/models/CourierInboxListener.js +1 -0
  14. package/lib/commonjs/models/CourierInboxListener.js.map +1 -1
  15. package/lib/commonjs/models/InboxAction.js +22 -0
  16. package/lib/commonjs/models/InboxAction.js.map +1 -1
  17. package/lib/commonjs/models/InboxMessage.js +64 -0
  18. package/lib/commonjs/models/InboxMessage.js.map +1 -1
  19. package/lib/commonjs/models/InboxMessageEvent.js +2 -0
  20. package/lib/commonjs/models/InboxMessageEvent.js.map +1 -0
  21. package/lib/commonjs/views/CourierInboxView.js +6 -4
  22. package/lib/commonjs/views/CourierInboxView.js.map +1 -1
  23. package/lib/example/src/App.js +11 -0
  24. package/lib/example/src/Emitter.js +11 -0
  25. package/lib/example/src/Env.js +6 -0
  26. package/lib/example/src/Home.js +67 -0
  27. package/lib/example/src/Poke.js +75 -0
  28. package/lib/example/src/Tabs.js +36 -0
  29. package/lib/example/src/Utils.js +71 -0
  30. package/lib/example/src/pages/Auth.js +224 -0
  31. package/lib/example/src/pages/Inbox.js +38 -0
  32. package/lib/example/src/pages/Preferences.js +13 -0
  33. package/lib/example/src/pages/PreferencesStack.js +11 -0
  34. package/lib/example/src/pages/Push.js +93 -0
  35. package/lib/example/src/pages/Styles.js +26 -0
  36. package/lib/example/src/pages/Tests.js +1068 -0
  37. package/lib/example/src/pages/inbox/InboxCustom.js +141 -0
  38. package/lib/example/src/pages/inbox/InboxDefault.js +22 -0
  39. package/lib/example/src/pages/inbox/InboxStyled.js +220 -0
  40. package/lib/example/src/pages/preferences/PreferencesCustom.js +91 -0
  41. package/lib/example/src/pages/preferences/PreferencesDefault.js +17 -0
  42. package/lib/example/src/pages/preferences/PreferencesDetail.js +127 -0
  43. package/lib/example/src/pages/preferences/PreferencesStyled.js +110 -0
  44. package/lib/module/index.js +67 -90
  45. package/lib/module/index.js.map +1 -1
  46. package/lib/module/models/CourierInboxListener.js +1 -0
  47. package/lib/module/models/CourierInboxListener.js.map +1 -1
  48. package/lib/module/models/InboxAction.js +16 -1
  49. package/lib/module/models/InboxAction.js.map +1 -1
  50. package/lib/module/models/InboxMessage.js +61 -1
  51. package/lib/module/models/InboxMessage.js.map +1 -1
  52. package/lib/module/models/InboxMessageEvent.js +2 -0
  53. package/lib/module/models/InboxMessageEvent.js.map +1 -0
  54. package/lib/module/views/CourierInboxView.js +6 -4
  55. package/lib/module/views/CourierInboxView.js.map +1 -1
  56. package/lib/package.json +171 -0
  57. package/lib/src/Broadcaster.js +24 -0
  58. package/lib/src/Modules.js +26 -0
  59. package/lib/src/client/BrandClient.js +17 -0
  60. package/lib/src/client/ClientModule.js +14 -0
  61. package/lib/src/client/CourierClient.js +31 -0
  62. package/lib/src/client/InboxClient.js +99 -0
  63. package/lib/src/client/PreferenceClient.js +63 -0
  64. package/lib/src/client/TokenClient.js +27 -0
  65. package/lib/src/client/TrackingClient.js +17 -0
  66. package/lib/src/index.js +567 -0
  67. package/lib/src/models/Android_CourierSheet.js +1 -0
  68. package/lib/src/models/CourierAuthenticationListener.js +14 -0
  69. package/lib/src/models/CourierBrand.js +1 -0
  70. package/lib/src/models/CourierButton.js +1 -0
  71. package/lib/src/models/CourierDevice.js +1 -0
  72. package/lib/src/models/CourierFont.js +1 -0
  73. package/lib/src/models/CourierInboxListener.js +20 -0
  74. package/lib/src/models/CourierInboxMessages.js +1 -0
  75. package/lib/src/models/CourierInboxTheme.js +1 -0
  76. package/lib/src/models/CourierInfoViewStyle.js +1 -0
  77. package/lib/src/models/CourierPaging.js +1 -0
  78. package/lib/src/models/CourierPreferencesTheme.js +1 -0
  79. package/lib/src/models/CourierPushListener.js +14 -0
  80. package/lib/src/models/CourierPushProvider.js +8 -0
  81. package/lib/src/models/CourierTrackingEvent.js +8 -0
  82. package/lib/src/models/CourierUserPreferences.js +51 -0
  83. package/lib/src/models/InboxAction.js +1 -0
  84. package/lib/src/models/InboxMessage.js +1 -0
  85. package/lib/src/models/InboxMessageFeed.js +1 -0
  86. package/lib/src/models/InboxMessageSet.js +1 -0
  87. package/lib/src/models/iOS_CourierCell.js +1 -0
  88. package/lib/src/models/iOS_CourierSheet.js +1 -0
  89. package/lib/src/utils.js +27 -0
  90. package/lib/src/views/CourierInboxView.js +75 -0
  91. package/lib/src/views/CourierPreferencesView.js +33 -0
  92. package/lib/typescript/src/index.d.ts +16 -20
  93. package/lib/typescript/src/index.d.ts.map +1 -1
  94. package/lib/typescript/src/models/CourierInboxListener.d.ts +4 -7
  95. package/lib/typescript/src/models/CourierInboxListener.d.ts.map +1 -1
  96. package/lib/typescript/src/models/InboxAction.d.ts +8 -4
  97. package/lib/typescript/src/models/InboxAction.d.ts.map +1 -1
  98. package/lib/typescript/src/models/InboxMessage.d.ts +28 -14
  99. package/lib/typescript/src/models/InboxMessage.d.ts.map +1 -1
  100. package/lib/typescript/src/models/InboxMessageEvent.d.ts +2 -0
  101. package/lib/typescript/src/models/InboxMessageEvent.d.ts.map +1 -0
  102. package/lib/typescript/src/models/InboxMessageFeed.d.ts +1 -1
  103. package/lib/typescript/src/models/InboxMessageFeed.d.ts.map +1 -1
  104. package/package.json +3 -2
  105. package/src/index.tsx +61 -99
  106. package/src/models/CourierInboxListener.tsx +10 -13
  107. package/src/models/InboxAction.tsx +28 -4
  108. package/src/models/InboxMessage.tsx +102 -14
  109. package/src/models/InboxMessageEvent.tsx +1 -0
  110. package/src/models/InboxMessageFeed.tsx +1 -1
  111. package/src/views/CourierInboxView.tsx +4 -4
  112. package/ios/CourierReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  113. package/ios/CourierReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  114. package/ios/CourierReactNative.xcodeproj/project.xcworkspace/xcuserdata/mike.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  115. package/ios/CourierReactNative.xcodeproj/xcuserdata/mike.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
package/src/index.tsx CHANGED
@@ -14,9 +14,9 @@ import Broadcaster from './Broadcaster';
14
14
  import { CourierClient } from './client/CourierClient';
15
15
  import { Events, CourierUtils } from './utils';
16
16
  import { InboxMessageFeed } from './models/InboxMessageFeed';
17
- import { InboxMessageSet } from './models/InboxMessageSet';
17
+ import { InboxMessageEvent } from './models/InboxMessageEvent';
18
18
 
19
- export { CourierClient } from './client/CourierClient';
19
+ export { CourierClient } from './client/CourierClient' ;
20
20
  export { BrandClient } from './client/BrandClient';
21
21
  export { CourierBrandResponse } from './models/CourierBrand';
22
22
  export { CourierDevice } from './models/CourierDevice';
@@ -37,8 +37,9 @@ export { CourierButton } from './models/CourierButton';
37
37
  export { CourierInfoViewStyle } from './models/CourierInfoViewStyle';
38
38
  export { iOS_CourierCell } from './models/iOS_CourierCell';
39
39
  export { iOS_CourierSheet } from './models/iOS_CourierSheet';
40
- export { InboxMessageSet } from './models/InboxMessageSet';
41
40
  export { InboxMessage } from './models/InboxMessage';
41
+ export { InboxMessageFeed } from './models/InboxMessageFeed';
42
+ export { InboxMessageEvent } from './models/InboxMessageEvent';
42
43
  export { CourierInboxButtonStyle, CourierInboxTextStyle, CourierInboxUnreadIndicatorStyle, CourierInboxTheme } from './models/CourierInboxTheme';
43
44
  export { CourierPreferencesTheme, CourierPreferencesMode, CourierPreferencesChannel } from './models/CourierPreferencesTheme';
44
45
  export type iOSForegroundPresentationOptions = 'sound' | 'badge' | 'list' | 'banner';
@@ -508,144 +509,109 @@ class Courier {
508
509
  }
509
510
 
510
511
  /**
511
- * Adds a listener for inbox changes.
512
+ * Adds a listener for inbox changes (aligned with the updated native iOS/Swift callbacks).
512
513
  * @param {Object} props - The properties object.
513
- * @param {Function} [props.onInitialLoad] - Callback function called when the inbox is initially loaded.
514
- * @param {Function} [props.onError] - Callback function called when an error occurs. Receives the error message as a parameter.
515
- * @param {Function} [props.onUnreadCountChanged] - Callback function called when the unread count changes.
516
- * @param {Function} [props.onFeedChanged] - Callback function called when the feed changes.
517
- * @param {Function} [props.onArchiveChanged] - Callback function called when the archive changes.
518
- * @param {Function} [props.onPageAdded] - Callback function called when a new page is added.
519
- * @param {Function} [props.onMessageChanged] - Callback function called when a message changes.
520
- * @param {Function} [props.onMessageAdded] - Callback function called when a new message is added.
521
- * @param {Function} [props.onMessageRemoved] - Callback function called when a message is removed.
514
+ * @param {Function} [props.onLoading] - Called when loading or refreshing begins. Receives isRefresh (boolean).
515
+ * @param {Function} [props.onError] - Called when an error occurs. Receives the error message (string).
516
+ * @param {Function} [props.onUnreadCountChanged] - Called when unread count changes. Receives unreadCount (number).
517
+ * @param {Function} [props.onTotalCountChanged] - Called when total message count changes. Receives totalCount (number) and feed ("feed" or "archive").
518
+ * @param {Function} [props.onMessagesChanged] - Called when messages in a feed change. Receives an InboxMessageSet and feed name.
519
+ * @param {Function} [props.onPageAdded] - Called when a new page of messages is added. Receives an InboxMessageSet, feed name, and isFirstPage (boolean).
520
+ * @param {Function} [props.onMessageEvent] - Called for message-level changes (add/remove/update). Receives a message, index, feed name, and event string.
522
521
  * @returns {CourierInboxListener} A listener object that can be used to remove the listener later.
523
522
  */
524
523
  public async addInboxListener(props: {
525
- onInitialLoad?: (isRefresh: boolean) => void,
524
+ onLoading?: (isRefresh: boolean) => void,
526
525
  onError?: (error: string) => void,
527
526
  onUnreadCountChanged?: (unreadCount: number) => void,
528
- onFeedChanged?: (messageSet: InboxMessageSet) => void,
529
- onArchiveChanged?: (messageSet: InboxMessageSet) => void,
530
- onPageAdded?: (feed: InboxMessageFeed, messageSet: InboxMessageSet) => void,
531
- onMessageChanged?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void,
532
- onMessageAdded?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void,
533
- onMessageRemoved?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void
527
+ onTotalCountChanged?: (totalCount: number, feed: string) => void,
528
+ onMessagesChanged?: (messages: InboxMessage[], canPaginate: boolean, feed: InboxMessageFeed) => void,
529
+ onPageAdded?: (messages: InboxMessage[], canPaginate: boolean, isFirstPage: boolean, feed: InboxMessageFeed) => void,
530
+ onMessageEvent?: (message: InboxMessage, index: number, feed: InboxMessageFeed, eventName: InboxMessageEvent) => void
534
531
  }): Promise<CourierInboxListener> {
535
532
 
533
+ // Generate a unique ID for the listener
536
534
  const listenerId = `inbox_${CourierUtils.generateUUID()}`;
537
535
 
536
+ // Generate unique channel IDs for each callback
538
537
  const listenerIds = {
539
538
  loading: `inbox_loading_${CourierUtils.generateUUID()}`,
540
539
  error: `inbox_error_${CourierUtils.generateUUID()}`,
541
540
  unreadCount: `inbox_unread_count_${CourierUtils.generateUUID()}`,
542
- feed: `inbox_feed_${CourierUtils.generateUUID()}`,
543
- archive: `inbox_archive_${CourierUtils.generateUUID()}`,
541
+ totalCount: `inbox_total_count_${CourierUtils.generateUUID()}`,
542
+ messagesChanged: `inbox_messages_changed_${CourierUtils.generateUUID()}`,
544
543
  pageAdded: `inbox_page_added_${CourierUtils.generateUUID()}`,
545
- messageChanged: `inbox_message_changed_${CourierUtils.generateUUID()}`,
546
- messageAdded: `inbox_message_added_${CourierUtils.generateUUID()}`,
547
- messageRemoved: `inbox_message_removed_${CourierUtils.generateUUID()}`
544
+ messageEvent: `inbox_message_event_${CourierUtils.generateUUID()}`,
548
545
  };
549
546
 
550
- // Create the initial listeners
547
+ // Create the CourierInboxListener instance
551
548
  const listener = new CourierInboxListener(listenerId);
552
549
 
553
- listener.onInitialLoad = await this.sharedBroadcaster.addListener(listenerIds.loading, (event: any) => {
554
- props.onInitialLoad?.(event);
550
+ // 1) onLoading
551
+ listener.onLoading = await this.sharedBroadcaster.addListener(listenerIds.loading, (event: any) => {
552
+ // event is simply the boolean "isRefresh"
553
+ props.onLoading?.(event);
555
554
  });
556
555
 
556
+ // 2) onError
557
557
  listener.onError = await this.sharedBroadcaster.addListener(listenerIds.error, (event: any) => {
558
+ // event is the error message (string)
558
559
  props.onError?.(event);
559
560
  });
560
561
 
562
+ // 3) onUnreadCountChanged
561
563
  listener.onUnreadCountChanged = await this.sharedBroadcaster.addListener(listenerIds.unreadCount, (event: any) => {
564
+ // event is the unread count (number)
562
565
  props.onUnreadCountChanged?.(event);
563
566
  });
564
567
 
565
- listener.onFeedChanged = await this.sharedBroadcaster.addListener(listenerIds.feed, (event: any) => {
566
- const convertedMessages = this.convertMessages(event.messages);
567
- const messageSet: InboxMessageSet = {
568
- messages: convertedMessages,
569
- totalMessageCount: event.totalMessageCount,
570
- canPaginate: event.canPaginate
571
- }
572
- props.onFeedChanged?.(messageSet);
568
+ // 4) onTotalCountChanged
569
+ listener.onTotalCountChanged = await this.sharedBroadcaster.addListener(listenerIds.totalCount, (event: any) => {
570
+ // event => { feed: "feed"|"archive", totalCount: number }
571
+ props.onTotalCountChanged?.(event.totalCount, event.feed);
573
572
  });
574
573
 
575
- listener.onArchiveChanged = await this.sharedBroadcaster.addListener(listenerIds.archive, (event: any) => {
574
+ // 5) onMessagesChanged
575
+ listener.onMessagesChanged = await this.sharedBroadcaster.addListener(listenerIds.messagesChanged, (event: any) => {
576
+ // event => { feed: "feed"|"archive", messages: any[], totalMessageCount: number, canPaginate: boolean }
576
577
  const convertedMessages = this.convertMessages(event.messages);
577
- const messageSet: InboxMessageSet = {
578
- messages: convertedMessages,
579
- totalMessageCount: event.totalMessageCount,
580
- canPaginate: event.canPaginate
581
- }
582
- props.onArchiveChanged?.(messageSet);
578
+ props.onMessagesChanged?.(convertedMessages, event.canPaginate, event.feed);
583
579
  });
584
580
 
581
+ // 6) onPageAdded
585
582
  listener.onPageAdded = await this.sharedBroadcaster.addListener(listenerIds.pageAdded, (event: any) => {
583
+ // event => { feed: "feed"|"archive", messages: any[], totalMessageCount: number, canPaginate: boolean, isFirstPage: boolean }
586
584
  const convertedMessages = this.convertMessages(event.messages);
587
- const messageSet: InboxMessageSet = {
588
- messages: convertedMessages,
589
- totalMessageCount: event.totalMessageCount,
590
- canPaginate: event.canPaginate
591
- }
592
- props.onPageAdded?.(event.feed === 'archived' ? 'archived' : 'feed', messageSet);
593
- });
594
-
595
- listener.onMessageChanged = await this.sharedBroadcaster.addListener(listenerIds.messageChanged, (event: any) => {
596
- const convertedMessage = this.convertMessage(event.message);
597
- props.onMessageChanged?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
598
- });
599
-
600
- listener.onMessageAdded = await this.sharedBroadcaster.addListener(listenerIds.messageAdded, (event: any) => {
601
- const convertedMessage = this.convertMessage(event.message);
602
- props.onMessageAdded?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
585
+ props.onPageAdded?.(convertedMessages, event.canPaginate, event.isFirstPage, event.feed);
603
586
  });
604
587
 
605
- listener.onMessageRemoved = await this.sharedBroadcaster.addListener(listenerIds.messageRemoved, (event: any) => {
606
- const convertedMessage = this.convertMessage(event.message);
607
- props.onMessageRemoved?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
588
+ // 7) onMessageEvent
589
+ listener.onMessageEvent = await this.sharedBroadcaster.addListener(listenerIds.messageEvent, (event: any) => {
590
+ // event => { feed: "feed"|"archive", index: number, event: string, message: any }
591
+ const convertedMessage = InboxMessage.fromJson(event.message);
592
+ props.onMessageEvent?.(convertedMessage, event.index, event.feed, event.event);
608
593
  });
609
594
 
610
- // Attach listener to native code
595
+ // Attach the listener to native iOS/Android via bridging
611
596
  const id = await Modules.Shared.addInboxListener(
612
597
  listenerId,
613
598
  listenerIds.loading,
614
599
  listenerIds.error,
615
600
  listenerIds.unreadCount,
616
- listenerIds.feed,
617
- listenerIds.archive,
601
+ listenerIds.totalCount,
602
+ listenerIds.messagesChanged,
618
603
  listenerIds.pageAdded,
619
- listenerIds.messageChanged,
620
- listenerIds.messageAdded,
621
- listenerIds.messageRemoved
604
+ listenerIds.messageEvent
622
605
  );
623
606
 
624
- // Add listener to manager
607
+ // Keep track so we can remove it later
625
608
  this.inboxListeners.set(id, listener);
626
609
 
627
610
  return listener;
628
-
629
611
  }
630
612
 
631
613
  private convertMessages(messages: string[]): InboxMessage[] {
632
- return messages.map(jsonString => {
633
- try {
634
- return JSON.parse(jsonString) as InboxMessage;
635
- } catch (error) {
636
- Courier.log(`Error parsing message: ${error}`);
637
- return null;
638
- }
639
- }).filter((message): message is InboxMessage => message !== null);
640
- }
641
-
642
- private convertMessage(message: string): InboxMessage {
643
- try {
644
- return JSON.parse(message) as InboxMessage;
645
- } catch (error) {
646
- Courier.log(`Error parsing message: ${error}`);
647
- throw error;
648
- }
614
+ return messages.map(jsonString => InboxMessage.fromJson(jsonString));
649
615
  }
650
616
 
651
617
  /**
@@ -664,15 +630,13 @@ class Courier {
664
630
 
665
631
  // Remove emitters
666
632
  const listener = this.inboxListeners.get(props.listenerId);
667
- listener?.onInitialLoad?.remove();
633
+ listener?.onLoading?.remove();
668
634
  listener?.onError?.remove();
669
635
  listener?.onUnreadCountChanged?.remove();
670
- listener?.onFeedChanged?.remove();
671
- listener?.onArchiveChanged?.remove();
636
+ listener?.onTotalCountChanged?.remove();
637
+ listener?.onMessagesChanged?.remove();
672
638
  listener?.onPageAdded?.remove();
673
- listener?.onMessageChanged?.remove();
674
- listener?.onMessageAdded?.remove();
675
- listener?.onMessageRemoved?.remove();
639
+ listener?.onMessageEvent?.remove();
676
640
 
677
641
  // Remove the listener
678
642
  this.inboxListeners.delete(props.listenerId);
@@ -693,15 +657,13 @@ class Courier {
693
657
 
694
658
  // Remove all items from inboxListeners
695
659
  this.inboxListeners.forEach((listener) => {
696
- listener?.onInitialLoad?.remove();
660
+ listener?.onLoading?.remove();
697
661
  listener?.onError?.remove();
698
662
  listener?.onUnreadCountChanged?.remove();
699
- listener?.onFeedChanged?.remove();
700
- listener?.onArchiveChanged?.remove();
663
+ listener?.onTotalCountChanged?.remove();
664
+ listener?.onMessagesChanged?.remove();
701
665
  listener?.onPageAdded?.remove();
702
- listener?.onMessageChanged?.remove();
703
- listener?.onMessageAdded?.remove();
704
- listener?.onMessageRemoved?.remove();
666
+ listener?.onMessageEvent?.remove();
705
667
  });
706
668
 
707
669
  this.inboxListeners.clear();
@@ -2,25 +2,22 @@ import Courier from "..";
2
2
  import { EmitterSubscription } from "react-native";
3
3
 
4
4
  export class CourierInboxListener {
5
+ readonly listenerId: string;
6
+
7
+ public onLoading?: EmitterSubscription;
8
+ public onError?: EmitterSubscription;
9
+ public onUnreadCountChanged?: EmitterSubscription;
10
+ public onTotalCountChanged?: EmitterSubscription;
11
+ public onMessagesChanged?: EmitterSubscription;
12
+ public onPageAdded?: EmitterSubscription;
13
+ public onMessageEvent?: EmitterSubscription;
5
14
 
6
- readonly listenerId: string
7
- public onInitialLoad?: EmitterSubscription
8
- public onError?: EmitterSubscription
9
- public onMessagesChanged?: EmitterSubscription
10
- public onUnreadCountChanged?: EmitterSubscription
11
- public onFeedChanged?: EmitterSubscription
12
- public onArchiveChanged?: EmitterSubscription
13
- public onPageAdded?: EmitterSubscription
14
- public onMessageChanged?: EmitterSubscription
15
- public onMessageAdded?: EmitterSubscription
16
- public onMessageRemoved?: EmitterSubscription
17
-
18
15
  constructor(id: string) {
19
16
  this.listenerId = id;
20
17
  }
21
18
 
22
19
  public async remove() {
20
+ // Remove this listener from native code
23
21
  await Courier.shared.removeInboxListener({ listenerId: this.listenerId });
24
22
  }
25
-
26
23
  }
@@ -1,5 +1,29 @@
1
- export interface InboxAction {
2
- content?: string | null;
3
- href?: string | null;
4
- data?: { [key: string]: any } | null;
1
+ export class InboxAction {
2
+ readonly content?: string | null;
3
+ readonly href?: string | null;
4
+ readonly data?: { [key: string]: any } | null;
5
+
6
+ constructor(
7
+ content: string | null = null,
8
+ href: string | null = null,
9
+ data: { [key: string]: any } | null = null
10
+ ) {
11
+ this.content = content;
12
+ this.href = href;
13
+ this.data = data;
14
+ }
15
+
16
+ static fromJson(jsonString: string): InboxAction {
17
+ try {
18
+ const parsed = JSON.parse(jsonString);
19
+ return new InboxAction(
20
+ parsed.content,
21
+ parsed.href,
22
+ parsed.data
23
+ );
24
+ } catch (error) {
25
+ console.log(`Error parsing action: ${error}`);
26
+ throw error;
27
+ }
28
+ }
5
29
  }
@@ -1,17 +1,105 @@
1
+ import Courier from "..";
1
2
  import { InboxAction } from "./InboxAction";
2
3
 
3
- export interface InboxMessage {
4
- messageId: string;
5
- title?: string | null;
6
- body?: string | null;
7
- preview?: string | null;
8
- created?: string | null;
9
- actions?: InboxAction[] | null;
10
- data?: { [key: string]: any } | null;
11
- read?: boolean | null;
12
- opened?: boolean | null;
13
- archived?: boolean | null
14
- subtitle?: string | null;
15
- time?: string;
16
- trackingIds?: { [key: string]: any } | null
4
+ export class InboxMessage {
5
+ readonly messageId: string;
6
+ readonly title?: string | null;
7
+ readonly body?: string | null;
8
+ readonly preview?: string | null;
9
+ readonly created?: string | null;
10
+ readonly actions?: InboxAction[] | null;
11
+ readonly data?: { [key: string]: any } | null;
12
+ readonly read?: boolean | null;
13
+ readonly opened?: boolean | null;
14
+ readonly archived?: boolean | null;
15
+ readonly subtitle?: string | null;
16
+ readonly time?: string;
17
+ readonly trackingIds?: { [key: string]: any } | null;
18
+
19
+ constructor(
20
+ messageId: string,
21
+ title: string | null = null,
22
+ body: string | null = null,
23
+ preview: string | null = null,
24
+ created: string | null = null,
25
+ actions: InboxAction[] | null = null,
26
+ data: { [key: string]: any } | null = null,
27
+ read: boolean | null = null,
28
+ opened: boolean | null = null,
29
+ archived: boolean | null = null,
30
+ subtitle: string | null = null,
31
+ time: string = '',
32
+ trackingIds: { [key: string]: any } | null = null
33
+ ) {
34
+ this.messageId = messageId;
35
+ this.title = title;
36
+ this.body = body;
37
+ this.preview = preview;
38
+ this.created = created;
39
+ this.actions = actions;
40
+ this.data = data;
41
+ this.read = read;
42
+ this.opened = opened;
43
+ this.archived = archived;
44
+ this.subtitle = subtitle;
45
+ this.time = time;
46
+ this.trackingIds = trackingIds;
47
+ }
48
+
49
+ get isRead(): boolean {
50
+ return this.read !== null;
51
+ }
52
+
53
+ get isOpened(): boolean {
54
+ return this.opened !== null;
55
+ }
56
+
57
+ get isArchived(): boolean {
58
+ return this.archived !== null;
59
+ }
60
+
61
+ static fromJson(jsonString: string): InboxMessage {
62
+ try {
63
+ const parsed = JSON.parse(jsonString);
64
+ return new InboxMessage(
65
+ parsed.messageId,
66
+ parsed.title,
67
+ parsed.body,
68
+ parsed.preview,
69
+ parsed.created,
70
+ parsed.actions,
71
+ parsed.data,
72
+ parsed.read,
73
+ parsed.opened,
74
+ parsed.archived,
75
+ parsed.subtitle,
76
+ parsed.time,
77
+ parsed.trackingIds
78
+ );
79
+ } catch (error) {
80
+ console.log(`Error parsing message: ${error}`);
81
+ throw error;
82
+ }
83
+ }
84
+
85
+ async markAsRead() {
86
+ await Courier.shared.readMessage({ messageId: this.messageId });
87
+ }
88
+
89
+ async markAsUnread() {
90
+ await Courier.shared.unreadMessage({ messageId: this.messageId });
91
+ }
92
+
93
+ async markAsArchived() {
94
+ await Courier.shared.archiveMessage({ messageId: this.messageId });
95
+ }
96
+
97
+ async markAsOpened() {
98
+ await Courier.shared.openMessage({ messageId: this.messageId });
99
+ }
100
+
101
+ async markAsClicked() {
102
+ await Courier.shared.clickMessage({ messageId: this.messageId });
103
+ }
104
+
17
105
  }
@@ -0,0 +1 @@
1
+ export type InboxMessageEvent = 'added' | 'read' | 'unread' | 'opened' | 'archived' | 'clicked';
@@ -1 +1 @@
1
- export type InboxMessageFeed = 'feed' | 'archived';
1
+ export type InboxMessageFeed = 'feed' | 'archive';
@@ -54,7 +54,7 @@ export const CourierInboxView = (props: CourierInboxViewProps) => {
54
54
  if (props.onClickInboxMessageAtIndex) {
55
55
 
56
56
  const index = event["index"];
57
- const message = JSON.parse(event["message"]) as InboxMessage;
57
+ const message = InboxMessage.fromJson(event["message"]);
58
58
 
59
59
  props.onClickInboxMessageAtIndex(message, index);
60
60
 
@@ -78,7 +78,7 @@ export const CourierInboxView = (props: CourierInboxViewProps) => {
78
78
  if (props.onLongPressInboxMessageAtIndex) {
79
79
 
80
80
  const index = event["index"];
81
- const message = JSON.parse(event["message"]) as InboxMessage;
81
+ const message = InboxMessage.fromJson(event["message"]);
82
82
 
83
83
  props.onLongPressInboxMessageAtIndex(message, index);
84
84
 
@@ -102,8 +102,8 @@ export const CourierInboxView = (props: CourierInboxViewProps) => {
102
102
  if (props.onClickInboxActionForMessageAtIndex) {
103
103
 
104
104
  const index = event["index"];
105
- const action = JSON.parse(event["action"]) as InboxAction;
106
- const message = JSON.parse(event["message"]) as InboxMessage;
105
+ const action = InboxAction.fromJson(event["action"]);
106
+ const message = InboxMessage.fromJson(event["message"]);
107
107
 
108
108
  props.onClickInboxActionForMessageAtIndex(action, message, index);
109
109
 
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Workspace
3
- version = "1.0">
4
- <FileRef
5
- location = "self:">
6
- </FileRef>
7
- </Workspace>
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>IDEDidComputeMac32BitWarning</key>
6
- <true/>
7
- </dict>
8
- </plist>
@@ -1,14 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>SchemeUserState</key>
6
- <dict>
7
- <key>CourierReactNative.xcscheme_^#shared#^_</key>
8
- <dict>
9
- <key>orderHint</key>
10
- <integer>0</integer>
11
- </dict>
12
- </dict>
13
- </dict>
14
- </plist>