@adobe/react-native-aepmessaging 7.3.0 → 7.4.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 (289) hide show
  1. package/RCTAEPMessaging.podspec +1 -1
  2. package/README.md +145 -16
  3. package/android/src/main/java/com/adobe/marketing/mobile/reactnative/messaging/RCTAEPMessagingModule.java +82 -32
  4. package/babel.config.js +3 -0
  5. package/dist/module/Messaging.js +334 -0
  6. package/dist/module/Messaging.js.map +1 -0
  7. package/dist/module/index.js +30 -0
  8. package/dist/module/index.js.map +1 -0
  9. package/dist/module/models/ContentCard.js +24 -0
  10. package/dist/module/models/ContentCard.js.map +1 -0
  11. package/dist/{models → module/models}/HTMLProposition.js +8 -9
  12. package/dist/module/models/HTMLProposition.js.map +1 -0
  13. package/dist/module/models/InAppMessage.js +4 -0
  14. package/dist/module/models/InAppMessage.js.map +1 -0
  15. package/dist/module/models/JSONProposition.js +22 -0
  16. package/dist/module/models/JSONProposition.js.map +1 -0
  17. package/dist/module/models/Message.js +182 -0
  18. package/dist/module/models/Message.js.map +1 -0
  19. package/dist/module/models/MessagingDelegate.js +4 -0
  20. package/dist/module/models/MessagingDelegate.js.map +1 -0
  21. package/dist/module/models/MessagingEdgeEventType.js +24 -0
  22. package/dist/module/models/MessagingEdgeEventType.js.map +1 -0
  23. package/dist/module/models/MessagingProposition.js +57 -0
  24. package/dist/module/models/MessagingProposition.js.map +1 -0
  25. package/dist/module/models/MessagingPropositionItem.js +4 -0
  26. package/dist/module/models/MessagingPropositionItem.js.map +1 -0
  27. package/dist/module/models/PersonalizationSchema.js +26 -0
  28. package/dist/module/models/PersonalizationSchema.js.map +1 -0
  29. package/dist/module/models/PropositionItem.js +113 -0
  30. package/dist/module/models/PropositionItem.js.map +1 -0
  31. package/dist/module/models/ScopeDetails.js +2 -0
  32. package/dist/module/models/ScopeDetails.js.map +1 -0
  33. package/dist/{models/JSONProposition.js → module/models/index.js} +14 -12
  34. package/dist/module/models/index.js.map +1 -0
  35. package/dist/module/ui/components/Button/Button.js +57 -0
  36. package/dist/module/ui/components/Button/Button.js.map +1 -0
  37. package/dist/module/ui/components/Button/Button.spec.js +476 -0
  38. package/dist/module/ui/components/Button/Button.spec.js.map +1 -0
  39. package/dist/module/ui/components/ContentCardView/ContentCardView.js +257 -0
  40. package/dist/module/ui/components/ContentCardView/ContentCardView.js.map +1 -0
  41. package/dist/module/ui/components/ContentCardView/ContentCardView.spec.js +363 -0
  42. package/dist/module/ui/components/ContentCardView/ContentCardView.spec.js.map +1 -0
  43. package/dist/module/ui/components/DismissButton/DismissButton.js +70 -0
  44. package/dist/module/ui/components/DismissButton/DismissButton.js.map +1 -0
  45. package/dist/module/ui/components/DismissButton/DismissButton.spec.js +279 -0
  46. package/dist/module/ui/components/DismissButton/DismissButton.spec.js.map +1 -0
  47. package/dist/module/ui/components/FullScreenCenterView/FullScreenCenterView.js +34 -0
  48. package/dist/module/ui/components/FullScreenCenterView/FullScreenCenterView.js.map +1 -0
  49. package/dist/module/ui/components/Inbox/EmptyState.js +64 -0
  50. package/dist/module/ui/components/Inbox/EmptyState.js.map +1 -0
  51. package/dist/module/ui/components/Inbox/Inbox.js +235 -0
  52. package/dist/module/ui/components/Inbox/Inbox.js.map +1 -0
  53. package/dist/module/ui/components/Inbox/Inbox.spec.js +847 -0
  54. package/dist/module/ui/components/Inbox/Inbox.spec.js.map +1 -0
  55. package/dist/module/ui/components/Pagination/Pagination.js +176 -0
  56. package/dist/module/ui/components/Pagination/Pagination.js.map +1 -0
  57. package/dist/module/ui/components/Pagination/Pagination.spec.js +193 -0
  58. package/dist/module/ui/components/Pagination/Pagination.spec.js.map +1 -0
  59. package/dist/module/ui/components/UnreadIcon/UnreadIcon.js +184 -0
  60. package/dist/module/ui/components/UnreadIcon/UnreadIcon.js.map +1 -0
  61. package/dist/module/ui/components/UnreadIcon/UnreadIcon.spec.js +815 -0
  62. package/dist/module/ui/components/UnreadIcon/UnreadIcon.spec.js.map +1 -0
  63. package/dist/{models/ContentCard.js → module/ui/components/index.js} +12 -12
  64. package/dist/module/ui/components/index.js.map +1 -0
  65. package/dist/module/ui/hooks/index.js +18 -0
  66. package/dist/module/ui/hooks/index.js.map +1 -0
  67. package/dist/module/ui/hooks/useAspectRatio.js +33 -0
  68. package/dist/module/ui/hooks/useAspectRatio.js.map +1 -0
  69. package/dist/module/ui/hooks/useAspectRatio.spec.js +65 -0
  70. package/dist/module/ui/hooks/useAspectRatio.spec.js.map +1 -0
  71. package/dist/module/ui/hooks/useContentCardUI.js +51 -0
  72. package/dist/module/ui/hooks/useContentCardUI.js.map +1 -0
  73. package/dist/module/ui/hooks/useContentCardUI.spec.js +85 -0
  74. package/dist/module/ui/hooks/useContentCardUI.spec.js.map +1 -0
  75. package/dist/module/ui/hooks/useInbox.js +49 -0
  76. package/dist/module/ui/hooks/useInbox.js.map +1 -0
  77. package/dist/module/ui/hooks/useInbox.spec.js +93 -0
  78. package/dist/module/ui/hooks/useInbox.spec.js.map +1 -0
  79. package/dist/module/ui/hooks/useInboxSettings.js +26 -0
  80. package/dist/module/ui/hooks/useInboxSettings.js.map +1 -0
  81. package/dist/module/ui/hooks/useInboxSettings.spec.js +50 -0
  82. package/dist/module/ui/hooks/useInboxSettings.spec.js.map +1 -0
  83. package/dist/module/ui/index.js +10 -0
  84. package/dist/module/ui/index.js.map +1 -0
  85. package/dist/module/ui/providers/InboxProvider.js +27 -0
  86. package/dist/module/ui/providers/InboxProvider.js.map +1 -0
  87. package/dist/module/ui/theme/Theme.js +2 -0
  88. package/dist/module/ui/theme/Theme.js.map +1 -0
  89. package/dist/module/ui/theme/ThemeProvider.js +112 -0
  90. package/dist/module/ui/theme/ThemeProvider.js.map +1 -0
  91. package/dist/{models/InAppMessage.js → module/ui/theme/index.js} +6 -3
  92. package/dist/module/ui/theme/index.js.map +1 -0
  93. package/dist/module/ui/types/ContentViewEvent.js +2 -0
  94. package/dist/module/ui/types/ContentViewEvent.js.map +1 -0
  95. package/dist/module/ui/types/Templates.js +26 -0
  96. package/dist/module/ui/types/Templates.js.map +1 -0
  97. package/dist/{models/ScopeDetails.js → module/ui/types/index.js} +6 -3
  98. package/dist/module/ui/types/index.js.map +1 -0
  99. package/dist/module/ui/utils/generateCardHash.js +50 -0
  100. package/dist/module/ui/utils/generateCardHash.js.map +1 -0
  101. package/dist/module/ui/utils/generateCardHash.spec.js +103 -0
  102. package/dist/module/ui/utils/generateCardHash.spec.js.map +1 -0
  103. package/dist/module/ui/utils/inboxStorage.js +65 -0
  104. package/dist/module/ui/utils/inboxStorage.js.map +1 -0
  105. package/dist/module/ui/utils/inboxStorage.spec.js +123 -0
  106. package/dist/module/ui/utils/inboxStorage.spec.js.map +1 -0
  107. package/dist/module/ui/utils/index.js +5 -0
  108. package/dist/module/ui/utils/index.js.map +1 -0
  109. package/dist/{Messaging.d.ts → typescript/Messaging.d.ts} +23 -7
  110. package/dist/typescript/Messaging.d.ts.map +1 -0
  111. package/dist/{index.d.ts → typescript/index.d.ts} +4 -2
  112. package/dist/typescript/index.d.ts.map +1 -0
  113. package/dist/typescript/models/ContentCard.d.ts +57 -0
  114. package/dist/typescript/models/ContentCard.d.ts.map +1 -0
  115. package/dist/{models → typescript/models}/HTMLProposition.d.ts +1 -0
  116. package/dist/typescript/models/HTMLProposition.d.ts.map +1 -0
  117. package/dist/{models → typescript/models}/InAppMessage.d.ts +1 -0
  118. package/dist/typescript/models/InAppMessage.d.ts.map +1 -0
  119. package/dist/{models → typescript/models}/JSONProposition.d.ts +1 -0
  120. package/dist/typescript/models/JSONProposition.d.ts.map +1 -0
  121. package/dist/{models → typescript/models}/Message.d.ts +1 -0
  122. package/dist/typescript/models/Message.d.ts.map +1 -0
  123. package/dist/{models → typescript/models}/MessagingDelegate.d.ts +1 -0
  124. package/dist/typescript/models/MessagingDelegate.d.ts.map +1 -0
  125. package/dist/{models → typescript/models}/MessagingEdgeEventType.d.ts +1 -0
  126. package/dist/typescript/models/MessagingEdgeEventType.d.ts.map +1 -0
  127. package/dist/{models → typescript/models}/MessagingProposition.d.ts +1 -0
  128. package/dist/typescript/models/MessagingProposition.d.ts.map +1 -0
  129. package/dist/{models → typescript/models}/MessagingPropositionItem.d.ts +1 -0
  130. package/dist/typescript/models/MessagingPropositionItem.d.ts.map +1 -0
  131. package/dist/{models → typescript/models}/PersonalizationSchema.d.ts +2 -0
  132. package/dist/typescript/models/PersonalizationSchema.d.ts.map +1 -0
  133. package/dist/{models → typescript/models}/PropositionItem.d.ts +1 -0
  134. package/dist/typescript/models/PropositionItem.d.ts.map +1 -0
  135. package/dist/{models → typescript/models}/ScopeDetails.d.ts +1 -0
  136. package/dist/typescript/models/ScopeDetails.d.ts.map +1 -0
  137. package/dist/typescript/models/index.d.ts +11 -0
  138. package/dist/typescript/models/index.d.ts.map +1 -0
  139. package/dist/typescript/ui/components/Button/Button.d.ts +14 -0
  140. package/dist/typescript/ui/components/Button/Button.d.ts.map +1 -0
  141. package/dist/typescript/ui/components/Button/Button.spec.d.ts +2 -0
  142. package/dist/typescript/ui/components/Button/Button.spec.d.ts.map +1 -0
  143. package/dist/typescript/ui/components/ContentCardView/ContentCardView.d.ts +39 -0
  144. package/dist/typescript/ui/components/ContentCardView/ContentCardView.d.ts.map +1 -0
  145. package/dist/typescript/ui/components/ContentCardView/ContentCardView.spec.d.ts +2 -0
  146. package/dist/typescript/ui/components/ContentCardView/ContentCardView.spec.d.ts.map +1 -0
  147. package/dist/typescript/ui/components/DismissButton/DismissButton.d.ts +13 -0
  148. package/dist/typescript/ui/components/DismissButton/DismissButton.d.ts.map +1 -0
  149. package/dist/typescript/ui/components/DismissButton/DismissButton.spec.d.ts +2 -0
  150. package/dist/typescript/ui/components/DismissButton/DismissButton.spec.d.ts.map +1 -0
  151. package/dist/typescript/ui/components/FullScreenCenterView/FullScreenCenterView.d.ts +5 -0
  152. package/dist/typescript/ui/components/FullScreenCenterView/FullScreenCenterView.d.ts.map +1 -0
  153. package/dist/typescript/ui/components/Inbox/EmptyState.d.ts +19 -0
  154. package/dist/typescript/ui/components/Inbox/EmptyState.d.ts.map +1 -0
  155. package/dist/typescript/ui/components/Inbox/Inbox.d.ts +21 -0
  156. package/dist/typescript/ui/components/Inbox/Inbox.d.ts.map +1 -0
  157. package/dist/typescript/ui/components/Inbox/Inbox.spec.d.ts +2 -0
  158. package/dist/typescript/ui/components/Inbox/Inbox.spec.d.ts.map +1 -0
  159. package/dist/typescript/ui/components/Pagination/Pagination.d.ts +14 -0
  160. package/dist/typescript/ui/components/Pagination/Pagination.d.ts.map +1 -0
  161. package/dist/typescript/ui/components/Pagination/Pagination.spec.d.ts +2 -0
  162. package/dist/typescript/ui/components/Pagination/Pagination.spec.d.ts.map +1 -0
  163. package/dist/typescript/ui/components/UnreadIcon/UnreadIcon.d.ts +14 -0
  164. package/dist/typescript/ui/components/UnreadIcon/UnreadIcon.d.ts.map +1 -0
  165. package/dist/typescript/ui/components/UnreadIcon/UnreadIcon.spec.d.ts +2 -0
  166. package/dist/typescript/ui/components/UnreadIcon/UnreadIcon.spec.d.ts.map +1 -0
  167. package/dist/typescript/ui/components/index.d.ts +10 -0
  168. package/dist/typescript/ui/components/index.d.ts.map +1 -0
  169. package/dist/typescript/ui/hooks/index.d.ts +4 -0
  170. package/dist/typescript/ui/hooks/index.d.ts.map +1 -0
  171. package/dist/typescript/ui/hooks/useAspectRatio.d.ts +3 -0
  172. package/dist/typescript/ui/hooks/useAspectRatio.d.ts.map +1 -0
  173. package/dist/typescript/ui/hooks/useAspectRatio.spec.d.ts +2 -0
  174. package/dist/typescript/ui/hooks/useAspectRatio.spec.d.ts.map +1 -0
  175. package/dist/typescript/ui/hooks/useContentCardUI.d.ts +14 -0
  176. package/dist/typescript/ui/hooks/useContentCardUI.d.ts.map +1 -0
  177. package/dist/typescript/ui/hooks/useContentCardUI.spec.d.ts +2 -0
  178. package/dist/typescript/ui/hooks/useContentCardUI.spec.d.ts.map +1 -0
  179. package/dist/typescript/ui/hooks/useInbox.d.ts +12 -0
  180. package/dist/typescript/ui/hooks/useInbox.d.ts.map +1 -0
  181. package/dist/typescript/ui/hooks/useInbox.spec.d.ts +2 -0
  182. package/dist/typescript/ui/hooks/useInbox.spec.d.ts.map +1 -0
  183. package/dist/typescript/ui/hooks/useInboxSettings.d.ts +7 -0
  184. package/dist/typescript/ui/hooks/useInboxSettings.d.ts.map +1 -0
  185. package/dist/typescript/ui/hooks/useInboxSettings.spec.d.ts +2 -0
  186. package/dist/typescript/ui/hooks/useInboxSettings.spec.d.ts.map +1 -0
  187. package/dist/typescript/ui/index.d.ts +8 -0
  188. package/dist/typescript/ui/index.d.ts.map +1 -0
  189. package/dist/typescript/ui/providers/InboxProvider.d.ts +56 -0
  190. package/dist/typescript/ui/providers/InboxProvider.d.ts.map +1 -0
  191. package/dist/typescript/ui/theme/Theme.d.ts +44 -0
  192. package/dist/typescript/ui/theme/Theme.d.ts.map +1 -0
  193. package/dist/typescript/ui/theme/ThemeProvider.d.ts +21 -0
  194. package/dist/typescript/ui/theme/ThemeProvider.d.ts.map +1 -0
  195. package/dist/typescript/ui/theme/index.d.ts +3 -0
  196. package/dist/typescript/ui/theme/index.d.ts.map +1 -0
  197. package/dist/typescript/ui/types/ContentViewEvent.d.ts +9 -0
  198. package/dist/typescript/ui/types/ContentViewEvent.d.ts.map +1 -0
  199. package/dist/typescript/ui/types/Templates.d.ts +43 -0
  200. package/dist/typescript/ui/types/Templates.d.ts.map +1 -0
  201. package/dist/typescript/ui/types/index.d.ts +3 -0
  202. package/dist/typescript/ui/types/index.d.ts.map +1 -0
  203. package/dist/typescript/ui/utils/generateCardHash.d.ts +21 -0
  204. package/dist/typescript/ui/utils/generateCardHash.d.ts.map +1 -0
  205. package/dist/typescript/ui/utils/generateCardHash.spec.d.ts +2 -0
  206. package/dist/typescript/ui/utils/generateCardHash.spec.d.ts.map +1 -0
  207. package/dist/typescript/ui/utils/inboxStorage.d.ts +20 -0
  208. package/dist/typescript/ui/utils/inboxStorage.d.ts.map +1 -0
  209. package/dist/typescript/ui/utils/inboxStorage.spec.d.ts +2 -0
  210. package/dist/typescript/ui/utils/inboxStorage.spec.d.ts.map +1 -0
  211. package/dist/typescript/ui/utils/index.d.ts +3 -0
  212. package/dist/typescript/ui/utils/index.d.ts.map +1 -0
  213. package/ios/src/RCTAEPMessaging.mm +11 -0
  214. package/ios/src/RCTAEPMessaging.swift +30 -3
  215. package/jest.config.js +15 -0
  216. package/package.json +33 -5
  217. package/src/Messaging.ts +287 -32
  218. package/src/index.ts +3 -3
  219. package/src/models/ContentCard.ts +52 -27
  220. package/src/models/HTMLProposition.ts +1 -1
  221. package/src/models/JSONProposition.ts +1 -1
  222. package/src/models/PersonalizationSchema.ts +1 -0
  223. package/src/models/index.ts +22 -0
  224. package/src/ui/components/Button/Button.spec.tsx +496 -0
  225. package/src/ui/components/Button/Button.tsx +76 -0
  226. package/src/ui/components/ContentCardView/ContentCardView.spec.tsx +278 -0
  227. package/src/ui/components/ContentCardView/ContentCardView.tsx +400 -0
  228. package/src/ui/components/DismissButton/DismissButton.spec.tsx +314 -0
  229. package/src/ui/components/DismissButton/DismissButton.tsx +100 -0
  230. package/src/ui/components/FullScreenCenterView/FullScreenCenterView.tsx +32 -0
  231. package/src/ui/components/Inbox/EmptyState.tsx +89 -0
  232. package/src/ui/components/Inbox/Inbox.spec.tsx +478 -0
  233. package/src/ui/components/Inbox/Inbox.tsx +275 -0
  234. package/src/ui/components/Pagination/Pagination.spec.tsx +159 -0
  235. package/src/ui/components/Pagination/Pagination.tsx +222 -0
  236. package/src/ui/components/UnreadIcon/UnreadIcon.spec.tsx +878 -0
  237. package/src/ui/components/UnreadIcon/UnreadIcon.tsx +234 -0
  238. package/src/ui/components/index.ts +22 -0
  239. package/{dist/models/MessagingPropositionItem.js → src/ui/hooks/index.ts} +5 -4
  240. package/src/ui/hooks/useAspectRatio.spec.tsx +66 -0
  241. package/src/ui/hooks/useAspectRatio.tsx +39 -0
  242. package/src/ui/hooks/useContentCardUI.spec.tsx +82 -0
  243. package/src/ui/hooks/useContentCardUI.ts +48 -0
  244. package/src/ui/hooks/useInbox.spec.tsx +87 -0
  245. package/src/ui/hooks/useInbox.ts +46 -0
  246. package/src/ui/hooks/useInboxSettings.spec.tsx +41 -0
  247. package/src/ui/hooks/useInboxSettings.ts +24 -0
  248. package/src/ui/index.ts +7 -0
  249. package/src/ui/providers/InboxProvider.tsx +79 -0
  250. package/src/ui/theme/Theme.ts +57 -0
  251. package/src/ui/theme/ThemeProvider.tsx +120 -0
  252. package/src/ui/theme/index.ts +14 -0
  253. package/src/ui/types/ContentViewEvent.ts +20 -0
  254. package/src/ui/types/Templates.ts +77 -0
  255. package/src/ui/types/index.ts +14 -0
  256. package/src/ui/utils/generateCardHash.spec.tsx +86 -0
  257. package/src/ui/utils/generateCardHash.ts +59 -0
  258. package/src/ui/utils/inboxStorage.spec.tsx +136 -0
  259. package/src/ui/utils/inboxStorage.ts +64 -0
  260. package/src/ui/utils/index.ts +3 -0
  261. package/tutorials/ContentCardCustomizationGuide.md +661 -0
  262. package/tutorials/ContentCards.md +419 -0
  263. package/tutorials/Inbox.md +515 -0
  264. package/tutorials/resources/image-only-template.png +0 -0
  265. package/tutorials/resources/large-image-template.png +0 -0
  266. package/tutorials/resources/small-image-template.png +0 -0
  267. package/dist/Messaging.js +0 -152
  268. package/dist/Messaging.js.map +0 -1
  269. package/dist/index.js +0 -34
  270. package/dist/index.js.map +0 -1
  271. package/dist/models/ContentCard.d.ts +0 -51
  272. package/dist/models/ContentCard.js.map +0 -1
  273. package/dist/models/HTMLProposition.js.map +0 -1
  274. package/dist/models/InAppMessage.js.map +0 -1
  275. package/dist/models/JSONProposition.js.map +0 -1
  276. package/dist/models/Message.js +0 -156
  277. package/dist/models/Message.js.map +0 -1
  278. package/dist/models/MessagingDelegate.js +0 -14
  279. package/dist/models/MessagingDelegate.js.map +0 -1
  280. package/dist/models/MessagingEdgeEventType.js +0 -24
  281. package/dist/models/MessagingEdgeEventType.js.map +0 -1
  282. package/dist/models/MessagingProposition.js +0 -59
  283. package/dist/models/MessagingProposition.js.map +0 -1
  284. package/dist/models/MessagingPropositionItem.js.map +0 -1
  285. package/dist/models/PersonalizationSchema.js +0 -25
  286. package/dist/models/PersonalizationSchema.js.map +0 -1
  287. package/dist/models/PropositionItem.js +0 -78
  288. package/dist/models/PropositionItem.js.map +0 -1
  289. package/dist/models/ScopeDetails.js.map +0 -1
