@trycourier/courier-react-native 4.1.1 → 5.0.2

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 (48) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/courierreactnative/CourierInboxViewManager.kt +129 -0
  3. package/android/src/main/java/com/courierreactnative/CourierSharedModule.kt +71 -20
  4. package/android/src/main/java/com/courierreactnative/Utils.kt +1 -1
  5. package/courier-react-native.podspec +1 -1
  6. package/ios/CourierInboxReactNativeManager.m +2 -0
  7. package/ios/CourierInboxReactNativeManager.swift +165 -0
  8. package/ios/CourierReactNativeDelegate.m +1 -1
  9. package/ios/CourierReactNativeEventEmitter.swift +1 -1
  10. package/ios/CourierReactNativeModule.m +9 -2
  11. package/ios/CourierSharedModule.swift +121 -50
  12. package/lib/commonjs/index.js +114 -22
  13. package/lib/commonjs/index.js.map +1 -1
  14. package/lib/commonjs/models/CourierInboxListener.js.map +1 -1
  15. package/lib/commonjs/models/InboxMessageFeed.js +2 -0
  16. package/lib/commonjs/models/InboxMessageFeed.js.map +1 -0
  17. package/lib/commonjs/models/InboxMessageSet.js +6 -0
  18. package/lib/commonjs/models/InboxMessageSet.js.map +1 -0
  19. package/lib/commonjs/views/CourierInboxView.js +1 -0
  20. package/lib/commonjs/views/CourierInboxView.js.map +1 -1
  21. package/lib/module/index.js +108 -22
  22. package/lib/module/index.js.map +1 -1
  23. package/lib/module/models/CourierInboxListener.js.map +1 -1
  24. package/lib/module/models/InboxMessageFeed.js +2 -0
  25. package/lib/module/models/InboxMessageFeed.js.map +1 -0
  26. package/lib/module/models/InboxMessageSet.js +2 -0
  27. package/lib/module/models/InboxMessageSet.js.map +1 -0
  28. package/lib/module/views/CourierInboxView.js +1 -0
  29. package/lib/module/views/CourierInboxView.js.map +1 -1
  30. package/lib/typescript/src/index.d.ts +22 -3
  31. package/lib/typescript/src/index.d.ts.map +1 -1
  32. package/lib/typescript/src/models/CourierInboxListener.d.ts +7 -0
  33. package/lib/typescript/src/models/CourierInboxListener.d.ts.map +1 -1
  34. package/lib/typescript/src/models/CourierInboxTheme.d.ts +27 -0
  35. package/lib/typescript/src/models/CourierInboxTheme.d.ts.map +1 -1
  36. package/lib/typescript/src/models/InboxMessageFeed.d.ts +2 -0
  37. package/lib/typescript/src/models/InboxMessageFeed.d.ts.map +1 -0
  38. package/lib/typescript/src/models/InboxMessageSet.d.ts +7 -0
  39. package/lib/typescript/src/models/InboxMessageSet.d.ts.map +1 -0
  40. package/lib/typescript/src/views/CourierInboxView.d.ts +1 -0
  41. package/lib/typescript/src/views/CourierInboxView.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/src/index.tsx +125 -27
  44. package/src/models/CourierInboxListener.tsx +8 -1
  45. package/src/models/CourierInboxTheme.tsx +33 -0
  46. package/src/models/InboxMessageFeed.tsx +1 -0
  47. package/src/models/InboxMessageSet.tsx +7 -0
  48. package/src/views/CourierInboxView.tsx +2 -0
package/src/index.tsx CHANGED
@@ -13,6 +13,8 @@ import { Modules } from './Modules';
13
13
  import Broadcaster from './Broadcaster';
14
14
  import { CourierClient } from './client/CourierClient';
15
15
  import { Events, Utils } from './utils';
16
+ import { InboxMessageFeed } from './models/InboxMessageFeed';
17
+ import { InboxMessageSet } from './models/InboxMessageSet';
16
18
 
17
19
  export { CourierClient } from './client/CourierClient';
18
20
  export { BrandClient } from './client/BrandClient';
@@ -35,6 +37,7 @@ export { CourierButton } from './models/CourierButton';
35
37
  export { CourierInfoViewStyle } from './models/CourierInfoViewStyle';
36
38
  export { iOS_CourierCell } from './models/iOS_CourierCell';
37
39
  export { iOS_CourierSheet } from './models/iOS_CourierSheet';
40
+ export { InboxMessageSet } from './models/InboxMessageSet';
38
41
  export { CourierInboxButtonStyle, CourierInboxTextStyle, CourierInboxUnreadIndicatorStyle, CourierInboxTheme } from './models/CourierInboxTheme';
