@novu/react 3.19.2 → 3.20.0-rc.569d407fd0

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 (250) hide show
  1. package/dist/cjs/components/Bell.cjs +6 -21
  2. package/dist/cjs/components/Bell.cjs.map +1 -1
  3. package/dist/cjs/components/Bell.d.cts +2 -3
  4. package/dist/cjs/components/Inbox.cjs +100 -138
  5. package/dist/cjs/components/Inbox.cjs.map +1 -1
  6. package/dist/cjs/components/InboxContent.cjs +9 -65
  7. package/dist/cjs/components/InboxContent.cjs.map +1 -1
  8. package/dist/cjs/components/InboxContent.d.cts +2 -3
  9. package/dist/cjs/components/Mounter.cjs +20 -13
  10. package/dist/cjs/components/Mounter.cjs.map +1 -1
  11. package/dist/cjs/components/Mounter.d.cts +12 -4
  12. package/dist/cjs/components/Notifications.cjs +9 -59
  13. package/dist/cjs/components/Notifications.cjs.map +1 -1
  14. package/dist/cjs/components/Notifications.d.cts +2 -3
  15. package/dist/cjs/components/NovuUI.cjs +17 -6
  16. package/dist/cjs/components/NovuUI.cjs.map +1 -1
  17. package/dist/cjs/components/NovuUI.d.cts +4 -0
  18. package/dist/cjs/{context/RendererContext.cjs → components/OutletHost.cjs} +15 -15
  19. package/dist/cjs/components/OutletHost.cjs.map +1 -0
  20. package/dist/cjs/components/OutletHost.d.cts +14 -0
  21. package/dist/cjs/components/Preferences.cjs +1 -20
  22. package/dist/cjs/components/Preferences.cjs.map +1 -1
  23. package/dist/cjs/components/connect-chat/ConnectChat.cjs +2 -3
  24. package/dist/cjs/components/connect-chat/ConnectChat.cjs.map +1 -1
  25. package/dist/cjs/components/connect-chat/DefaultConnectChat.cjs +14 -23
  26. package/dist/cjs/components/connect-chat/DefaultConnectChat.cjs.map +1 -1
  27. package/dist/cjs/components/index.cjs +2 -0
  28. package/dist/cjs/components/index.cjs.map +1 -1
  29. package/dist/cjs/components/index.d.cts +6 -0
  30. package/dist/cjs/components/msteams-connect-button/DefaultMsTeamsConnectButton.cjs +17 -26
  31. package/dist/cjs/components/msteams-connect-button/DefaultMsTeamsConnectButton.cjs.map +1 -1
  32. package/dist/cjs/components/msteams-connect-button/MsTeamsConnectButton.cjs +2 -3
  33. package/dist/cjs/components/msteams-connect-button/MsTeamsConnectButton.cjs.map +1 -1
  34. package/dist/cjs/components/msteams-link-user/DefaultMsTeamsLinkUser.cjs +13 -22
  35. package/dist/cjs/components/msteams-link-user/DefaultMsTeamsLinkUser.cjs.map +1 -1
  36. package/dist/cjs/components/msteams-link-user/MsTeamsLinkUser.cjs +2 -3
  37. package/dist/cjs/components/msteams-link-user/MsTeamsLinkUser.cjs.map +1 -1
  38. package/dist/cjs/components/notification-item/ClockIcon.cjs +43 -0
  39. package/dist/cjs/components/notification-item/ClockIcon.cjs.map +1 -0
  40. package/dist/cjs/components/notification-item/ClockIcon.d.cts +7 -0
  41. package/dist/cjs/components/notification-item/Markdown.cjs +53 -0
  42. package/dist/cjs/components/notification-item/Markdown.cjs.map +1 -0
  43. package/dist/cjs/components/notification-item/Markdown.d.cts +12 -0
  44. package/dist/cjs/components/notification-item/NotificationItem.cjs +146 -0
  45. package/dist/cjs/components/notification-item/NotificationItem.cjs.map +1 -0
  46. package/dist/cjs/components/notification-item/NotificationItem.d.cts +40 -0
  47. package/dist/cjs/components/notification-item/context.cjs +49 -0
  48. package/dist/cjs/components/notification-item/context.cjs.map +1 -0
  49. package/dist/cjs/components/notification-item/context.d.cts +23 -0
  50. package/dist/cjs/components/notification-item/parts/Actions.cjs +56 -0
  51. package/dist/cjs/components/notification-item/parts/Actions.cjs.map +1 -0
  52. package/dist/cjs/components/notification-item/parts/Actions.d.cts +11 -0
  53. package/dist/cjs/components/notification-item/parts/Avatar.cjs +65 -0
  54. package/dist/cjs/components/notification-item/parts/Avatar.cjs.map +1 -0
  55. package/dist/cjs/components/notification-item/parts/Avatar.d.cts +8 -0
  56. package/dist/cjs/components/notification-item/parts/Content.cjs +66 -0
  57. package/dist/cjs/components/notification-item/parts/Content.cjs.map +1 -0
  58. package/dist/cjs/components/notification-item/parts/Content.d.cts +17 -0
  59. package/dist/cjs/components/notification-item/parts/Date.cjs +114 -0
  60. package/dist/cjs/components/notification-item/parts/Date.cjs.map +1 -0
  61. package/dist/cjs/components/notification-item/parts/Date.d.cts +11 -0
  62. package/dist/cjs/components/notification-item/parts/Dot.cjs +48 -0
  63. package/dist/cjs/components/notification-item/parts/Dot.cjs.map +1 -0
  64. package/dist/cjs/components/notification-item/parts/Dot.d.cts +9 -0
  65. package/dist/cjs/components/notification-item/parts/Subject.cjs +92 -0
  66. package/dist/cjs/components/notification-item/parts/Subject.cjs.map +1 -0
  67. package/dist/cjs/components/notification-item/parts/Subject.d.cts +15 -0
  68. package/dist/cjs/components/slack-connect-button/DefaultSlackConnectButton.cjs +18 -27
  69. package/dist/cjs/components/slack-connect-button/DefaultSlackConnectButton.cjs.map +1 -1
  70. package/dist/cjs/components/slack-connect-button/SlackConnectButton.cjs +2 -3
  71. package/dist/cjs/components/slack-connect-button/SlackConnectButton.cjs.map +1 -1
  72. package/dist/cjs/components/slack-link-user/DefaultSlackLinkUser.cjs +13 -22
  73. package/dist/cjs/components/slack-link-user/DefaultSlackLinkUser.cjs.map +1 -1
  74. package/dist/cjs/components/slack-link-user/SlackLinkUser.cjs +2 -3
  75. package/dist/cjs/components/slack-link-user/SlackLinkUser.cjs.map +1 -1
  76. package/dist/cjs/components/subscription/DefaultSubscription.cjs +14 -22
  77. package/dist/cjs/components/subscription/DefaultSubscription.cjs.map +1 -1
  78. package/dist/cjs/components/subscription/Subscription.cjs +2 -3
  79. package/dist/cjs/components/subscription/Subscription.cjs.map +1 -1
  80. package/dist/cjs/components/subscription/SubscriptionButton.cjs +9 -26
  81. package/dist/cjs/components/subscription/SubscriptionButton.cjs.map +1 -1
  82. package/dist/cjs/components/subscription/SubscriptionButton.d.cts +1 -1
  83. package/dist/cjs/components/subscription/SubscriptionPreferences.cjs +9 -26
  84. package/dist/cjs/components/subscription/SubscriptionPreferences.cjs.map +1 -1
  85. package/dist/cjs/components/subscription/SubscriptionPreferences.d.cts +1 -1
  86. package/dist/cjs/components/telegram-connect-button/DefaultTelegramConnectButton.cjs +14 -23
  87. package/dist/cjs/components/telegram-connect-button/DefaultTelegramConnectButton.cjs.map +1 -1
  88. package/dist/cjs/components/telegram-connect-button/TelegramConnectButton.cjs +2 -3
  89. package/dist/cjs/components/telegram-connect-button/TelegramConnectButton.cjs.map +1 -1
  90. package/dist/cjs/context/NovuUIContext.cjs +3 -0
  91. package/dist/cjs/context/NovuUIContext.cjs.map +1 -1
  92. package/dist/cjs/context/NovuUIContext.d.cts +8 -1
  93. package/dist/cjs/context/OutletStore.cjs +97 -0
  94. package/dist/cjs/context/OutletStore.cjs.map +1 -0
  95. package/dist/cjs/context/OutletStore.d.cts +31 -0
  96. package/dist/cjs/hooks/internal/useEngineAccessor.cjs +36 -0
  97. package/dist/cjs/hooks/internal/useEngineAccessor.cjs.map +1 -0
  98. package/dist/cjs/hooks/internal/useEngineAccessor.d.cts +4 -0
  99. package/dist/cjs/hooks/internal/useEngineStores.cjs +54 -0
  100. package/dist/cjs/hooks/internal/useEngineStores.cjs.map +1 -0
  101. package/dist/cjs/hooks/internal/useEngineStores.d.cts +13 -0
  102. package/dist/cjs/hooks/internal/useIsomorphicLayoutEffect.cjs +32 -0
  103. package/dist/cjs/hooks/internal/useIsomorphicLayoutEffect.cjs.map +1 -0
  104. package/dist/cjs/hooks/internal/useIsomorphicLayoutEffect.d.cts +5 -0
  105. package/dist/cjs/hooks/internal/useNotificationOutlets.cjs +57 -0
  106. package/dist/cjs/hooks/internal/useNotificationOutlets.cjs.map +1 -0
  107. package/dist/cjs/hooks/internal/useNotificationOutlets.d.cts +33 -0
  108. package/dist/cjs/hooks/internal/useOutletRenderer.cjs +53 -0
  109. package/dist/cjs/hooks/internal/useOutletRenderer.cjs.map +1 -0
  110. package/dist/cjs/hooks/internal/useOutletRenderer.d.cts +14 -0
  111. package/dist/cjs/index.cjs +2 -0
  112. package/dist/cjs/index.cjs.map +1 -1
  113. package/dist/cjs/index.d.cts +6 -0
  114. package/dist/cjs/server/index.cjs +14 -0
  115. package/dist/cjs/server/index.cjs.map +1 -1
  116. package/dist/cjs/server/index.d.cts +15 -1
  117. package/dist/cjs/utils/appearance.cjs +2 -2
  118. package/dist/cjs/utils/appearance.cjs.map +1 -1
  119. package/dist/cjs/utils/appearance.d.cts +2 -3
  120. package/dist/esm/components/Bell.d.ts +2 -3
  121. package/dist/esm/components/Bell.js +7 -22
  122. package/dist/esm/components/Bell.js.map +1 -1
  123. package/dist/esm/components/Inbox.js +100 -138
  124. package/dist/esm/components/Inbox.js.map +1 -1
  125. package/dist/esm/components/InboxContent.d.ts +2 -3
  126. package/dist/esm/components/InboxContent.js +10 -66
  127. package/dist/esm/components/InboxContent.js.map +1 -1
  128. package/dist/esm/components/Mounter.d.ts +12 -4
  129. package/dist/esm/components/Mounter.js +19 -14
  130. package/dist/esm/components/Mounter.js.map +1 -1
  131. package/dist/esm/components/Notifications.d.ts +2 -3
  132. package/dist/esm/components/Notifications.js +10 -60
  133. package/dist/esm/components/Notifications.js.map +1 -1
  134. package/dist/esm/components/NovuUI.d.ts +4 -0
  135. package/dist/esm/components/NovuUI.js +16 -6
  136. package/dist/esm/components/NovuUI.js.map +1 -1
  137. package/dist/esm/components/OutletHost.d.ts +14 -0
  138. package/dist/esm/components/OutletHost.js +15 -0
  139. package/dist/esm/components/OutletHost.js.map +1 -0
  140. package/dist/esm/components/Preferences.js +1 -10
  141. package/dist/esm/components/Preferences.js.map +1 -1
  142. package/dist/esm/components/connect-chat/ConnectChat.js +2 -3
  143. package/dist/esm/components/connect-chat/ConnectChat.js.map +1 -1
  144. package/dist/esm/components/connect-chat/DefaultConnectChat.js +15 -24
  145. package/dist/esm/components/connect-chat/DefaultConnectChat.js.map +1 -1
  146. package/dist/esm/components/index.d.ts +6 -0
  147. package/dist/esm/components/index.js +1 -0
  148. package/dist/esm/components/index.js.map +1 -1
  149. package/dist/esm/components/msteams-connect-button/DefaultMsTeamsConnectButton.js +18 -27
  150. package/dist/esm/components/msteams-connect-button/DefaultMsTeamsConnectButton.js.map +1 -1
  151. package/dist/esm/components/msteams-connect-button/MsTeamsConnectButton.js +2 -3
  152. package/dist/esm/components/msteams-connect-button/MsTeamsConnectButton.js.map +1 -1
  153. package/dist/esm/components/msteams-link-user/DefaultMsTeamsLinkUser.js +14 -23
  154. package/dist/esm/components/msteams-link-user/DefaultMsTeamsLinkUser.js.map +1 -1
  155. package/dist/esm/components/msteams-link-user/MsTeamsLinkUser.js +2 -3
  156. package/dist/esm/components/msteams-link-user/MsTeamsLinkUser.js.map +1 -1
  157. package/dist/esm/components/notification-item/ClockIcon.d.ts +7 -0
  158. package/dist/esm/components/notification-item/ClockIcon.js +18 -0
  159. package/dist/esm/components/notification-item/ClockIcon.js.map +1 -0
  160. package/dist/esm/components/notification-item/Markdown.d.ts +12 -0
  161. package/dist/esm/components/notification-item/Markdown.js +28 -0
  162. package/dist/esm/components/notification-item/Markdown.js.map +1 -0
  163. package/dist/esm/components/notification-item/NotificationItem.d.ts +40 -0
  164. package/dist/esm/components/notification-item/NotificationItem.js +131 -0
  165. package/dist/esm/components/notification-item/NotificationItem.js.map +1 -0
  166. package/dist/esm/components/notification-item/context.d.ts +23 -0
  167. package/dist/esm/components/notification-item/context.js +21 -0
  168. package/dist/esm/components/notification-item/context.js.map +1 -0
  169. package/dist/esm/components/notification-item/parts/Actions.d.ts +11 -0
  170. package/dist/esm/components/notification-item/parts/Actions.js +30 -0
  171. package/dist/esm/components/notification-item/parts/Actions.js.map +1 -0
  172. package/dist/esm/components/notification-item/parts/Avatar.d.ts +8 -0
  173. package/dist/esm/components/notification-item/parts/Avatar.js +40 -0
  174. package/dist/esm/components/notification-item/parts/Avatar.js.map +1 -0
  175. package/dist/esm/components/notification-item/parts/Content.d.ts +17 -0
  176. package/dist/esm/components/notification-item/parts/Content.js +40 -0
  177. package/dist/esm/components/notification-item/parts/Content.js.map +1 -0
  178. package/dist/esm/components/notification-item/parts/Date.d.ts +11 -0
  179. package/dist/esm/components/notification-item/parts/Date.js +89 -0
  180. package/dist/esm/components/notification-item/parts/Date.js.map +1 -0
  181. package/dist/esm/components/notification-item/parts/Dot.d.ts +9 -0
  182. package/dist/esm/components/notification-item/parts/Dot.js +23 -0
  183. package/dist/esm/components/notification-item/parts/Dot.js.map +1 -0
  184. package/dist/esm/components/notification-item/parts/Subject.d.ts +15 -0
  185. package/dist/esm/components/notification-item/parts/Subject.js +66 -0
  186. package/dist/esm/components/notification-item/parts/Subject.js.map +1 -0
  187. package/dist/esm/components/slack-connect-button/DefaultSlackConnectButton.js +19 -28
  188. package/dist/esm/components/slack-connect-button/DefaultSlackConnectButton.js.map +1 -1
  189. package/dist/esm/components/slack-connect-button/SlackConnectButton.js +2 -3
  190. package/dist/esm/components/slack-connect-button/SlackConnectButton.js.map +1 -1
  191. package/dist/esm/components/slack-link-user/DefaultSlackLinkUser.js +14 -23
  192. package/dist/esm/components/slack-link-user/DefaultSlackLinkUser.js.map +1 -1
  193. package/dist/esm/components/slack-link-user/SlackLinkUser.js +2 -3
  194. package/dist/esm/components/slack-link-user/SlackLinkUser.js.map +1 -1
  195. package/dist/esm/components/subscription/DefaultSubscription.js +15 -23
  196. package/dist/esm/components/subscription/DefaultSubscription.js.map +1 -1
  197. package/dist/esm/components/subscription/Subscription.js +2 -3
  198. package/dist/esm/components/subscription/Subscription.js.map +1 -1
  199. package/dist/esm/components/subscription/SubscriptionButton.d.ts +1 -1
  200. package/dist/esm/components/subscription/SubscriptionButton.js +10 -27
  201. package/dist/esm/components/subscription/SubscriptionButton.js.map +1 -1
  202. package/dist/esm/components/subscription/SubscriptionPreferences.d.ts +1 -1
  203. package/dist/esm/components/subscription/SubscriptionPreferences.js +10 -27
  204. package/dist/esm/components/subscription/SubscriptionPreferences.js.map +1 -1
  205. package/dist/esm/components/telegram-connect-button/DefaultTelegramConnectButton.js +15 -24
  206. package/dist/esm/components/telegram-connect-button/DefaultTelegramConnectButton.js.map +1 -1
  207. package/dist/esm/components/telegram-connect-button/TelegramConnectButton.js +2 -3
  208. package/dist/esm/components/telegram-connect-button/TelegramConnectButton.js.map +1 -1
  209. package/dist/esm/context/NovuUIContext.d.ts +8 -1
  210. package/dist/esm/context/NovuUIContext.js +2 -0
  211. package/dist/esm/context/NovuUIContext.js.map +1 -1
  212. package/dist/esm/context/OutletStore.d.ts +31 -0
  213. package/dist/esm/context/OutletStore.js +61 -0
  214. package/dist/esm/context/OutletStore.js.map +1 -0
  215. package/dist/esm/hooks/internal/useEngineAccessor.d.ts +4 -0
  216. package/dist/esm/hooks/internal/useEngineAccessor.js +11 -0
  217. package/dist/esm/hooks/internal/useEngineAccessor.js.map +1 -0
  218. package/dist/esm/hooks/internal/useEngineStores.d.ts +13 -0
  219. package/dist/esm/hooks/internal/useEngineStores.js +27 -0
  220. package/dist/esm/hooks/internal/useEngineStores.js.map +1 -0
  221. package/dist/esm/hooks/internal/useIsomorphicLayoutEffect.d.ts +5 -0
  222. package/dist/esm/hooks/internal/useIsomorphicLayoutEffect.js +7 -0
  223. package/dist/esm/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -0
  224. package/dist/esm/hooks/internal/useNotificationOutlets.d.ts +33 -0
  225. package/dist/esm/hooks/internal/useNotificationOutlets.js +32 -0
  226. package/dist/esm/hooks/internal/useNotificationOutlets.js.map +1 -0
  227. package/dist/esm/hooks/internal/useOutletRenderer.d.ts +14 -0
  228. package/dist/esm/hooks/internal/useOutletRenderer.js +25 -0
  229. package/dist/esm/hooks/internal/useOutletRenderer.js.map +1 -0
  230. package/dist/esm/index.d.ts +6 -0
  231. package/dist/esm/index.js +5 -3
  232. package/dist/esm/index.js.map +1 -1
  233. package/dist/esm/server/index.d.ts +15 -1
  234. package/dist/esm/server/index.js +14 -1
  235. package/dist/esm/server/index.js.map +1 -1
  236. package/dist/esm/utils/appearance.d.ts +2 -3
  237. package/dist/esm/utils/appearance.js +2 -2
  238. package/dist/esm/utils/appearance.js.map +1 -1
  239. package/package.json +10 -4
  240. package/dist/cjs/components/Renderer.cjs +0 -70
  241. package/dist/cjs/components/Renderer.cjs.map +0 -1
  242. package/dist/cjs/components/Renderer.d.cts +0 -8
  243. package/dist/cjs/context/RendererContext.cjs.map +0 -1
  244. package/dist/cjs/context/RendererContext.d.cts +0 -15
  245. package/dist/esm/components/Renderer.d.ts +0 -8
  246. package/dist/esm/components/Renderer.js +0 -44
  247. package/dist/esm/components/Renderer.js.map +0 -1
  248. package/dist/esm/context/RendererContext.d.ts +0 -15
  249. package/dist/esm/context/RendererContext.js +0 -13
  250. package/dist/esm/context/RendererContext.js.map +0 -1