package/src/Messaging.ts CHANGED
@@ -14,12 +14,18 @@ import {
14
14
  NativeModules,
15
15
  NativeEventEmitter,
16
16
  NativeModule,
17
- Platform
18
- } from 'react-native';
19
- import Message from './models/Message';
20
- import { MessagingDelegate } from './models/MessagingDelegate';
21
- import { MessagingProposition } from './models/MessagingProposition';
22
- import { ContentCard } from './models/ContentCard';
17
+ Platform,
18
+ } from "react-native";
19
+ import Message from "./models/Message";
20
+ import { MessagingDelegate } from "./models/MessagingDelegate";
21
+ import { MessagingProposition } from "./models/MessagingProposition";
22
+ import { ContentCard } from "./models/ContentCard";
23
+ import { PersonalizationSchema } from "./models/PersonalizationSchema";
24
+ import { ContentTemplate } from "./ui/types/Templates";
25
+ import {
26
+ InboxSettings,
27
+ SettingsPlacement,
28
+ } from "./ui/providers/InboxProvider";
23
29
 
24
30
  export interface NativeMessagingModule {
25
31
  extensionVersion: () => Promise<string>;
@@ -35,9 +41,20 @@ export interface NativeMessagingModule {
35
41
  shouldSaveMessage: boolean
36
42
  ) => void;
37
43
  updatePropositionsForSurfaces: (surfaces: string[]) => void;
38
- trackContentCardDisplay: (proposition: MessagingProposition, contentCard: ContentCard) => void;
39
- trackContentCardInteraction: (proposition: MessagingProposition, contentCard: ContentCard) => void;
40
- trackPropositionItem: (itemId: string, interaction: string | null, eventType: number, tokens: string[] | null) => void;
44
+ trackContentCardDisplay: (
45
+ proposition: MessagingProposition,
46
+ contentCard: ContentCard
47
+ ) => void;
48
+ trackContentCardInteraction: (
49
+ proposition: MessagingProposition,
50
+ contentCard: ContentCard
51
+ ) => void;
52
+ trackPropositionItem: (
53
+ itemId: string,
54
+ interaction: string | null,
55
+ eventType: number,
56
+ tokens: string[] | null
57
+ ) => void;
41
58
  }
