@trycourier/courier-react-native 4.1.1 → 5.0.0

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 (41) 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 +84 -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/views/CourierInboxView.js +1 -0
  18. package/lib/commonjs/views/CourierInboxView.js.map +1 -1
  19. package/lib/module/index.js +84 -22
  20. package/lib/module/index.js.map +1 -1
  21. package/lib/module/models/CourierInboxListener.js.map +1 -1
  22. package/lib/module/models/InboxMessageFeed.js +2 -0
  23. package/lib/module/models/InboxMessageFeed.js.map +1 -0
  24. package/lib/module/views/CourierInboxView.js +1 -0
  25. package/lib/module/views/CourierInboxView.js.map +1 -1
  26. package/lib/typescript/src/index.d.ts +20 -3
  27. package/lib/typescript/src/index.d.ts.map +1 -1
  28. package/lib/typescript/src/models/CourierInboxListener.d.ts +7 -0
  29. package/lib/typescript/src/models/CourierInboxListener.d.ts.map +1 -1
  30. package/lib/typescript/src/models/CourierInboxTheme.d.ts +27 -0
  31. package/lib/typescript/src/models/CourierInboxTheme.d.ts.map +1 -1
  32. package/lib/typescript/src/models/InboxMessageFeed.d.ts +2 -0
  33. package/lib/typescript/src/models/InboxMessageFeed.d.ts.map +1 -0
  34. package/lib/typescript/src/views/CourierInboxView.d.ts +1 -0
  35. package/lib/typescript/src/views/CourierInboxView.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/src/index.tsx +100 -27
  38. package/src/models/CourierInboxListener.tsx +8 -1
  39. package/src/models/CourierInboxTheme.tsx +33 -0
  40. package/src/models/InboxMessageFeed.tsx +1 -0
  41. package/src/views/CourierInboxView.tsx +2 -0
package/src/index.tsx CHANGED
@@ -13,6 +13,7 @@ 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';
16
17
 
17
18
  export { CourierClient } from './client/CourierClient';
18
19
  export { BrandClient } from './client/BrandClient';
@@ -506,22 +507,50 @@ class Courier {
506
507
  * @param {Object} props - The properties object.
507
508
  * @param {Function} [props.onInitialLoad] - Callback function called when the inbox is initially loaded.
508
509
  * @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.
510
+ * @param {Function} [props.onUnreadCountChanged] - Callback function called when the unread count changes.
511
+ * @param {Function} [props.onFeedChanged] - Callback function called when the feed changes.
512
+ * @param {Function} [props.onArchiveChanged] - Callback function called when the archive changes.
513
+ * @param {Function} [props.onPageAdded] - Callback function called when a new page is added.
514
+ * @param {Function} [props.onMessageChanged] - Callback function called when a message changes.
515
+ * @param {Function} [props.onMessageAdded] - Callback function called when a new message is added.
516
+ * @param {Function} [props.onMessageRemoved] - Callback function called when a message is removed.
510
517
  * @returns {CourierInboxListener} A listener object that can be used to remove the listener later.
511
518
  */
512
- public addInboxListener(props: { onInitialLoad?: () => void, onError?: (error: string) => void, onMessagesChanged?: (messages: InboxMessage[], unreadMessageCount: number, totalMessageCount: number, canPaginate: boolean) => void }): CourierInboxListener {
519
+ public addInboxListener(props: {
520
+ onInitialLoad?: () => void,
521
+ onError?: (error: string) => void,
522
+ onUnreadCountChanged?: (unreadCount: number) => void,
523
+ onFeedChanged?: (messages: InboxMessage[], totalMessageCount: number, canPaginate: boolean) => void,
524
+ onArchiveChanged?: (messages: InboxMessage[], totalMessageCount: number, canPaginate: boolean) => void,
525
+ onPageAdded?: (feed: InboxMessageFeed, messages: InboxMessage[], totalMessageCount: number, canPaginate: boolean) => void,
526
+ onMessageChanged?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void,
527
+ onMessageAdded?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void,
528
+ onMessageRemoved?: (feed: InboxMessageFeed, index: number, message: InboxMessage) => void
529
+ }): CourierInboxListener {
513
530
 
514
531
  const listenerIds = {
515
532
  loading: `inbox_loading_${Utils.generateUUID()}`,
516
533
  error: `inbox_error_${Utils.generateUUID()}`,
517
- messages: `inbox_messages_${Utils.generateUUID()}`
534
+ unreadCount: `inbox_unread_count_${Utils.generateUUID()}`,
535
+ feed: `inbox_feed_${Utils.generateUUID()}`,
536
+ archive: `inbox_archive_${Utils.generateUUID()}`,
537
+ pageAdded: `inbox_page_added_${Utils.generateUUID()}`,
538
+ messageChanged: `inbox_message_changed_${Utils.generateUUID()}`,
539
+ messageAdded: `inbox_message_added_${Utils.generateUUID()}`,
540
+ messageRemoved: `inbox_message_removed_${Utils.generateUUID()}`
518
541
  }
519
542
 
520
543
  // Set the listener id
521
544
  const id = Modules.Shared.addInboxListener(
522
545
  listenerIds.loading,
523
546
  listenerIds.error,
524
- listenerIds.messages
547
+ listenerIds.unreadCount,
548
+ listenerIds.feed,
549
+ listenerIds.archive,
550
+ listenerIds.pageAdded,
551
+ listenerIds.messageChanged,
552
+ listenerIds.messageAdded,
553
+ listenerIds.messageRemoved
525
554
  );
526
555
 
527
556
  // Create the initial listeners
@@ -535,32 +564,64 @@ class Courier {
535
564
  props.onError?.(event);
536
565
  });
537
566
 
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
- );
567
+ listener.onUnreadCountChanged = this.sharedBroadcaster.addListener(listenerIds.unreadCount, (event: any) => {
568
+ props.onUnreadCountChanged?.(event);
569
+ });
570
+
571
+ listener.onFeedChanged = this.sharedBroadcaster.addListener(listenerIds.feed, (event: any) => {
572
+ const convertedMessages = this.convertMessages(event.messages);
573
+ props.onFeedChanged?.(convertedMessages, event.totalMessageCount, event.canPaginate);
574
+ });
575
+
576
+ listener.onArchiveChanged = this.sharedBroadcaster.addListener(listenerIds.archive, (event: any) => {
577
+ const convertedMessages = this.convertMessages(event.messages);
578
+ props.onArchiveChanged?.(convertedMessages, event.totalMessageCount, event.canPaginate);
579
+ });
580
+
581
+ listener.onPageAdded = this.sharedBroadcaster.addListener(listenerIds.pageAdded, (event: any) => {
582
+ const convertedMessages = this.convertMessages(event.messages);
583
+ props.onPageAdded?.(event.feed === 'archived' ? 'archived' : 'feed', convertedMessages, event.totalMessageCount, event.canPaginate);
584
+ });
585
+
586
+ listener.onMessageChanged = this.sharedBroadcaster.addListener(listenerIds.messageChanged, (event: any) => {
587
+ const convertedMessage = this.convertMessage(event.message);
588
+ props.onMessageChanged?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
589
+ });
590
+
591
+ listener.onMessageAdded = this.sharedBroadcaster.addListener(listenerIds.messageAdded, (event: any) => {
592
+ const convertedMessage = this.convertMessage(event.message);
593
+ props.onMessageAdded?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
594
+ });
595
+
596
+ listener.onMessageRemoved = this.sharedBroadcaster.addListener(listenerIds.messageRemoved, (event: any) => {
597
+ const convertedMessage = this.convertMessage(event.message);
598
+ props.onMessageRemoved?.(event.feed === 'archived' ? 'archived' : 'feed', event.index, convertedMessage);
557
599
  });
558
600
 
559
601
  // Add listener to manager
560
602
  this.inboxListeners.set(id, listener);
561
603
 
562
604
  return listener;
605
+ }
563
606
 