@@ -1,6 +1,5 @@
1
1
  // src/components/subscription/SubscriptionButton.tsx
2
- import React from "react";
3
- import { useNovuUI } from "../../context/NovuUIContext.js";
2
+ import React, { useMemo } from "react";
4
3
  import { Mounter } from "../Mounter.js";
5
4
  import { jsx } from "react/jsx-runtime";
6
5
  var SubscriptionButton = React.memo(
@@ -14,29 +13,8 @@ var SubscriptionButton = React.memo(
14
13
  onCreateError,
15
14
  onCreateSuccess
16
15
  }) => {
17
- const { novuUI } = useNovuUI();
18
- const mount = React.useCallback(
19
- (element) => {
20
- if (!topicKey) {
21
- return;
22
- }
23
- return novuUI.mountComponent({
24
- name: "SubscriptionButton",
25
- element,
26
- props: {
27
- topicKey,
28
- identifier,
29
- preferences,
30
- onClick,
31
- onDeleteError,
32
- onDeleteSuccess,
33
- onCreateError,
34
- onCreateSuccess
35
- }
36
- });
37
- },
38
- [
39
- novuUI,
16
+ const mountProps = useMemo(
17
+ () => topicKey ? {
40
18
  topicKey,
41
19
  identifier,
42
20
  preferences,
@@ -45,11 +23,16 @@ var SubscriptionButton = React.memo(
45
23
  onDeleteSuccess,
46
24
  onCreateError,
47
25
  onCreateSuccess
48
- ]
26
+ } : void 0,
27
+ [topicKey, identifier, preferences, onClick, onDeleteError, onDeleteSuccess, onCreateError, onCreateSuccess]
49
28
  );
50
- return /* @__PURE__ */ jsx(Mounter, { mount });
29
+ if (!mountProps) {
30
+ return null;
31
+ }
32
+ return /* @__PURE__ */ jsx(Mounter, { name: "SubscriptionButton", props: mountProps });
51
33
  }
52
34
  );
35
+ SubscriptionButton.displayName = "SubscriptionButton";
53
36
  export {
54
37
  SubscriptionButton
55
38
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/subscription/SubscriptionButton.tsx"],"sourcesContent":["import type { SubscriptionButtonWrapperProps } from '@novu/js/ui';\nimport React from 'react';\nimport { useNovuUI } from '../../context/NovuUIContext';\nimport { Mounter } from '../Mounter';\n\nexport type SubscriptionButtonProps = Partial<SubscriptionButtonWrapperProps>;\n\nexport const SubscriptionButton = React.memo(\n ({\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n }: SubscriptionButtonProps) => {\n const { novuUI } = useNovuUI();\n\n const mount = React.useCallback(\n (element: HTMLElement) => {\n if (!topicKey) {\n return;\n }\n\n return novuUI.mountComponent({\n name: 'SubscriptionButton',\n element,\n props: {\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n },\n });\n },\n [\n novuUI,\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n ]\n );\n\n return <Mounter mount={mount} />;\n }\n);\n"],"mappings":";AACA,OAAO,WAAW;AAClB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAmDb;AA/CJ,IAAM,qBAAqB,MAAM;AAAA,EACtC,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAA+B;AAC7B,UAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,UAAM,QAAQ,MAAM;AAAA,MAClB,CAAC,YAAyB;AACxB,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AAEA,eAAO,OAAO,eAAe;AAAA,UAC3B,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,oBAAC,WAAQ,OAAc;AAAA,EAChC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/subscription/SubscriptionButton.tsx"],"sourcesContent":["import type { SubscriptionButtonWrapperProps } from '@novu/js/ui';\nimport React, { useMemo } from 'react';\nimport { Mounter } from '../Mounter';\n\nexport type SubscriptionButtonProps = Partial<SubscriptionButtonWrapperProps>;\n\nexport const SubscriptionButton = React.memo(\n ({\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n }: SubscriptionButtonProps) => {\n const mountProps = useMemo(\n () =>\n topicKey\n ? {\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n }\n : undefined,\n [topicKey, identifier, preferences, onClick, onDeleteError, onDeleteSuccess, onCreateError, onCreateSuccess]\n );\n\n if (!mountProps) {\n return null;\n }\n\n return <Mounter name=\"SubscriptionButton\" props={mountProps} />;\n }\n);\n\nSubscriptionButton.displayName = 'SubscriptionButton';\n"],"mappings":";AACA,OAAO,SAAS,eAAe;AAC/B,SAAS,eAAe;AAoCb;AAhCJ,IAAM,qBAAqB,MAAM;AAAA,EACtC,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAA+B;AAC7B,UAAM,aAAa;AAAA,MACjB,MACE,WACI;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IACA;AAAA,MACN,CAAC,UAAU,YAAY,aAAa,SAAS,eAAe,iBAAiB,eAAe,eAAe;AAAA,IAC7G;AAEA,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,WAAO,oBAAC,WAAQ,MAAK,sBAAqB,OAAO,YAAY;AAAA,EAC/D;AACF;AAEA,mBAAmB,cAAc;","names":[]}
@@ -3,6 +3,6 @@ import { SubscriptionPreferencesWrapperProps } from '@novu/js/ui';
3
3
  import React__default from 'react';
4
4
 
5
5
  type SubscriptionPreferencesProps = Partial<SubscriptionPreferencesWrapperProps>;
6
- declare const SubscriptionPreferences: React__default.MemoExoticComponent<({ topicKey, identifier, preferences, onClick, onDeleteError, onDeleteSuccess, onCreateError, onCreateSuccess, }: SubscriptionPreferencesProps) => react_jsx_runtime.JSX.Element>;
6
+ declare const SubscriptionPreferences: React__default.MemoExoticComponent<({ topicKey, identifier, preferences, onClick, onDeleteError, onDeleteSuccess, onCreateError, onCreateSuccess, }: SubscriptionPreferencesProps) => react_jsx_runtime.JSX.Element | null>;
7
7
 
8
8
  export { SubscriptionPreferences, type SubscriptionPreferencesProps };
@@ -1,6 +1,5 @@
1
1
  // src/components/subscription/SubscriptionPreferences.tsx
2
- import React from "react";
3
- import { useNovuUI } from "../../context/NovuUIContext.js";
2
+ import React, { useMemo } from "react";
4
3
  import { Mounter } from "../Mounter.js";
5
4
  import { jsx } from "react/jsx-runtime";
6
5
  var SubscriptionPreferences = React.memo(
@@ -14,29 +13,8 @@ var SubscriptionPreferences = React.memo(
14
13
  onCreateError,
15
14
  onCreateSuccess
16
15
  }) => {
17
- const { novuUI } = useNovuUI();
18
- const mount = React.useCallback(
19
- (element) => {
20
- if (!topicKey) {
21
- return;
22
- }
23
- return novuUI.mountComponent({
24
- name: "SubscriptionPreferences",
25
- element,
26
- props: {
27
- topicKey,
28
- identifier,
29
- preferences,
30
- onClick,
31
- onDeleteError,
32
- onDeleteSuccess,
33
- onCreateError,
34
- onCreateSuccess
35
- }
36
- });
37
- },
38
- [
39
- novuUI,
16
+ const mountProps = useMemo(
17
+ () => topicKey ? {
40
18
  topicKey,
41
19
  identifier,
42
20
  preferences,
@@ -45,11 +23,16 @@ var SubscriptionPreferences = React.memo(
45
23
  onDeleteSuccess,
46
24
  onCreateError,
47
25
  onCreateSuccess
48
- ]
26
+ } : void 0,
27
+ [topicKey, identifier, preferences, onClick, onDeleteError, onDeleteSuccess, onCreateError, onCreateSuccess]
49
28
  );
50
- return /* @__PURE__ */ jsx(Mounter, { mount });
29
+ if (!mountProps) {
30
+ return null;
31
+ }
32
+ return /* @__PURE__ */ jsx(Mounter, { name: "SubscriptionPreferences", props: mountProps });
51
33
  }
52
34
  );
35
+ SubscriptionPreferences.displayName = "SubscriptionPreferences";
53
36
  export {
54
37
  SubscriptionPreferences
55
38
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/subscription/SubscriptionPreferences.tsx"],"sourcesContent":["import type { SubscriptionPreferencesWrapperProps } from '@novu/js/ui';\nimport React from 'react';\nimport { useNovuUI } from '../../context/NovuUIContext';\nimport { Mounter } from '../Mounter';\n\nexport type SubscriptionPreferencesProps = Partial<SubscriptionPreferencesWrapperProps>;\n\nexport const SubscriptionPreferences = React.memo(\n ({\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n }: SubscriptionPreferencesProps) => {\n const { novuUI } = useNovuUI();\n\n const mount = React.useCallback(\n (element: HTMLElement) => {\n if (!topicKey) {\n return;\n }\n\n return novuUI.mountComponent({\n name: 'SubscriptionPreferences',\n element,\n props: {\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n },\n });\n },\n [\n novuUI,\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n ]\n );\n\n return <Mounter mount={mount} />;\n }\n);\n"],"mappings":";AACA,OAAO,WAAW;AAClB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAmDb;AA/CJ,IAAM,0BAA0B,MAAM;AAAA,EAC3C,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAAoC;AAClC,UAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,UAAM,QAAQ,MAAM;AAAA,MAClB,CAAC,YAAyB;AACxB,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AAEA,eAAO,OAAO,eAAe;AAAA,UAC3B,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,oBAAC,WAAQ,OAAc;AAAA,EAChC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/subscription/SubscriptionPreferences.tsx"],"sourcesContent":["import type { SubscriptionPreferencesWrapperProps } from '@novu/js/ui';\nimport React, { useMemo } from 'react';\nimport { Mounter } from '../Mounter';\n\nexport type SubscriptionPreferencesProps = Partial<SubscriptionPreferencesWrapperProps>;\n\nexport const SubscriptionPreferences = React.memo(\n ({\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n }: SubscriptionPreferencesProps) => {\n const mountProps = useMemo(\n () =>\n topicKey\n ? {\n topicKey,\n identifier,\n preferences,\n onClick,\n onDeleteError,\n onDeleteSuccess,\n onCreateError,\n onCreateSuccess,\n }\n : undefined,\n [topicKey, identifier, preferences, onClick, onDeleteError, onDeleteSuccess, onCreateError, onCreateSuccess]\n );\n\n if (!mountProps) {\n return null;\n }\n\n return <Mounter name=\"SubscriptionPreferences\" props={mountProps} />;\n }\n);\n\nSubscriptionPreferences.displayName = 'SubscriptionPreferences';\n"],"mappings":";AACA,OAAO,SAAS,eAAe;AAC/B,SAAS,eAAe;AAoCb;AAhCJ,IAAM,0BAA0B,MAAM;AAAA,EAC3C,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAAoC;AAClC,UAAM,aAAa;AAAA,MACjB,MACE,WACI;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IACA;AAAA,MACN,CAAC,UAAU,YAAY,aAAa,SAAS,eAAe,iBAAiB,eAAe,eAAe;AAAA,IAC7G;AAEA,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,WAAO,oBAAC,WAAQ,MAAK,2BAA0B,OAAO,YAAY;AAAA,EACpE;AACF;AAEA,wBAAwB,cAAc;","names":[]}
@@ -1,6 +1,5 @@
1
1
  // src/components/telegram-connect-button/DefaultTelegramConnectButton.tsx
2
- import { useCallback } from "react";
3
- import { useNovuUI } from "../../context/NovuUIContext.js";
2
+ import { useMemo } from "react";
4
3
  import { Mounter } from "../Mounter.js";
5
4
  import { jsx } from "react/jsx-runtime";
6
5
  var DefaultTelegramConnectButton = (props) => {
@@ -16,28 +15,20 @@ var DefaultTelegramConnectButton = (props) => {
16
15
  connectLabel,
17
16
  connectedLabel
18
17
  } = props;
19
- const { novuUI } = useNovuUI();
20
- const mount = useCallback(
21
- (element) => {
22
- return novuUI.mountComponent({
23
- name: "TelegramConnectButton",
24
- props: {
25
- integrationIdentifier,
26
- subscriberId,
27
- context,
28
- contextHash,
29
- onConnectSuccess,
30
- onConnectError,
31
- onDisconnectSuccess,
32
- onDisconnectError,
33
- connectLabel,
34
- connectedLabel
35
- },
36
- element
37
- });
38
- },
18
+ const mountProps = useMemo(
19
+ () => ({
20
+ integrationIdentifier,
21
+ subscriberId,
22
+ context,
23
+ contextHash,
24
+ onConnectSuccess,
25
+ onConnectError,
26
+ onDisconnectSuccess,
27
+ onDisconnectError,
28
+ connectLabel,
29
+ connectedLabel
30
+ }),
39
31
  [
40
- novuUI,
41
32
  integrationIdentifier,
42
33
  subscriberId,
43
34
  context,
@@ -50,7 +41,7 @@ var DefaultTelegramConnectButton = (props) => {
50
41
  connectedLabel
51
42
  ]
52
43
  );
53
- return /* @__PURE__ */ jsx(Mounter, { mount });
44
+ return /* @__PURE__ */ jsx(Mounter, { name: "TelegramConnectButton", props: mountProps });
54
45
  };
55
46
  export {
56
47
  DefaultTelegramConnectButton
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/telegram-connect-button/DefaultTelegramConnectButton.tsx"],"sourcesContent":["import { TelegramConnectButtonProps } from '@novu/js/ui';\nimport { useCallback } from 'react';\nimport { useNovuUI } from '../../context/NovuUIContext';\nimport { Mounter } from '../Mounter';\n\nexport type DefaultTelegramConnectButtonProps = Pick<\n TelegramConnectButtonProps,\n | 'integrationIdentifier'\n | 'subscriberId'\n | 'context'\n | 'contextHash'\n | 'onConnectSuccess'\n | 'onConnectError'\n | 'onDisconnectSuccess'\n | 'onDisconnectError'\n | 'connectLabel'\n | 'connectedLabel'\n>;\n\nexport const DefaultTelegramConnectButton = (props: DefaultTelegramConnectButtonProps) => {\n const {\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n } = props;\n const { novuUI } = useNovuUI();\n\n const mount = useCallback(\n (element: HTMLElement) => {\n return novuUI.mountComponent({\n name: 'TelegramConnectButton',\n props: {\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n },\n element,\n });\n },\n [\n novuUI,\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n ]\n );\n\n return <Mounter mount={mount} />;\n};\n"],"mappings":";AACA,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAiEf;AAjDF,IAAM,+BAA+B,CAAC,UAA6C;AACxF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,QAAM,QAAQ;AAAA,IACZ,CAAC,YAAyB;AACxB,aAAO,OAAO,eAAe;AAAA,QAC3B,MAAM;AAAA,QACN,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,oBAAC,WAAQ,OAAc;AAChC;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/telegram-connect-button/DefaultTelegramConnectButton.tsx"],"sourcesContent":["import { TelegramConnectButtonProps } from '@novu/js/ui';\nimport { useMemo } from 'react';\nimport { Mounter } from '../Mounter';\n\nexport type DefaultTelegramConnectButtonProps = Pick<\n TelegramConnectButtonProps,\n | 'integrationIdentifier'\n | 'subscriberId'\n | 'context'\n | 'contextHash'\n | 'onConnectSuccess'\n | 'onConnectError'\n | 'onDisconnectSuccess'\n | 'onDisconnectError'\n | 'connectLabel'\n | 'connectedLabel'\n>;\n\nexport const DefaultTelegramConnectButton = (props: DefaultTelegramConnectButtonProps) => {\n const {\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n } = props;\n\n const mountProps = useMemo(\n () => ({\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n }),\n [\n integrationIdentifier,\n subscriberId,\n context,\n contextHash,\n onConnectSuccess,\n onConnectError,\n onDisconnectSuccess,\n onDisconnectError,\n connectLabel,\n connectedLabel,\n ]\n );\n\n return <Mounter name=\"TelegramConnectButton\" props={mountProps} />;\n};\n"],"mappings":";AACA,SAAS,eAAe;AACxB,SAAS,eAAe;AAyDf;AAzCF,IAAM,+BAA+B,CAAC,UAA6C;AACxF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,aAAa;AAAA,IACjB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,oBAAC,WAAQ,MAAK,yBAAwB,OAAO,YAAY;AAClE;","names":[]}
@@ -2,10 +2,9 @@
2
2
  import React, { useMemo } from "react";
3
3
  import { useNovu } from "../../hooks/NovuProvider.js";
4
4
  import { NovuUI } from "../NovuUI.js";
5
- import { withRenderer } from "../Renderer.js";
6
5
  import { DefaultTelegramConnectButton } from "./DefaultTelegramConnectButton.js";
7
6
  import { jsx } from "react/jsx-runtime";
8
- var TelegramConnectButtonInternal = withRenderer((props) => {
7
+ var TelegramConnectButtonInternal = (props) => {
9
8
  const { container, appearance, ...defaultProps } = props;
10
9
  const novu = useNovu();
11
10
  const options = useMemo(() => {
@@ -16,7 +15,7 @@ var TelegramConnectButtonInternal = withRenderer((props) => {
16
15
  };
17
16
  }, [container, appearance, novu.options]);
18
17
  return /* @__PURE__ */ jsx(NovuUI, { options, novu, children: /* @__PURE__ */ jsx(DefaultTelegramConnectButton, { ...defaultProps }) });
19
- });
18
+ };
20
19
  TelegramConnectButtonInternal.displayName = "TelegramConnectButtonInternal";
21
20
  var TelegramConnectButton = React.memo((props) => {
22
21
  return /* @__PURE__ */ jsx(TelegramConnectButtonInternal, { ...props });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/telegram-connect-button/TelegramConnectButton.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { useNovu } from '../../hooks/NovuProvider';\nimport { NovuUI, NovuUIOptions } from '../NovuUI';\nimport { withRenderer } from '../Renderer';\nimport { DefaultTelegramConnectButton, DefaultTelegramConnectButtonProps } from './DefaultTelegramConnectButton';\n\nexport type TelegramConnectButtonProps = DefaultTelegramConnectButtonProps &\n Pick<NovuUIOptions, 'container' | 'appearance'>;\n\nconst TelegramConnectButtonInternal = withRenderer<TelegramConnectButtonProps>((props) => {\n const { container, appearance, ...defaultProps } = props;\n const novu = useNovu();\n\n const options: NovuUIOptions = useMemo(() => {\n return {\n container,\n appearance,\n options: novu.options,\n };\n }, [container, appearance, novu.options]);\n\n return (\n <NovuUI options={options} novu={novu}>\n <DefaultTelegramConnectButton {...defaultProps} />\n </NovuUI>\n );\n});\n\nTelegramConnectButtonInternal.displayName = 'TelegramConnectButtonInternal';\n\nexport const TelegramConnectButton = React.memo((props: TelegramConnectButtonProps) => {\n return <TelegramConnectButtonInternal {...props} />;\n});\n\nTelegramConnectButton.displayName = 'TelegramConnectButton';\n"],"mappings":";AAAA,OAAO,SAAS,eAAe;AAC/B,SAAS,eAAe;AACxB,SAAS,cAA6B;AACtC,SAAS,oBAAoB;AAC7B,SAAS,oCAAuE;AAmB1E;AAdN,IAAM,gCAAgC,aAAyC,CAAC,UAAU;AACxF,QAAM,EAAE,WAAW,YAAY,GAAG,aAAa,IAAI;AACnD,QAAM,OAAO,QAAQ;AAErB,QAAM,UAAyB,QAAQ,MAAM;AAC3C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,KAAK,OAAO,CAAC;AAExC,SACE,oBAAC,UAAO,SAAkB,MACxB,8BAAC,gCAA8B,GAAG,cAAc,GAClD;AAEJ,CAAC;AAED,8BAA8B,cAAc;AAErC,IAAM,wBAAwB,MAAM,KAAK,CAAC,UAAsC;AACrF,SAAO,oBAAC,iCAA+B,GAAG,OAAO;AACnD,CAAC;AAED,sBAAsB,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/telegram-connect-button/TelegramConnectButton.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { useNovu } from '../../hooks/NovuProvider';\nimport { NovuUI, NovuUIOptions } from '../NovuUI';\nimport { DefaultTelegramConnectButton, DefaultTelegramConnectButtonProps } from './DefaultTelegramConnectButton';\n\nexport type TelegramConnectButtonProps = DefaultTelegramConnectButtonProps &\n Pick<NovuUIOptions, 'container' | 'appearance'>;\n\nconst TelegramConnectButtonInternal = (props: TelegramConnectButtonProps) => {\n const { container, appearance, ...defaultProps } = props;\n const novu = useNovu();\n\n const options: NovuUIOptions = useMemo(() => {\n return {\n container,\n appearance,\n options: novu.options,\n };\n }, [container, appearance, novu.options]);\n\n return (\n <NovuUI options={options} novu={novu}>\n <DefaultTelegramConnectButton {...defaultProps} />\n </NovuUI>\n );\n};\n\nTelegramConnectButtonInternal.displayName = 'TelegramConnectButtonInternal';\n\nexport const TelegramConnectButton = React.memo((props: TelegramConnectButtonProps) => {\n return <TelegramConnectButtonInternal {...props} />;\n});\n\nTelegramConnectButton.displayName = 'TelegramConnectButton';\n"],"mappings":";AAAA,OAAO,SAAS,eAAe;AAC/B,SAAS,eAAe;AACxB,SAAS,cAA6B;AACtC,SAAS,oCAAuE;AAmB1E;AAdN,IAAM,gCAAgC,CAAC,UAAsC;AAC3E,QAAM,EAAE,WAAW,YAAY,GAAG,aAAa,IAAI;AACnD,QAAM,OAAO,QAAQ;AAErB,QAAM,UAAyB,QAAQ,MAAM;AAC3C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,KAAK,OAAO,CAAC;AAExC,SACE,oBAAC,UAAO,SAAkB,MACxB,8BAAC,gCAA8B,GAAG,cAAc,GAClD;AAEJ;AAEA,8BAA8B,cAAc;AAErC,IAAM,wBAAwB,MAAM,KAAK,CAAC,UAAsC;AACrF,SAAO,oBAAC,iCAA+B,GAAG,OAAO;AACnD,CAAC;AAED,sBAAsB,cAAc;","names":[]}
@@ -1,14 +1,21 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { NovuUI } from '@novu/js/ui';
3
3
  import React__default from 'react';
4
+ import { ReactAllIconOverrides } from '../utils/types.js';
5
+ import { OutletStore } from './OutletStore.js';
6
+ import '@novu/js';
4
7
 
5
8
  type NovuUIContextValue = {
6
9
  novuUI: NovuUI;
10
+ outlets: OutletStore;
11
+ /** The host's own icon overrides, so host-native blocks render them without a trip through the bridge. */
12
+ icons: ReactAllIconOverrides;
7
13
  };
8
14
  declare const useNovuUIContext: () => NovuUIContextValue;
9
15
  declare const useUnsafeNovuUIContext: () => NovuUIContextValue | Partial<NovuUIContextValue>;
10
16
  declare const NovuUIProvider: (props: React__default.PropsWithChildren<{
11
17
  value: NovuUIContextValue;
12
18
  }>) => react_jsx_runtime.JSX.Element;
19
+ declare const useOutlets: () => OutletStore;
13
20
 
14
- export { NovuUIProvider, useNovuUIContext as useNovuUI, useUnsafeNovuUIContext as useUnsafeNovuUI };
21
+ export { NovuUIProvider, useNovuUIContext as useNovuUI, useOutlets, useUnsafeNovuUIContext as useUnsafeNovuUI };
@@ -5,9 +5,11 @@ var [NovuUIContext, useNovuUIContext, useUnsafeNovuUIContext] = createContextAnd
5
5
  var NovuUIProvider = (props) => {
6
6
  return /* @__PURE__ */ jsx(NovuUIContext.Provider, { value: { value: props.value }, children: props.children });
7
7
  };
8
+ var useOutlets = () => useNovuUIContext().outlets;
8
9
  export {
9
10
  NovuUIProvider,
10
11
  useNovuUIContext as useNovuUI,
12
+ useOutlets,
11
13
  useUnsafeNovuUIContext as useUnsafeNovuUI
12
14
  };
13
15
  //# sourceMappingURL=NovuUIContext.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/NovuUIContext.tsx"],"sourcesContent":["import type { NovuUI } from '@novu/js/ui';\nimport React from 'react';\nimport { createContextAndHook } from '../utils/createContextAndHook';\n\ntype NovuUIContextValue = {\n novuUI: NovuUI;\n};\n\nconst [NovuUIContext, useNovuUIContext, useUnsafeNovuUIContext] =\n createContextAndHook<NovuUIContextValue>('NovuUIContext');\n\nconst NovuUIProvider = (props: React.PropsWithChildren<{ value: NovuUIContextValue }>) => {\n return <NovuUIContext.Provider value={{ value: props.value }}>{props.children}</NovuUIContext.Provider>;\n};\n\nexport { useNovuUIContext as useNovuUI, useUnsafeNovuUIContext as useUnsafeNovuUI, NovuUIProvider };\n"],"mappings":";AAEA,SAAS,4BAA4B;AAU5B;AAJT,IAAM,CAAC,eAAe,kBAAkB,sBAAsB,IAC5D,qBAAyC,eAAe;AAE1D,IAAM,iBAAiB,CAAC,UAAkE;AACxF,SAAO,oBAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,OAAO,MAAM,MAAM,GAAI,gBAAM,UAAS;AAChF;","names":[]}
1
+ {"version":3,"sources":["../../../src/context/NovuUIContext.tsx"],"sourcesContent":["import type { NovuUI } from '@novu/js/ui';\nimport React from 'react';\nimport { createContextAndHook } from '../utils/createContextAndHook';\nimport type { ReactAllIconOverrides } from '../utils/types';\nimport type { OutletStore } from './OutletStore';\n\ntype NovuUIContextValue = {\n novuUI: NovuUI;\n outlets: OutletStore;\n /** The host's own icon overrides, so host-native blocks render them without a trip through the bridge. */\n icons: ReactAllIconOverrides;\n};\n\nconst [NovuUIContext, useNovuUIContext, useUnsafeNovuUIContext] =\n createContextAndHook<NovuUIContextValue>('NovuUIContext');\n\nconst NovuUIProvider = (props: React.PropsWithChildren<{ value: NovuUIContextValue }>) => {\n return <NovuUIContext.Provider value={{ value: props.value }}>{props.children}</NovuUIContext.Provider>;\n};\n\nconst useOutlets = () => useNovuUIContext().outlets;\n\nexport { useNovuUIContext as useNovuUI, useUnsafeNovuUIContext as useUnsafeNovuUI, NovuUIProvider, useOutlets };\n"],"mappings":";AAEA,SAAS,4BAA4B;AAe5B;AAJT,IAAM,CAAC,eAAe,kBAAkB,sBAAsB,IAC5D,qBAAyC,eAAe;AAE1D,IAAM,iBAAiB,CAAC,UAAkE;AACxF,SAAO,oBAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,OAAO,MAAM,MAAM,GAAI,gBAAM,UAAS;AAChF;AAEA,IAAM,aAAa,MAAM,iBAAiB,EAAE;","names":[]}
@@ -0,0 +1,31 @@
1
+ import { OutletHandle } from '@novu/js/ui';
2
+ import { ReactNode } from 'react';
3
+
4
+ type OutletRender = (...args: unknown[]) => ReactNode;
5
+ type OutletEntry = {
6
+ id: string;
7
+ el: HTMLElement;
8
+ render: OutletRender;
9
+ args: unknown[];
10
+ };
11
+ type OutletSnapshot = {
12
+ entries: ReadonlyMap<string, OutletEntry>;
13
+ /** Bumped when a render prop changed identity, so outlets re-render with the latest one even if they rendered first. */
14
+ version: number;
15
+ };
16
+ /**
17
+ * The host side of the bridge for outlets: DOM nodes the engine hands to React so React can render into them.
18
+ *
19
+ * One store exists per engine instance. Every mutation replaces the map, so `useSyncExternalStore` sees a new
20
+ * snapshot only when something changed, and portals keyed by outlet id are reconciled in place.
21
+ */
22
+ declare class OutletStore {
23
+ #private;
24
+ subscribe: (listener: () => void) => () => void;
25
+ getSnapshot: () => OutletSnapshot;
26
+ /** Re-renders every outlet. Called when a host render prop changed identity. */
27
+ invalidate(): void;
28
+ mount<TArgs extends unknown[]>(el: HTMLElement, render: (...args: TArgs) => ReactNode, args: TArgs): OutletHandle<TArgs>;
29
+ }
30
+
31
+ export { type OutletEntry, type OutletRender, type OutletSnapshot, OutletStore };
@@ -0,0 +1,61 @@
1
+ // src/context/OutletStore.ts
2
+ var fallbackOutletCounter = 0;
3
+ var OutletStore = class {
4
+ constructor() {
5
+ this.#entries = /* @__PURE__ */ new Map();
6
+ this.#snapshot = { entries: this.#entries, version: 0 };
7
+ this.#listeners = /* @__PURE__ */ new Set();
8
+ this.subscribe = (listener) => {
9
+ this.#listeners.add(listener);
10
+ return () => {
11
+ this.#listeners.delete(listener);
12
+ };
13
+ };
14
+ this.getSnapshot = () => this.#snapshot;
15
+ }
16
+ #entries;
17
+ #snapshot;
18
+ #listeners;
19
+ /** Re-renders every outlet. Called when a host render prop changed identity. */
20
+ invalidate() {
21
+ this.#publish();
22
+ }
23
+ mount(el, render, args) {
24
+ const id = el.dataset.novuOutlet ?? `nv-host-outlet-${fallbackOutletCounter++}`;
25
+ this.#set({ id, el, render, args });
26
+ return {
27
+ update: (...nextArgs) => {
28
+ const current = this.#entries.get(id);
29
+ if (!current) {
30
+ return;
31
+ }
32
+ this.#set({ ...current, args: nextArgs });
33
+ },
34
+ unmount: () => {
35
+ if (!this.#entries.has(id)) {
36
+ return;
37
+ }
38
+ const next = new Map(this.#entries);
39
+ next.delete(id);
40
+ this.#entries = next;
41
+ this.#publish();
42
+ }
43
+ };
44
+ }
45
+ #set(entry) {
46
+ const next = new Map(this.#entries);
47
+ next.set(entry.id, entry);
48
+ this.#entries = next;
49
+ this.#publish();
50
+ }
51
+ #publish() {
52
+ this.#snapshot = { entries: this.#entries, version: this.#snapshot.version + 1 };
53
+ for (const listener of this.#listeners) {
54
+ listener();
55
+ }
56
+ }
57
+ };
58
+ export {
59
+ OutletStore
60
+ };
61
+ //# sourceMappingURL=OutletStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/context/OutletStore.ts"],"sourcesContent":["import type { OutletHandle } from '@novu/js/ui';\nimport type { ReactNode } from 'react';\n\nexport type OutletRender = (...args: unknown[]) => ReactNode;\n\nexport type OutletEntry = {\n id: string;\n el: HTMLElement;\n render: OutletRender;\n args: unknown[];\n};\n\nexport type OutletSnapshot = {\n entries: ReadonlyMap<string, OutletEntry>;\n /** Bumped when a render prop changed identity, so outlets re-render with the latest one even if they rendered first. */\n version: number;\n};\n\nlet fallbackOutletCounter = 0;\n\n/**\n * The host side of the bridge for outlets: DOM nodes the engine hands to React so React can render into them.\n *\n * One store exists per engine instance. Every mutation replaces the map, so `useSyncExternalStore` sees a new\n * snapshot only when something changed, and portals keyed by outlet id are reconciled in place.\n */\nexport class OutletStore {\n #entries: Map<string, OutletEntry> = new Map();\n #snapshot: OutletSnapshot = { entries: this.#entries, version: 0 };\n #listeners = new Set<() => void>();\n\n subscribe = (listener: () => void) => {\n this.#listeners.add(listener);\n\n return () => {\n this.#listeners.delete(listener);\n };\n };\n\n getSnapshot = (): OutletSnapshot => this.#snapshot;\n\n /** Re-renders every outlet. Called when a host render prop changed identity. */\n invalidate() {\n this.#publish();\n }\n\n mount<TArgs extends unknown[]>(\n el: HTMLElement,\n render: (...args: TArgs) => ReactNode,\n args: TArgs\n ): OutletHandle<TArgs> {\n // engine outlets carry an id that is unique per outlet instance; anything else gets one from the host\n const id = el.dataset.novuOutlet ?? `nv-host-outlet-${fallbackOutletCounter++}`;\n this.#set({ id, el, render: render as OutletRender, args });\n\n return {\n update: (...nextArgs: TArgs) => {\n const current = this.#entries.get(id);\n if (!current) {\n return;\n }\n\n this.#set({ ...current, args: nextArgs });\n },\n unmount: () => {\n if (!this.#entries.has(id)) {\n return;\n }\n\n const next = new Map(this.#entries);\n next.delete(id);\n this.#entries = next;\n this.#publish();\n },\n };\n }\n\n #set(entry: OutletEntry) {\n const next = new Map(this.#entries);\n next.set(entry.id, entry);\n this.#entries = next;\n this.#publish();\n }\n\n #publish() {\n this.#snapshot = { entries: this.#entries, version: this.#snapshot.version + 1 };\n for (const listener of this.#listeners) {\n listener();\n }\n }\n}\n"],"mappings":";AAkBA,IAAI,wBAAwB;AAQrB,IAAM,cAAN,MAAkB;AAAA,EAAlB;AACL,oBAAqC,oBAAI,IAAI;AAC7C,qBAA4B,EAAE,SAAS,KAAK,UAAU,SAAS,EAAE;AACjE,sBAAa,oBAAI,IAAgB;AAEjC,qBAAY,CAAC,aAAyB;AACpC,WAAK,WAAW,IAAI,QAAQ;AAE5B,aAAO,MAAM;AACX,aAAK,WAAW,OAAO,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,uBAAc,MAAsB,KAAK;AAAA;AAAA,EAZzC;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAaA,aAAa;AACX,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MACE,IACA,QACA,MACqB;AAErB,UAAM,KAAK,GAAG,QAAQ,cAAc,kBAAkB,uBAAuB;AAC7E,SAAK,KAAK,EAAE,IAAI,IAAI,QAAgC,KAAK,CAAC;AAE1D,WAAO;AAAA,MACL,QAAQ,IAAI,aAAoB;AAC9B,cAAM,UAAU,KAAK,SAAS,IAAI,EAAE;AACpC,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AAEA,aAAK,KAAK,EAAE,GAAG,SAAS,MAAM,SAAS,CAAC;AAAA,MAC1C;AAAA,MACA,SAAS,MAAM;AACb,YAAI,CAAC,KAAK,SAAS,IAAI,EAAE,GAAG;AAC1B;AAAA,QACF;AAEA,cAAM,OAAO,IAAI,IAAI,KAAK,QAAQ;AAClC,aAAK,OAAO,EAAE;AACd,aAAK,WAAW;AAChB,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,OAAoB;AACvB,UAAM,OAAO,IAAI,IAAI,KAAK,QAAQ;AAClC,SAAK,IAAI,MAAM,IAAI,KAAK;AACxB,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,SAAK,YAAY,EAAE,SAAS,KAAK,UAAU,SAAS,KAAK,UAAU,UAAU,EAAE;AAC/E,eAAW,YAAY,KAAK,YAAY;AACtC,eAAS;AAAA,IACX;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,4 @@
1
+ /** Reads a core store accessor and re-renders when it changes. Accessors return stable references until they change. */
2
+ declare function useEngineAccessor<T>(accessor: () => T): T;
3
+
4
+ export { useEngineAccessor };
@@ -0,0 +1,11 @@
1
+ // src/hooks/internal/useEngineAccessor.ts
2
+ import { subscribeAccessor } from "@novu/js/ui-core";
3
+ import { useCallback, useSyncExternalStore } from "react";
4
+ function useEngineAccessor(accessor) {
5
+ const subscribe = useCallback((onChange) => subscribeAccessor(accessor, onChange), [accessor]);
6
+ return useSyncExternalStore(subscribe, accessor, accessor);
7
+ }
8
+ export {
9
+ useEngineAccessor
10
+ };
11
+ //# sourceMappingURL=useEngineAccessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/hooks/internal/useEngineAccessor.ts"],"sourcesContent":["import { subscribeAccessor } from '@novu/js/ui-core';\nimport { useCallback, useSyncExternalStore } from 'react';\n\n/** Reads a core store accessor and re-renders when it changes. Accessors return stable references until they change. */\nexport function useEngineAccessor<T>(accessor: () => T): T {\n const subscribe = useCallback((onChange: () => void) => subscribeAccessor(accessor, onChange), [accessor]);\n\n return useSyncExternalStore(subscribe, accessor, accessor);\n}\n"],"mappings":";AAAA,SAAS,yBAAyB;AAClC,SAAS,aAAa,4BAA4B;AAG3C,SAAS,kBAAqB,UAAsB;AACzD,QAAM,YAAY,YAAY,CAAC,aAAyB,kBAAkB,UAAU,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAEzG,SAAO,qBAAqB,WAAW,UAAU,QAAQ;AAC3D;","names":[]}
@@ -0,0 +1,13 @@
1
+ import * as _novu_js_ui_core from '@novu/js/ui-core';
2
+ import { ResolveStyleArgs } from '@novu/js/ui-core';
3
+ import * as _novu_js_ui from '@novu/js/ui';
4
+
5
+ declare const useEngineStores: () => _novu_js_ui.EngineStores;
6
+ /** The React twin of the engine's `useStyle`: same appearance keys, same classes, same host overrides. */
7
+ declare const useStyle: () => (args: ResolveStyleArgs) => string;
8
+ declare const useLocalization: () => {
9
+ t: _novu_js_ui_core.TranslateFunction;
10
+ locale: string;
11
+ };
12
+
13
+ export { useEngineStores, useLocalization, useStyle };
@@ -0,0 +1,27 @@
1
+ // src/hooks/internal/useEngineStores.ts
2
+ import { resolveStyle } from "@novu/js/ui-core";
3
+ import { useCallback } from "react";
4
+ import { useNovuUI } from "../../context/NovuUIContext.js";
5
+ import { useEngineAccessor } from "./useEngineAccessor.js";
6
+ var useEngineStores = () => useNovuUI().novuUI.stores;
7
+ var useStyle = () => {
8
+ const { appearance } = useEngineStores();
9
+ const elements = useEngineAccessor(appearance.elements);
10
+ const appearanceKeyToCssInJsClass = useEngineAccessor(appearance.appearanceKeyToCssInJsClass);
11
+ return useCallback(
12
+ (args) => resolveStyle(args, { elements, appearanceKeyToCssInJsClass }),
13
+ [elements, appearanceKeyToCssInJsClass]
14
+ );
15
+ };
16
+ var useLocalization = () => {
17
+ const { localization } = useEngineStores();
18
+ useEngineAccessor(localization.dictionary);
19
+ const locale = useEngineAccessor(localization.locale);
20
+ return { t: localization.t, locale };
21
+ };
22
+ export {
23
+ useEngineStores,
24
+ useLocalization,
25
+ useStyle
26
+ };
27
+ //# sourceMappingURL=useEngineStores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/hooks/internal/useEngineStores.ts"],"sourcesContent":["import { type ResolveStyleArgs, resolveStyle } from '@novu/js/ui-core';\nimport { useCallback } from 'react';\nimport { useNovuUI } from '../../context/NovuUIContext';\nimport { useEngineAccessor } from './useEngineAccessor';\n\nexport const useEngineStores = () => useNovuUI().novuUI.stores;\n\n/** The React twin of the engine's `useStyle`: same appearance keys, same classes, same host overrides. */\nexport const useStyle = () => {\n const { appearance } = useEngineStores();\n const elements = useEngineAccessor(appearance.elements);\n const appearanceKeyToCssInJsClass = useEngineAccessor(appearance.appearanceKeyToCssInJsClass);\n\n return useCallback(\n (args: ResolveStyleArgs) => resolveStyle(args, { elements, appearanceKeyToCssInJsClass }),\n [elements, appearanceKeyToCssInJsClass]\n );\n};\n\nexport const useLocalization = () => {\n const { localization } = useEngineStores();\n // subscribe to the dictionary so any string change re-renders, even when the locale stays the same\n useEngineAccessor(localization.dictionary);\n const locale = useEngineAccessor(localization.locale);\n\n return { t: localization.t, locale };\n};\n"],"mappings":";AAAA,SAAgC,oBAAoB;AACpD,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAE3B,IAAM,kBAAkB,MAAM,UAAU,EAAE,OAAO;AAGjD,IAAM,WAAW,MAAM;AAC5B,QAAM,EAAE,WAAW,IAAI,gBAAgB;AACvC,QAAM,WAAW,kBAAkB,WAAW,QAAQ;AACtD,QAAM,8BAA8B,kBAAkB,WAAW,2BAA2B;AAE5F,SAAO;AAAA,IACL,CAAC,SAA2B,aAAa,MAAM,EAAE,UAAU,4BAA4B,CAAC;AAAA,IACxF,CAAC,UAAU,2BAA2B;AAAA,EACxC;AACF;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,aAAa,IAAI,gBAAgB;AAEzC,oBAAkB,aAAa,UAAU;AACzC,QAAM,SAAS,kBAAkB,aAAa,MAAM;AAEpD,SAAO,EAAE,GAAG,aAAa,GAAG,OAAO;AACrC;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { useLayoutEffect } from 'react';
2
+
3
+ declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
4
+
5
+ export { useIsomorphicLayoutEffect };
@@ -0,0 +1,7 @@
1
+ // src/hooks/internal/useIsomorphicLayoutEffect.ts
2
+ import { useEffect, useLayoutEffect } from "react";
3
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
4
+ export {
5
+ useIsomorphicLayoutEffect
6
+ };
7
+ //# sourceMappingURL=useIsomorphicLayoutEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/hooks/internal/useIsomorphicLayoutEffect.ts"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n"],"mappings":";AAAA,SAAS,WAAW,uBAAuB;AAEpC,IAAM,4BAA4B,OAAO,WAAW,cAAc,kBAAkB;","names":[]}
@@ -0,0 +1,33 @@
1
+ import { NotificationRenderer, AvatarRenderer, SubjectRenderer, BodyRenderer, DefaultActionsRenderer, CustomActionsRenderer, NotificationClickHandler, NotificationActionClickHandler } from '@novu/js/ui';
2
+ import { NotificationsRenderer, AvatarRenderer as AvatarRenderer$1, SubjectRenderer as SubjectRenderer$1, BodyRenderer as BodyRenderer$1, DefaultActionsRenderer as DefaultActionsRenderer$1, CustomActionsRenderer as CustomActionsRenderer$1 } from '../../utils/types.js';
3
+ import '@novu/js';
4
+ import 'react';
5
+
6
+ type NotificationRenderProps = {
7
+ onNotificationClick?: NotificationClickHandler;
8
+ onPrimaryActionClick?: NotificationActionClickHandler;
9
+ onSecondaryActionClick?: NotificationActionClickHandler;
10
+ renderNotification?: NotificationsRenderer;
11
+ renderAvatar?: AvatarRenderer$1;
12
+ renderSubject?: SubjectRenderer$1;
13
+ renderBody?: BodyRenderer$1;
14
+ renderDefaultActions?: DefaultActionsRenderer$1;
15
+ renderCustomActions?: CustomActionsRenderer$1;
16
+ };
17
+ type NotificationOutlets = {
18
+ renderNotification: NotificationRenderer;
19
+ } | {
20
+ renderAvatar?: AvatarRenderer;
21
+ renderSubject?: SubjectRenderer;
22
+ renderBody?: BodyRenderer;
23
+ renderDefaultActions?: DefaultActionsRenderer;
24
+ renderCustomActions?: CustomActionsRenderer;
25
+ };
26
+ /**
27
+ * Adapts the notification render props shared by `Inbox`, `Notifications` and `InboxContent` into engine outlets.
28
+ * `renderNotification` wins over the part renderers, exactly as the engine's prop types demand. Whatever it
29
+ * renders sees the component's click handlers, so a `NotificationItem` inside it inherits them.
30
+ */
31
+ declare function useNotificationOutlets(props: NotificationRenderProps): NotificationOutlets;
32
+
33
+ export { type NotificationOutlets, useNotificationOutlets };
@@ -0,0 +1,32 @@
1
+ // src/hooks/internal/useNotificationOutlets.tsx
2
+ import { useMemo } from "react";
3
+ import { NotificationHandlersProvider } from "../../components/notification-item/context.js";
4
+ import { useOutletRenderer } from "./useOutletRenderer.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ function useNotificationOutlets(props) {
7
+ const { onNotificationClick, onPrimaryActionClick, onSecondaryActionClick, renderNotification: renderItem } = props;
8
+ const handlers = useMemo(
9
+ () => ({ onNotificationClick, onPrimaryActionClick, onSecondaryActionClick }),
10
+ [onNotificationClick, onPrimaryActionClick, onSecondaryActionClick]
11
+ );
12
+ const renderNotificationWithHandlers = useMemo(
13
+ () => renderItem ? (notification) => /* @__PURE__ */ jsx(NotificationHandlersProvider, { value: handlers, children: renderItem(notification) }) : void 0,
14
+ [renderItem, handlers]
15
+ );
16
+ const renderNotification = useOutletRenderer(renderNotificationWithHandlers);
17
+ const renderAvatar = useOutletRenderer(props.renderAvatar);
18
+ const renderSubject = useOutletRenderer(props.renderSubject);
19
+ const renderBody = useOutletRenderer(props.renderBody);
20
+ const renderDefaultActions = useOutletRenderer(props.renderDefaultActions);
21
+ const renderCustomActions = useOutletRenderer(props.renderCustomActions);
22
+ return useMemo(() => {
23
+ if (renderNotification) {
24
+ return { renderNotification };
25
+ }
26
+ return { renderAvatar, renderSubject, renderBody, renderDefaultActions, renderCustomActions };
27
+ }, [renderNotification, renderAvatar, renderSubject, renderBody, renderDefaultActions, renderCustomActions]);
28
+ }
29
+ export {
30
+ useNotificationOutlets
31
+ };
32
+ //# sourceMappingURL=useNotificationOutlets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/hooks/internal/useNotificationOutlets.tsx"],"sourcesContent":["import type {\n AvatarRenderer as JsAvatarRenderer,\n BodyRenderer as JsBodyRenderer,\n CustomActionsRenderer as JsCustomActionsRenderer,\n DefaultActionsRenderer as JsDefaultActionsRenderer,\n NotificationRenderer as JsNotificationRenderer,\n SubjectRenderer as JsSubjectRenderer,\n NotificationActionClickHandler,\n NotificationClickHandler,\n} from '@novu/js/ui';\nimport React, { useMemo } from 'react';\nimport { NotificationHandlersProvider } from '../../components/notification-item/context';\nimport type {\n AvatarRenderer,\n BodyRenderer,\n CustomActionsRenderer,\n DefaultActionsRenderer,\n NotificationsRenderer,\n SubjectRenderer,\n} from '../../utils/types';\nimport { useOutletRenderer } from './useOutletRenderer';\n\ntype NotificationRenderProps = {\n onNotificationClick?: NotificationClickHandler;\n onPrimaryActionClick?: NotificationActionClickHandler;\n onSecondaryActionClick?: NotificationActionClickHandler;\n renderNotification?: NotificationsRenderer;\n renderAvatar?: AvatarRenderer;\n renderSubject?: SubjectRenderer;\n renderBody?: BodyRenderer;\n renderDefaultActions?: DefaultActionsRenderer;\n renderCustomActions?: CustomActionsRenderer;\n};\n\nexport type NotificationOutlets =\n | { renderNotification: JsNotificationRenderer }\n | {\n renderAvatar?: JsAvatarRenderer;\n renderSubject?: JsSubjectRenderer;\n renderBody?: JsBodyRenderer;\n renderDefaultActions?: JsDefaultActionsRenderer;\n renderCustomActions?: JsCustomActionsRenderer;\n };\n\n/**\n * Adapts the notification render props shared by `Inbox`, `Notifications` and `InboxContent` into engine outlets.\n * `renderNotification` wins over the part renderers, exactly as the engine's prop types demand. Whatever it\n * renders sees the component's click handlers, so a `NotificationItem` inside it inherits them.\n */\nexport function useNotificationOutlets(props: NotificationRenderProps): NotificationOutlets {\n const { onNotificationClick, onPrimaryActionClick, onSecondaryActionClick, renderNotification: renderItem } = props;\n const handlers = useMemo(\n () => ({ onNotificationClick, onPrimaryActionClick, onSecondaryActionClick }),\n [onNotificationClick, onPrimaryActionClick, onSecondaryActionClick]\n );\n const renderNotificationWithHandlers = useMemo<NotificationsRenderer | undefined>(\n () =>\n renderItem\n ? (notification) => (\n <NotificationHandlersProvider value={handlers}>{renderItem(notification)}</NotificationHandlersProvider>\n )\n : undefined,\n [renderItem, handlers]\n );\n const renderNotification = useOutletRenderer(renderNotificationWithHandlers);\n const renderAvatar = useOutletRenderer(props.renderAvatar);\n const renderSubject = useOutletRenderer(props.renderSubject);\n const renderBody = useOutletRenderer(props.renderBody);\n const renderDefaultActions = useOutletRenderer(props.renderDefaultActions);\n const renderCustomActions = useOutletRenderer(props.renderCustomActions);\n\n return useMemo<NotificationOutlets>(() => {\n if (renderNotification) {\n return { renderNotification };\n }\n\n return { renderAvatar, renderSubject, renderBody, renderDefaultActions, renderCustomActions };\n }, [renderNotification, renderAvatar, renderSubject, renderBody, renderDefaultActions, renderCustomActions]);\n}\n"],"mappings":";AAUA,SAAgB,eAAe;AAC/B,SAAS,oCAAoC;AAS7C,SAAS,yBAAyB;AAuCtB;AAVL,SAAS,uBAAuB,OAAqD;AAC1F,QAAM,EAAE,qBAAqB,sBAAsB,wBAAwB,oBAAoB,WAAW,IAAI;AAC9G,QAAM,WAAW;AAAA,IACf,OAAO,EAAE,qBAAqB,sBAAsB,uBAAuB;AAAA,IAC3E,CAAC,qBAAqB,sBAAsB,sBAAsB;AAAA,EACpE;AACA,QAAM,iCAAiC;AAAA,IACrC,MACE,aACI,CAAC,iBACC,oBAAC,gCAA6B,OAAO,UAAW,qBAAW,YAAY,GAAE,IAE3E;AAAA,IACN,CAAC,YAAY,QAAQ;AAAA,EACvB;AACA,QAAM,qBAAqB,kBAAkB,8BAA8B;AAC3E,QAAM,eAAe,kBAAkB,MAAM,YAAY;AACzD,QAAM,gBAAgB,kBAAkB,MAAM,aAAa;AAC3D,QAAM,aAAa,kBAAkB,MAAM,UAAU;AACrD,QAAM,uBAAuB,kBAAkB,MAAM,oBAAoB;AACzE,QAAM,sBAAsB,kBAAkB,MAAM,mBAAmB;AAEvE,SAAO,QAA6B,MAAM;AACxC,QAAI,oBAAoB;AACtB,aAAO,EAAE,mBAAmB;AAAA,IAC9B;AAEA,WAAO,EAAE,cAAc,eAAe,YAAY,sBAAsB,oBAAoB;AAAA,EAC9F,GAAG,CAAC,oBAAoB,cAAc,eAAe,YAAY,sBAAsB,mBAAmB,CAAC;AAC7G;","names":[]}
@@ -0,0 +1,14 @@
1
+ import { OutletHandle } from '@novu/js/ui';
2
+ import { ReactNode } from 'react';
3
+
4
+ type OutletRenderer<TArgs extends unknown[]> = (el: HTMLDivElement, ...args: TArgs) => OutletHandle<TArgs>;
5
+ /**
6
+ * Turns a React render prop into the renderer the engine expects.
7
+ *
8
+ * The engine only ever sees one function per outlet kind, so a new inline arrow on the host side never remounts
9
+ * anything: the latest render prop is kept in a ref and called during the outlet's own render. A change of the
10
+ * render prop invalidates the outlet store after commit, so outlets that rendered earlier in the same pass catch up.
11
+ */
12
+ declare function useOutletRenderer<TArgs extends unknown[]>(renderProp: ((...args: TArgs) => ReactNode) | undefined): OutletRenderer<TArgs> | undefined;
13
+
14
+ export { type OutletRenderer, useOutletRenderer };
@@ -0,0 +1,25 @@
1
+ // src/hooks/internal/useOutletRenderer.ts
2
+ import { useMemo } from "react";
3
+ import { useOutlets } from "../../context/NovuUIContext.js";
4
+ import { useDataRef } from "./useDataRef.js";
5
+ import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect.js";
6
+ function useOutletRenderer(renderProp) {
7
+ const outlets = useOutlets();
8
+ const latest = useDataRef(renderProp);
9
+ const hasRenderer = !!renderProp;
10
+ useIsomorphicLayoutEffect(() => {
11
+ if (hasRenderer) {
12
+ outlets.invalidate();
13
+ }
14
+ }, [outlets, hasRenderer, renderProp]);
15
+ return useMemo(() => {
16
+ if (!hasRenderer) {
17
+ return void 0;
18
+ }
19
+ return (el, ...args) => outlets.mount(el, (...renderArgs) => latest.current?.(...renderArgs), args);
20
+ }, [latest, outlets, hasRenderer]);
21
+ }
22
+ export {
23
+ useOutletRenderer
24
+ };
25
+ //# sourceMappingURL=useOutletRenderer.js.map