42
59
 
43
60
  const RCTAEPMessaging: NativeModule & NativeMessagingModule =
@@ -46,6 +63,134 @@ const RCTAEPMessaging: NativeModule & NativeMessagingModule =
46
63
  declare var messagingDelegate: MessagingDelegate;
47
64
  var messagingDelegate: MessagingDelegate;
48
65
 
66
+ function optString(map: Record<string, any> | undefined, key: string): string | undefined {
67
+ if (!map || typeof map !== 'object') return undefined;
68
+ const val = map[key] ?? map[key.toLowerCase()];
69
+ return typeof val === 'string' ? val : undefined;
70
+ }
71
+
72
+ function optInt(map: Record<string, any> | undefined, key: string, fallback: number): number {
73
+ if (!map || typeof map !== 'object') return fallback;
74
+ const val = map[key] ?? map[key.toLowerCase()];
75
+ if (typeof val === 'number' && !isNaN(val)) return val;
76
+ if (typeof val === 'string') {
77
+ const n = parseInt(val, 10);
78
+ return isNaN(n) ? fallback : n;
79
+ }
80
+ return fallback;
81
+ }
82
+
83
+ function optBoolean(map: Record<string, any> | undefined, key: string, fallback: boolean): boolean {
84
+ if (!map || typeof map !== 'object') return fallback;
85
+ const val = map[key] ?? map[key.toLowerCase()];
86
+ if (typeof val === 'boolean') return val;
87
+ if (val === 'true' || val === 1) return true;
88
+ if (val === 'false' || val === 0) return false;
89
+ return fallback;
90
+ }
91
+
92
+ function optTypedMap(map: Record<string, any> | undefined, key: string): Record<string, any> {
93
+ if (!map || typeof map !== 'object') return {};
94
+ const val = map[key] ?? map[key.toLowerCase()];
95
+ return val && typeof val === 'object' && !Array.isArray(val) ? val : {};
96
+ }
97
+
98
+ function createAepText(map: Record<string, any> | undefined, key: string): { content: string } | undefined {
99
+ const nested = optTypedMap(map, key);
100
+ const content = optString(nested, 'content') ?? optString(nested, 'txt');
101
+ return content !== undefined ? { content } : undefined;
102
+ }
103
+
104
+ function createAepColor(clrMap: Record<string, any>): { light: string; dark: string } | undefined {
105
+ if (!clrMap || typeof clrMap !== 'object') return undefined;
106
+ const light = optString(clrMap, 'light') ?? optString(clrMap, 'default') ?? '#FFFFFF';
107
+ const dark = optString(clrMap, 'dark') ?? light;
108
+ return { light, dark };
109
+ }
110
+
111
+ function createAepImage(map: Record<string, any> | undefined): { url: string; darkUrl?: string } | undefined {
112
+ if (!map || typeof map !== 'object') return undefined;
113
+ const url = optString(map, 'url') ?? optString(map, 'src');
114
+ if (!url) return undefined;
115
+ const darkUrl = optString(map, 'darkUrl') ?? optString(map, 'dark');
116
+ return { url, darkUrl };
117
+ }
118
+
119
+ function createAlignment(placement: string | undefined): SettingsPlacement {
120
+ const p = (placement ?? '').toLowerCase();
121
+ if (['topleft', 'topright', 'bottomleft', 'bottomright'].includes(p)) {
122
+ return p as SettingsPlacement;
123
+ }
124
+ return 'topleft';
125
+ }
126
+
127
+ function createInboxSettingsFromContent(
128
+ contentMap: Record<string, any>,
129
+ activityId?: string
130
+ ): InboxSettings {
131
+ const heading = createAepText(contentMap, 'heading') ?? createAepText(contentMap, 'Heading');
132
+ const layoutMap = optTypedMap(contentMap, 'layout');
133
+ const orientation = (optString(layoutMap, 'orientation') ?? 'vertical') as 'horizontal' | 'vertical';
134
+ const capacity = optInt(contentMap, 'capacity', 15);
135
+
136
+ if (!heading || !heading.content) {
137
+ throw new Error(
138
+ 'Messaging.getInbox: inbox content is missing a valid heading (heading.content).'
139
+ );
140
+ }
141
+
142
+ const emptyStateSettings = optTypedMap(contentMap, 'emptyStateSettings') ||
143
+ optTypedMap(contentMap, 'empty_state_settings') || {};
144
+ const emptyMessage = createAepText(emptyStateSettings, 'message') ?? createAepText(emptyStateSettings, 'Message');
145
+ const emptyImage = createAepImage(optTypedMap(emptyStateSettings, 'image'));
146
+
147
+ const unreadIndicator = optTypedMap(contentMap, 'unread_indicator') ||
148
+ optTypedMap(contentMap, 'unreadIndicator') || {};
149
+ const unreadBg = optTypedMap(unreadIndicator, 'unread_bg') || optTypedMap(unreadIndicator, 'unreadBg') || {};
150
+ const unreadBgClr = optTypedMap(unreadBg, 'clr') || {};
151
+ const unreadBgColor = createAepColor(unreadBgClr);
152
+
153
+ const unreadIcon = optTypedMap(unreadIndicator, 'unread_icon') || optTypedMap(unreadIndicator, 'unreadIcon') || {};
154
+ const placement = createAlignment(optString(unreadIndicator, 'placement') ?? optString(unreadIcon, 'placement'));
155
+ const unreadIconImage = createAepImage(optTypedMap(unreadIcon, 'image'));
156
+
157
+ const isUnreadEnabled = optBoolean(contentMap, 'isUnreadEnabled', true) ||
158
+ optBoolean(contentMap, 'is_unread_enabled', true);
159
+
160
+ const content: InboxSettings['content'] = {
161
+ heading,
162
+ layout: { orientation },
163
+ capacity,
164
+ emptyStateSettings: {
165
+ message: emptyMessage ?? { content: 'No Content Available' },
166
+ ...(emptyImage && { image: emptyImage }),
167
+ },
168
+ isUnreadEnabled,
169
+ };
170
+
171
+ if (isUnreadEnabled && (unreadBgColor || unreadIconImage)) {
172
+ content.unread_indicator = {
173
+ unread_bg: {
174
+ clr: unreadBgColor ?? { light: '#FFF3E0', dark: '#2D1B0E' },
175
+ },
176
+ unread_icon: {
177
+ placement,
178
+ image: unreadIconImage ?? {
179
+ url: 'https://icons.veryicon.com/png/o/leisure/crisp-app-icon-library-v3/notification-5.png',
180
+ darkUrl: '',
181
+ },
182
+ },
183
+ };
184
+ }
185
+
186
+ return {
187
+ ...(activityId && { activityId }),
188
+ content,
189
+ showPagination: optBoolean(contentMap, 'showPagination', false) ||
190
+ optBoolean(contentMap, 'show_pagination', false),
191
+ };
192
+ }
193
+
49
194
  class Messaging {
50
195
  /**
51
196
  * Returns the version of the AEPMessaging extension
@@ -106,29 +251,45 @@ class Messaging {
106
251
 
107
252
  /**
108
253
  * @deprecated Use PropositionItem.track(...) instead.
109
- */
110
- static trackContentCardDisplay(proposition: MessagingProposition, contentCard: ContentCard): void {
254
+ */
255
+ static trackContentCardDisplay(
256
+ proposition: MessagingProposition,
257
+ contentCard: ContentCard
258
+ ): void {
111
259
  RCTAEPMessaging.trackContentCardDisplay(proposition, contentCard);
112
260
  }
113
261
 
114
- /**
262
+ /**
115
263
  * @deprecated Use PropositionItem.track(...) instead.
116
264
  */
117
- static trackContentCardInteraction(proposition: MessagingProposition, contentCard: ContentCard): void {
265
+ static trackContentCardInteraction(
266
+ proposition: MessagingProposition,
267
+ contentCard: ContentCard
268
+ ): void {
118
269
  RCTAEPMessaging.trackContentCardInteraction(proposition, contentCard);
119
270
  }
120
271
 
121
272
  /**
122
273
  * Tracks interactions with a PropositionItem using the provided interaction and event type.
123
274
  * This method is used internally by the PropositionItem.track() method.
124
- *
275
+ *
125
276
  * @param {string} itemId - The unique identifier of the PropositionItem
126
277
  * @param {string | null} interaction - A custom string value to be recorded in the interaction
127
278
  * @param {number} eventType - The MessagingEdgeEventType numeric value
128
279
  * @param {string[] | null} tokens - Array containing the sub-item tokens for recording interaction
129
280
  */
130
- static trackPropositionItem(itemId: string, interaction: string | null, eventType: number, tokens: string[] | null): void {
131
- RCTAEPMessaging.trackPropositionItem(itemId, interaction, eventType, tokens);
281
+ static trackPropositionItem(
282
+ itemId: string,
283
+ interaction: string | null,
284
+ eventType: number,
285
+ tokens: string[] | null
286
+ ): void {
287
+ RCTAEPMessaging.trackPropositionItem(
288
+ itemId,
289
+ interaction,
290
+ eventType,
291
+ tokens
292
+ );
132
293
  }
133
294
 
134
295
  /**
@@ -140,18 +301,18 @@ class Messaging {
140
301
 
141
302
  const eventEmitter = new NativeEventEmitter(RCTAEPMessaging);
142
303
 
143
- eventEmitter.addListener('onShow', (message: Message) =>
304
+ eventEmitter.addListener("onShow", (message: Message) =>
144
305
  messagingDelegate?.onShow?.(new Message(message))
145
306
  );
146
307
 
147
- eventEmitter.addListener('onDismiss', (message: Message) => {
308
+ eventEmitter.addListener("onDismiss", (message: Message) => {
148
309
  const messageInstance = new Message(message);
149
310
  messageInstance._clearJavascriptMessageHandlers();
150
311
  messageInstance._clearJavascriptResultHandlers();
151
312
  messagingDelegate?.onDismiss?.(messageInstance);
152
313
  });
153
314
 
154
- eventEmitter.addListener('shouldShowMessage', (message: Message) => {
315
+ eventEmitter.addListener("shouldShowMessage", (message: Message) => {
155
316
  const messageInstance = new Message(message);
156
317
  const shouldShowMessage =
157
318
  messagingDelegate?.shouldShowMessage?.(messageInstance) ?? true;
@@ -160,26 +321,34 @@ class Messaging {
160
321
  RCTAEPMessaging.setMessageSettings(shouldShowMessage, shouldSaveMessage);
161
322
  });
162
323
 
163
- if (Platform.OS === 'ios') {
164
- eventEmitter.addListener('urlLoaded', (event: {url: string, message: Message}) =>
165
- messagingDelegate?.urlLoaded?.(event.url, new Message(event.message))
324
+ if (Platform.OS === "ios") {
325
+ eventEmitter.addListener(
326
+ "urlLoaded",
327
+ (event: { url: string; message: Message }) =>
328
+ messagingDelegate?.urlLoaded?.(event.url, new Message(event.message))
166
329
  );
167
330
  }
168
331
 
169
- if (Platform.OS === 'android') {
170
- eventEmitter.addListener('onContentLoaded', (event: {message: Message}) =>
171
- messagingDelegate?.onContentLoaded?.(new Message(event.message))
332
+ if (Platform.OS === "android") {
333
+ eventEmitter.addListener(
334
+ "onContentLoaded",
335
+ (event: { message: Message }) =>
336
+ messagingDelegate?.onContentLoaded?.(new Message(event.message))
172
337
  );
173
338
  }
174
339
 
175
340
  RCTAEPMessaging.setMessagingDelegate();
176
341
 
177
342
  return () => {
178
- eventEmitter.removeAllListeners('onDismiss');
179
- eventEmitter.removeAllListeners('onShow');
180
- eventEmitter.removeAllListeners('shouldShowMessage');
181
- eventEmitter.removeAllListeners('urlLoaded');
182
- eventEmitter.removeAllListeners('onContentLoaded');
343
+ eventEmitter.removeAllListeners("onDismiss");
344
+ eventEmitter.removeAllListeners("onShow");
345
+ eventEmitter.removeAllListeners("shouldShowMessage");
346
+ if (Platform.OS === "ios") {
347
+ eventEmitter.removeAllListeners("urlLoaded");
348
+ }
349
+ if (Platform.OS === "android") {
350
+ eventEmitter.removeAllListeners("onContentLoaded");
351
+ }
183
352
  };
184
353
  }
185
354
 
@@ -201,8 +370,94 @@ class Messaging {
201
370
  * Dispatches an event to fetch propositions for the provided surfaces from remote.
202
371
  * @param surfaces A list of surface names to update
203
372
  */
204
- static updatePropositionsForSurfaces(surfaces: string[]) {
205
- RCTAEPMessaging.updatePropositionsForSurfaces(surfaces);
373
+ static async updatePropositionsForSurfaces(
374
+ surfaces: string[]
375
+ ): Promise<void> {
376
+ return await RCTAEPMessaging.updatePropositionsForSurfaces(surfaces);
377
+ }
378
+
379
+ /**
380
+ * @experimental
381
+ * Retrieves the content card UI data for a given surface.
382
+ * @param surface The surface to get the content card UI data for
383
+ * @returns The content card UI data for the given surface
384
+ */
385
+ static async getContentCardUI(surface: string): Promise<ContentTemplate[]> {
386
+ const messages = await Messaging.getPropositionsForSurfaces([surface]);
387
+ const propositions = messages[surface];
388
+ if (!propositions?.length) {
389
+ return [];
390
+ }
391
+ const contentCards = propositions
392
+ .flatMap((proposition) =>
393
+ proposition.items.filter(
394
+ (item) => item.schema === PersonalizationSchema.CONTENT_CARD
395
+ )
396
+ );
397
+
398
+ if (!contentCards?.length) {
399
+ return [];
400
+ }
401
+
402
+ return contentCards.map((card: any) => {
403
+ // Test: To mark first 2 cards as read, swap the two map lines above to add index, then replace isRead with:
404
+ // return contentCards.map((card: any, index: number) => {
405
+ const type = card.data?.meta?.adobe?.template ?? "SmallImage";
406
+ const isRead = card.data?.read ?? false;
407
+ // const isRead = card.data?.read ?? (index < 2);
408
+ return new ContentTemplate(card, type, isRead);
409
+ });
410
+ }
411
+
412
+
413
+ /**
414
+ * @experimental
415
+ * Loads inbox UI settings from the inbox proposition for the given surface.
416
+ * @throws {Error} When no propositions, no inbox proposition, or invalid inbox content is returned.
417
+ */
418
+ static async getInbox(surface: string): Promise<InboxSettings> {
419
+ const propositionsMap = await Messaging.getPropositionsForSurfaces([surface]);
420
+ const propositions = propositionsMap[surface];
421
+
422
+ if (!propositions?.length) {
423
+ throw new Error(
424
+ `Messaging.getInbox: no propositions returned for surface "${surface}".`
425
+ );
426
+ }
427
+
428
+ const inboxPropositions = propositions.filter(
429
+ (p) =>
430
+ p.items?.length > 0 &&
431
+ (p.items[0].schema === PersonalizationSchema.INBOX ||
432
+ String(p.items[0].schema).includes('inbox'))
433
+ );
434
+
435
+ if (inboxPropositions.length === 0) {
436
+ throw new Error(
437
+ `Messaging.getInbox: no inbox proposition found for surface "${surface}".`
438
+ );
439
+ }
440
+
441
+ const sortedByRank = [...inboxPropositions].sort(
442
+ (a, b) => ((b as any).rank ?? 0) - ((a as any).rank ?? 0)
443
+ );
444
+ const inboxProposition = sortedByRank[0];
445
+ const firstItem = inboxProposition.items[0];
446
+ const rawItem = firstItem as any;
447
+
448
+ const contentMap =
449
+ rawItem?.inboxSchemaData?.content ??
450
+ rawItem?.data?.inboxSchemaData?.content ??
451
+ rawItem?.data?.content;
452
+
453
+ if (!contentMap || typeof contentMap !== 'object') {
454
+ throw new Error(
455
+ `Messaging.getInbox: inbox proposition has no valid content configuration for surface "${surface}".`
456
+ );
457
+ }
458
+
459
+ const activityId = inboxProposition.scopeDetails?.activity?.id;
460
+ return createInboxSettingsFromContent(contentMap, activityId);
206
461
  }
207
462
  }
208
463
 
package/src/index.ts CHANGED
@@ -11,7 +11,6 @@ governing permissions and limitations under the License.
11
11
  */
12
12
 
13
13
  import Messaging from './Messaging';
14
- import { ContentCard, ContentCardData } from './models/ContentCard';
15
14
 
16
15
  import { InAppMessage } from './models/InAppMessage';
17
16
  import { HTMLProposition, HTMLPropositionData } from './models/HTMLProposition';
@@ -26,11 +25,12 @@ import { PersonalizationSchema } from './models/PersonalizationSchema';
26
25
  import { PropositionItem, PropositionItemData } from './models/PropositionItem';
27
26
  import { Activity, Characteristics } from './models/ScopeDetails';
28
27
 
28
+ export * from './models/ContentCard';
29
+ export * from './ui';
30
+
29
31
  export {
30
32
  Activity,
31
33
  Characteristics,
32
- ContentCard,
33
- ContentCardData,
34
34
  InAppMessage,
35
35
  Messaging,
36
36
  Message,
@@ -13,46 +13,71 @@
13
13
  import { PersonalizationSchema } from './PersonalizationSchema';
14
14
  import { PropositionItem, PropositionItemData } from './PropositionItem';
15
15
 
16
- type ContentCardTemplate = 'SmallImage';
17
- type DismissButtonStyle = 'circle' | 'none' | 'simple';
16
+ export type ContentCardTemplate = 'SmallImage' | 'LargeImage' | 'ImageOnly';
17
+ export type DismissButtonStyle = 'circle' | 'none' | 'simple';
18
+
19
+ export interface ContentCardButton {
20
+ readonly interactId: string;
21
+ readonly actionUrl?: string;
22
+ readonly id?: string;
23
+ readonly text: {
24
+ readonly content: string;
25
+ };
26
+ }
27
+
28
+ export interface ContentCardContent {
29
+ readonly image?: {
30
+ readonly alt?: string;
31
+ readonly url: string;
32
+ readonly darkUrl?: string;
33
+ };
34
+ readonly buttons?: readonly ContentCardButton[];
35
+ readonly dismissBtn?: {
36
+ readonly style: DismissButtonStyle;
37
+ };
38
+ readonly actionUrl?: string;
39
+ readonly body?: {
40
+ readonly content: string;
41
+ };
42
+ readonly title: {
43
+ readonly content: string;
44
+ };
45
+ }
46
+
47
+ export type ImageOnlyContent = Pick<
48
+ ContentCardContent,
49
+ 'image' | 'dismissBtn' | 'actionUrl'
50
+ >;
51
+
52
+ export type LargeImageContentData = ContentCardContent;
53
+
54
+ export type SmallImageContentData = ContentCardContent;
55
+
56
+ export interface ContentCardMeta {
57
+ [key: string]: any;
58
+ adobe: { template: ContentCardTemplate };
59
+ surface?: string;
60
+ }
18
61
 
19
62
  export interface ContentCardData extends PropositionItemData {
20
63
  id: string;
64
+ schema: PersonalizationSchema.CONTENT_CARD;
21
65
  data: {
22
66
  contentType: 'application/json';
23
67
  expiryDate: number;
24
68
  publishedDate: number;
25
- content: {
26
- actionUrl: string;
27
-
28
- body: { content: string };
29
- title: { content: string };
30
- buttons: Array<{
31
- actionUrl: string;
32
- id: string;
33
- text: { content: string };
34
- interactId: string;
35
- }>;
36
- image: { alt: string; url: string };
37
- dismissBtn: { style: DismissButtonStyle };
38
- };
39
- meta: {
40
- [key: string]: any;
41
- adobe: { template: ContentCardTemplate };
42
- dismissState: boolean;
43
- readState: boolean;
44
- surface: string;
45
- };
69
+ meta: ContentCardMeta;
70
+ content: SmallImageContentData | LargeImageContentData | ImageOnlyContent;
46
71
  };
47
- schema: PersonalizationSchema.CONTENT_CARD;
48
72
  }
49
73
 
50
74
  export class ContentCard extends PropositionItem {
51
- declare data: ContentCardData['data']; // Override data type for better typing
75
+ data: ContentCardData['data'];
76
+ isRead: boolean = false;
52
77
 
53
- constructor(contentCardData: ContentCardData) {
78
+ constructor(contentCardData: ContentCardData, isRead: boolean = false) {
54
79
  super(contentCardData);
55
80
  this.data = contentCardData.data;
81
+ this.isRead = isRead;
56
82
  }
57
-
58
83
  }
@@ -21,7 +21,7 @@ export interface HTMLPropositionData extends PropositionItemData {
21
21
  }
22
22
 
23
23
  export class HTMLProposition extends PropositionItem {
24
- declare data: HTMLPropositionData['data'];
24
+ data: HTMLPropositionData['data'];
25
25
 
26
26
  constructor(htmlData: HTMLPropositionData) {
27
27
  super(htmlData);
@@ -21,7 +21,7 @@ export interface JSONPropositionData extends PropositionItemData {
21
21
  }
22
22
 
23
23
  export class JSONPropositionItem extends PropositionItem {
24
- declare data: JSONPropositionData['data'];
24
+ data: JSONPropositionData['data'];
25
25
 
26
26
  constructor(jsonData: JSONPropositionData) {
27
27
  super(jsonData);
@@ -15,6 +15,7 @@ export enum PersonalizationSchema {
15
15
  DEFAULT_CONTENT = 'https://ns.adobe.com/personalization/default-content-item',
16
16
  HTML_CONTENT = 'https://ns.adobe.com/personalization/html-content-item',
17
17
  IN_APP = 'https://ns.adobe.com/personalization/message/in-app',
18
+ INBOX = 'https://ns.adobe.com/personalization/message/inbox',
18
19
  JSON_CONTENT = 'https://ns.adobe.com/personalization/json-content-item',
19
20
  NATIVE_ALERT = 'https://ns.adobe.com/personalization/message/native-alert',
20
21
  RULESET_ITEM = 'https://ns.adobe.com/personalization/ruleset-item'
@@ -0,0 +1,22 @@
1
+ /*
2
+ Copyright 2026 Adobe. All rights reserved.
3
+ This file is licensed to you under the Apache License, Version 2.0 (the
4
+ "License"); you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+ http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
7
+ or agreed to in writing, software distributed under the License is
8
+ distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF
9
+ ANY KIND, either express or implied. See the License for the specific
10
+ language governing permissions and limitations under the License.
11
+ */
12
+
13
+ export * from './ContentCard';
14
+ export * from './InAppMessage';
15
+ export * from './JSONProposition';
16
+ export * from './Message';
17
+ export * from './MessagingDelegate';
18
+ export * from './MessagingEdgeEventType';
19
+ export * from './MessagingProposition';
20
+ export * from './MessagingPropositionItem';
21
+ export * from './PersonalizationSchema';
22
+ export * from './ScopeDetails';