607
+ private convertMessages(messages: string[]): InboxMessage[] {
608
+ return messages.map(jsonString => {
609
+ try {
610
+ return JSON.parse(jsonString) as InboxMessage;
611
+ } catch (error) {
612
+ Courier.log(`Error parsing message: ${error}`);
613
+ return null;
614
+ }
615
+ }).filter((message): message is InboxMessage => message !== null);
616
+ }
617
+
618
+ private convertMessage(message: string): InboxMessage {
619
+ try {
620
+ return JSON.parse(message) as InboxMessage;
621
+ } catch (error) {
622
+ Courier.log(`Error parsing message: ${error}`);
623
+ throw error;
624
+ }
564
625
  }
565
626
 
566
627
  /**
@@ -581,7 +642,13 @@ class Courier {
581
642
  const listener = this.inboxListeners.get(props.listenerId);
582
643
  listener?.onInitialLoad?.remove();
583
644
  listener?.onError?.remove();
584
- listener?.onMessagesChanged?.remove();
645
+ listener?.onUnreadCountChanged?.remove();
646
+ listener?.onFeedChanged?.remove();
647
+ listener?.onArchiveChanged?.remove();
648
+ listener?.onPageAdded?.remove();
649
+ listener?.onMessageChanged?.remove();
650
+ listener?.onMessageAdded?.remove();
651
+ listener?.onMessageRemoved?.remove();
585
652
 
586
653
  // Remove the listener
587
654
  this.inboxListeners.delete(props.listenerId);
@@ -604,7 +671,13 @@ class Courier {
604
671
  this.inboxListeners.forEach((listener) => {
605
672
  listener?.onInitialLoad?.remove();
606
673
  listener?.onError?.remove();
607
- listener?.onMessagesChanged?.remove();
674
+ listener?.onUnreadCountChanged?.remove();
675
+ listener?.onFeedChanged?.remove();
676
+ listener?.onArchiveChanged?.remove();
677
+ listener?.onPageAdded?.remove();
678
+ listener?.onMessageChanged?.remove();
679
+ listener?.onMessageAdded?.remove();
680
+ listener?.onMessageRemoved?.remove();
608
681
  });
609
682
  this.inboxListeners.clear();
610
683
 
@@ -623,8 +696,8 @@ class Courier {
623
696
  * Fetches the next page of inbox messages.
624
697
  * @returns {Promise<InboxMessage[]>} A promise that resolves with an array of fetched inbox messages.
625
698
  */
626
- public async fetchNextPageOfMessages(): Promise<InboxMessage[]> {
627
- const messages = await Modules.Shared.fetchNextPageOfMessages();
699
+ public async fetchNextPageOfMessages(props: { inboxMessageFeed: InboxMessageFeed }): Promise<InboxMessage[]> {
700
+ const messages = await Modules.Shared.fetchNextPageOfMessages(props.inboxMessageFeed);
628
701
  return messages.map((message: string) => JSON.parse(message));
629
702
  }
630
703
 
@@ -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';
@@ -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)}