39
42
  export { CourierPreferencesTheme, CourierPreferencesMode, CourierPreferencesChannel } from './models/CourierPreferencesTheme';
40
43
  export type iOSForegroundPresentationOptions = 'sound' | 'badge' | 'list' | 'banner';
@@ -506,22 +509,50 @@ class Courier {
506
509
  * @param {Object} props - The properties object.
507
510
  * @param {Function} [props.onInitialLoad] - Callback function called when the inbox is initially loaded.
508
511
  * @param {Function} [props.onError] - Callback function called when an error occurs. Receives the error message as a parameter.
509
- * @param {Function} [props.onMessagesChanged] - Callback function called when messages change. Receives updated messages, unread count, total count, and pagination status.
512
+ * @param {Function} [props.onUnreadCountChanged] - Callback function called when the unread count changes.
513
+ * @param {Function} [props.onFeedChanged] - Callback function called when the feed changes.
514
+ * @param {Function} [props.onArchiveChanged] - Callback function called when the archive changes.
515
+ * @param {Function} [props.onPageAdded] - Callback function called when a new page is added.
516
+ * @param {Function} [props.onMessageChanged] - Callback function called when a message changes.
517
+ * @param {Function} [props.onMessageAdded] - Callback function called when a new message is added.
518
+ * @param {Function} [props.onMessageRemoved] - Callback function called when a message is removed.
510
519
  * @returns {CourierInboxListener} A listener object that can be used to remove the listener later.
511
520
  */
512
- public addInboxListener(props: { onInitialLoad?: () => void, onError?: (error: string) => void, onMessagesChanged?: (messages: InboxMessage[], unreadMessageCount: number, totalMessageCount: number, canPaginate: boolean) => void }): CourierInboxListener {
521
+ public addInboxListener(props: {
522
+ onInitialLoad?: () => void,
523
+ onError?: (error: string) => void,
524
+ onUnreadCountChanged?: (unreadCount: number) => void,
525
+ onFeedChanged?: (messageSet: InboxMessageSet) => void,
526
+ onArchiveChanged?: (messageSet: InboxMessageSet) => void,
527
+ onPageAdded?: (feed: InboxMessageFeed, messageSet: InboxMessageSet) => void,
528
+ onMessageChanged?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void,
529
+ onMessageAdded?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void,
530
+ onMessageRemoved?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void
531
+ }): CourierInboxListener {
513
532
 
514
533
  const listenerIds = {
515
534
  loading: `inbox_loading_${Utils.generateUUID()}`,
516
535
  error: `inbox_error_${Utils.generateUUID()}`,
517
- messages: `inbox_messages_${Utils.generateUUID()}`
536
+ unreadCount: `inbox_unread_count_${Utils.generateUUID()}`,
537
+ feed: `inbox_feed_${Utils.generateUUID()}`,
538
+ archive: `inbox_archive_${Utils.generateUUID()}`,
539
+ pageAdded: `inbox_page_added_${Utils.generateUUID()}`,
540
+ messageChanged: `inbox_message_changed_${Utils.generateUUID()}`,
541
+ messageAdded: `inbox_message_added_${Utils.generateUUID()}`,
542
+ messageRemoved: `inbox_message_removed_${Utils.generateUUID()}`
518
543
  }
519
544
 
520
545
  // Set the listener id
521
546
  const id = Modules.Shared.addInboxListener(
522
547
  listenerIds.loading,
523
548
  listenerIds.error,
524
- listenerIds.messages
549
+ listenerIds.unreadCount,
550
+ listenerIds.feed,
551
+ listenerIds.archive,
552
+ listenerIds.pageAdded,
553
+ listenerIds.messageChanged,
554
+ listenerIds.messageAdded,
555
+ listenerIds.messageRemoved
525
556
  );
526
557
 
527
558
  // Create the initial listeners
@@ -535,32 +566,79 @@ class Courier {
535
566
  props.onError?.(event);
536
567
  });
537
568
 
538
- listener.onMessagesChanged = this.sharedBroadcaster.addListener(listenerIds.messages, (event: any) => {
539
-
540
- // Convert JSON strings to InboxMessage objects
541
- const convertedMessages: InboxMessage[] = event.messages.map((jsonString: string) => {
542
- try {
543
- const parsedMessage = JSON.parse(jsonString);
544
- return parsedMessage as InboxMessage;
545
- } catch (error) {
546
- Courier.log(`Error parsing message: ${error}`);
547
- return null;
548
- }
549
- }).filter((message: InboxMessage | null): message is InboxMessage => message !== null);
550
-
551
- props.onMessagesChanged?.(
552
- convertedMessages,
553
- event.unreadMessageCount,
554
- event.totalMessageCount,
555
- event.canPaginate,
556
- );
569
+ listener.onUnreadCountChanged = this.sharedBroadcaster.addListener(listenerIds.unreadCount, (event: any) => {
570
+ props.onUnreadCountChanged?.(event);
571
+ });
572
+
573
+ listener.onFeedChanged = this.sharedBroadcaster.addListener(listenerIds.feed, (event: any) => {
574
+ const convertedMessages = this.convertMessages(event.messages);
575
+ const messageSet: InboxMessageSet = {
576
+ messages: convertedMessages,
577
+ totalMessageCount: event.totalMessageCount,
578
+ canPaginate: event.canPaginate
579
+ }
580
+ props.onFeedChanged?.(messageSet);
581
+ });
582
+
583
+ listener.onArchiveChanged = this.sharedBroadcaster.addListener(listenerIds.archive, (event: any) => {
584
+ const convertedMessages = this.convertMessages(event.messages);
585
+ const messageSet: InboxMessageSet = {
586
+ messages: convertedMessages,
587
+ totalMessageCount: event.totalMessageCount,
588
+ canPaginate: event.canPaginate
589
+ }
590
+ props.onArchiveChanged?.(messageSet);
591
+ });
592
+
593
+ listener.onPageAdded = this.sharedBroadcaster.addListener(listenerIds.pageAdded, (event: any) => {
594
+ const convertedMessages = this.convertMessages(event.messages);
595
+ const messageSet: InboxMessageSet = {
596
+ messages: convertedMessages,
597
+ totalMessageCount: event.totalMessageCount,
598
+ canPaginate: event.canPaginate
599
+ }
600
+ props.onPageAdded?.(event.feed === 'archived' ? 'archived' : 'feed', messageSet);
601
+ });
602
+
603
+ listener.onMessageChanged = this.sharedBroadcaster.addListener(listenerIds.messageChanged, (event: any) => {
604
+ const convertedMessage = this.convertMessage(event.message);
605
+ props.onMessageChanged?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
606
+ });
607
+
608
+ listener.onMessageAdded = this.sharedBroadcaster.addListener(listenerIds.messageAdded, (event: any) => {
609
+ const convertedMessage = this.convertMessage(event.message);
610
+ props.onMessageAdded?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
611
+ });
612
+
613
+ listener.onMessageRemoved = this.sharedBroadcaster.addListener(listenerIds.messageRemoved, (event: any) => {
614
+ const convertedMessage = this.convertMessage(event.message);
615
+ props.onMessageRemoved?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
557
616
  });
558
617
 
559
618
  // Add listener to manager
560
619
  this.inboxListeners.set(id, listener);
561
620
 
562
621
  return listener;
622
+ }
623
+
624
+ private convertMessages(messages: string[]): InboxMessage[] {
625
+ return messages.map(jsonString => {
626
+ try {
627
+ return JSON.parse(jsonString) as InboxMessage;
628
+ } catch (error) {
629
+ Courier.log(`Error parsing message: ${error}`);
630
+ return null;
631
+ }
632
+ }).filter((message): message is InboxMessage => message !== null);
633
+ }
563
634
 
635
+ private convertMessage(message: string): InboxMessage {
636
+ try {
637
+ return JSON.parse(message) as InboxMessage;
638
+ } catch (error) {
639
+ Courier.log(`Error parsing message: ${error}`);
640
+ throw error;
641
+ }
564
642
  }
565
643
 
566
644
  /**
@@ -581,7 +659,13 @@ class Courier {
581
659
  const listener = this.inboxListeners.get(props.listenerId);
582
660
  listener?.onInitialLoad?.remove();
583
661
  listener?.onError?.remove();
584
- listener?.onMessagesChanged?.remove();
662
+ listener?.onUnreadCountChanged?.remove();
663
+ listener?.onFeedChanged?.remove();
664
+ listener?.onArchiveChanged?.remove();
665
+ listener?.onPageAdded?.remove();
666
+ listener?.onMessageChanged?.remove();
667
+ listener?.onMessageAdded?.remove();
668
+ listener?.onMessageRemoved?.remove();
585
669
 
586
670
  // Remove the listener
587
671
  this.inboxListeners.delete(props.listenerId);
@@ -604,7 +688,13 @@ class Courier {
604
688
  this.inboxListeners.forEach((listener) => {
605
689
  listener?.onInitialLoad?.remove();
606
690
  listener?.onError?.remove();
607
- listener?.onMessagesChanged?.remove();
691
+ listener?.onUnreadCountChanged?.remove();
692
+ listener?.onFeedChanged?.remove();
693
+ listener?.onArchiveChanged?.remove();
694
+ listener?.onPageAdded?.remove();
695
+ listener?.onMessageChanged?.remove();
696
+ listener?.onMessageAdded?.remove();
697
+ listener?.onMessageRemoved?.remove();
608
698
  });
609
699
  this.inboxListeners.clear();
610
700
 
@@ -623,11 +713,19 @@ class Courier {
623
713
  * Fetches the next page of inbox messages.
624
714
  * @returns {Promise<InboxMessage[]>} A promise that resolves with an array of fetched inbox messages.
625
715
  */
626
- public async fetchNextPageOfMessages(): Promise<InboxMessage[]> {
627
- const messages = await Modules.Shared.fetchNextPageOfMessages();
716
+ public async fetchNextPageOfMessages(props: { inboxMessageFeed: InboxMessageFeed }): Promise<InboxMessage[]> {
717
+ const messages = await Modules.Shared.fetchNextPageOfMessages(props.inboxMessageFeed);
628
718
  return messages.map((message: string) => JSON.parse(message));
629
719
  }
630
720
 
631
721
  }
632
722
 
723
+ // Handle Hot Reload cleanup
724
+ if (__DEV__) {
725
+ console.log('Courier SDK is running in development mode');
726
+ Courier.shared.removeAllAuthenticationListeners();
727
+ Courier.shared.removeAllInboxListeners();
728
+ Courier.shared.removeAllPushNotificationListeners();
729
+ }
730
+
633
731
  export default Courier;
@@ -7,7 +7,14 @@ export class CourierInboxListener {
7
7
  public onInitialLoad?: EmitterSubscription
8
8
  public onError?: EmitterSubscription
9
9
  public onMessagesChanged?: EmitterSubscription
10
-
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
+
11
18
  constructor(id: string) {
12
19
  this.listenerId = id;
13
20
  }
@@ -17,8 +17,41 @@ export interface CourierInboxUnreadIndicatorStyle {
17
17
  color?: string
18
18
  }
19
19
 
20
+ export interface CourierInboxTabIndicatorStyle {
21
+ font?: CourierFont
22
+ color?: string
23
+ }
24
+
25
+ export interface CourierInboxTabItemStyle {
26
+ font?: CourierFont
27
+ indicator?: CourierInboxTabIndicatorStyle
28
+ }
29
+
30
+ export interface CourierInboxTabStyle {
31
+ selected?: CourierInboxTabItemStyle
32
+ unselected?: CourierInboxTabItemStyle
33
+ }
34
+
35
+ export interface CourierSwipeActionStyle {
36
+ icon?: string
37
+ color?: string
38
+ }
39
+
40
+ export interface CourierReadingSwipeActionStyle {
41
+ read?: CourierSwipeActionStyle
42
+ unread?: CourierSwipeActionStyle
43
+ }
44
+
45
+ export interface CourierArchivingSwipeActionStyle {
46
+ archive?: CourierSwipeActionStyle
47
+ }
48
+
20
49
  export interface CourierInboxTheme {
21
50
  brandId?: string,
51
+ tabIndicatorColor?: string,
52
+ tabStyle?: CourierInboxTabStyle,
53
+ readingSwipeActionStyle?: CourierReadingSwipeActionStyle
54
+ archivingSwipeActionStyle?: CourierArchivingSwipeActionStyle
22
55
  loadingIndicatorColor?: string
23
56
  unreadIndicatorStyle?: CourierInboxUnreadIndicatorStyle
24
57
  titleStyle?: CourierInboxTextStyle
@@ -0,0 +1 @@
1
+ export type InboxMessageFeed = 'feed' | 'archived';
@@ -0,0 +1,7 @@
1
+ import { InboxMessage } from "./InboxMessage";
2
+
3
+ export interface InboxMessageSet {
4
+ messages: InboxMessage[];
5
+ totalMessageCount: number;
6
+ canPaginate: boolean;
7
+ }
@@ -6,6 +6,7 @@ import { CourierInboxTheme } from "src/models/CourierInboxTheme";
6
6
  import { Modules } from "../Modules";
7
7
 
8
8
  type CourierInboxViewProps = {
9
+ canSwipePages?: boolean,
9
10
  theme?: {
10
11
  light?: CourierInboxTheme,
11
12
  dark?: CourierInboxTheme
@@ -107,6 +108,7 @@ export const CourierInboxView = (props: CourierInboxViewProps) => {
107
108
 
108
109
  return (
109
110
  <CourierInbox
111
+ canSwipePages={props.canSwipePages ?? false}
110
112
  theme={props.theme ?? { light: undefined, dark: undefined }}
111
113
  onClickInboxMessageAtIndex={(event: any) => onClickInboxMessageAtIndex(event.nativeEvent)}
112
114
  onClickInboxActionForMessageAtIndex={(event: any) => onClickInboxActionForMessageAtIndex(event.nativeEvent)}