@ethora/chat-component-rn 26.8.5 → 26.8.6

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 (373) hide show
  1. package/README.md +55 -0
  2. package/lib/commonjs/assets/emojiData.js +40 -0
  3. package/lib/commonjs/assets/emojiData.js.map +1 -0
  4. package/lib/commonjs/assets/icons.js +1 -1
  5. package/lib/commonjs/assets/icons.js.map +1 -1
  6. package/lib/commonjs/components/MainComponents/ChatHeader.js +7 -9
  7. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  8. package/lib/commonjs/components/MainComponents/ChatRoom.js +24 -23
  9. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  10. package/lib/commonjs/components/MainComponents/ChatWrapper.js +22 -16
  11. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  12. package/lib/commonjs/components/MainComponents/MessageContainer.js +4 -12
  13. package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
  14. package/lib/commonjs/components/MainComponents/MessageList.js +110 -35
  15. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  16. package/lib/commonjs/components/MainComponents/RoomList.js +32 -29
  17. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  18. package/lib/commonjs/components/MainComponents/RoomStack.js +133 -65
  19. package/lib/commonjs/components/MainComponents/RoomStack.js.map +1 -1
  20. package/lib/commonjs/components/MainComponents/SystemMessage.js +6 -2
  21. package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
  22. package/lib/commonjs/components/MessageBubble/Avatar.js +5 -1
  23. package/lib/commonjs/components/MessageBubble/Avatar.js.map +1 -1
  24. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +17 -21
  25. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  26. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js +447 -0
  27. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  28. package/lib/commonjs/components/MessageBubble/Message.js +200 -132
  29. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  30. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +213 -12
  31. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  32. package/lib/commonjs/components/MessageBubble/MessageReaction.js +113 -94
  33. package/lib/commonjs/components/MessageBubble/MessageReaction.js.map +1 -1
  34. package/lib/commonjs/components/MessageBubble/MessageReply.js +66 -24
  35. package/lib/commonjs/components/MessageBubble/MessageReply.js.map +1 -1
  36. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js +76 -44
  37. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
  38. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +5 -4
  39. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  40. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  41. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  42. package/lib/commonjs/components/Thread/ThreadWrapper.js +265 -152
  43. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  44. package/lib/commonjs/components/styled/DateLabel.js +6 -3
  45. package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
  46. package/lib/commonjs/context/MessageNotificationContext.js +188 -9
  47. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  48. package/lib/commonjs/context/xmppProvider.js +22 -7
  49. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  50. package/lib/commonjs/helpers/createRoomFromApi.js +36 -2
  51. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  52. package/lib/commonjs/helpers/emoji.js +51 -0
  53. package/lib/commonjs/helpers/emoji.js.map +1 -0
  54. package/lib/commonjs/helpers/haptics.js +29 -0
  55. package/lib/commonjs/helpers/haptics.js.map +1 -0
  56. package/lib/commonjs/helpers/historyPreloadScheduler.js +32 -66
  57. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  58. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +21 -12
  59. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  60. package/lib/commonjs/helpers/mamReactions.js +57 -0
  61. package/lib/commonjs/helpers/mamReactions.js.map +1 -0
  62. package/lib/commonjs/helpers/parseMessageReference.js +42 -0
  63. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -0
  64. package/lib/commonjs/helpers/reactionsConfig.js +17 -0
  65. package/lib/commonjs/helpers/reactionsConfig.js.map +1 -0
  66. package/lib/commonjs/helpers/updateMessagesTillLast.js +17 -2
  67. package/lib/commonjs/helpers/updateMessagesTillLast.js.map +1 -1
  68. package/lib/commonjs/hooks/useHeapSender.js +3 -1
  69. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  70. package/lib/commonjs/hooks/useMessageHeapState.js +3 -2
  71. package/lib/commonjs/hooks/useMessageHeapState.js.map +1 -1
  72. package/lib/commonjs/hooks/useRoomInitialization.js +16 -7
  73. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  74. package/lib/commonjs/hooks/useSendMessage.js +14 -8
  75. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  76. package/lib/commonjs/hooks/useUnreadMessagesCounter.js +1 -1
  77. package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
  78. package/lib/commonjs/networking/stanzaHandlers.js +106 -50
  79. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  80. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +29 -74
  81. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  82. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +4 -0
  83. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  84. package/lib/commonjs/networking/xmpp/mamRouter.js +186 -0
  85. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -0
  86. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +41 -4
  87. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  88. package/lib/commonjs/networking/xmppClient.js +98 -23
  89. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  90. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js +29 -34
  91. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  92. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js +51 -0
  93. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js.map +1 -0
  94. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +66 -43
  95. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  96. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +88 -68
  97. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  98. package/lib/commonjs/roomStore/index.js +18 -14
  99. package/lib/commonjs/roomStore/index.js.map +1 -1
  100. package/lib/commonjs/roomStore/persistBackend.js +96 -0
  101. package/lib/commonjs/roomStore/persistBackend.js.map +1 -0
  102. package/lib/commonjs/roomStore/persistence.js +245 -50
  103. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  104. package/lib/commonjs/roomStore/roomsSlice.js +282 -136
  105. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  106. package/lib/commonjs/theme/theme.js +3 -0
  107. package/lib/commonjs/theme/theme.js.map +1 -1
  108. package/lib/commonjs/utils/devLogger.js +14 -0
  109. package/lib/commonjs/utils/devLogger.js.map +1 -1
  110. package/lib/commonjs/version.js +1 -1
  111. package/lib/module/assets/emojiData.js +36 -0
  112. package/lib/module/assets/emojiData.js.map +1 -0
  113. package/lib/module/assets/icons.js +1 -1
  114. package/lib/module/assets/icons.js.map +1 -1
  115. package/lib/module/components/MainComponents/ChatHeader.js +8 -10
  116. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  117. package/lib/module/components/MainComponents/ChatRoom.js +25 -24
  118. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  119. package/lib/module/components/MainComponents/ChatWrapper.js +23 -17
  120. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  121. package/lib/module/components/MainComponents/MessageContainer.js +7 -14
  122. package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
  123. package/lib/module/components/MainComponents/MessageList.js +110 -35
  124. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  125. package/lib/module/components/MainComponents/RoomList.js +32 -29
  126. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  127. package/lib/module/components/MainComponents/RoomStack.js +131 -63
  128. package/lib/module/components/MainComponents/RoomStack.js.map +1 -1
  129. package/lib/module/components/MainComponents/SystemMessage.js +6 -2
  130. package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
  131. package/lib/module/components/MessageBubble/Avatar.js +5 -1
  132. package/lib/module/components/MessageBubble/Avatar.js.map +1 -1
  133. package/lib/module/components/MessageBubble/BottomReplyContainer.js +18 -22
  134. package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  135. package/lib/module/components/MessageBubble/EmojiPickerSheet.js +438 -0
  136. package/lib/module/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  137. package/lib/module/components/MessageBubble/Message.js +203 -134
  138. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  139. package/lib/module/components/MessageBubble/MessageInteractions.js +215 -14
  140. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  141. package/lib/module/components/MessageBubble/MessageReaction.js +115 -94
  142. package/lib/module/components/MessageBubble/MessageReaction.js.map +1 -1
  143. package/lib/module/components/MessageBubble/MessageReply.js +65 -24
  144. package/lib/module/components/MessageBubble/MessageReply.js.map +1 -1
  145. package/lib/module/components/Modals/Modal/SwipeBackLayer.js +76 -44
  146. package/lib/module/components/Modals/Modal/SwipeBackLayer.js.map +1 -1
  147. package/lib/module/components/RoomComponents/ChatRoomItem.js +5 -4
  148. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  149. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  150. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  151. package/lib/module/components/Thread/ThreadWrapper.js +264 -152
  152. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  153. package/lib/module/components/styled/DateLabel.js +6 -3
  154. package/lib/module/components/styled/DateLabel.js.map +1 -1
  155. package/lib/module/context/MessageNotificationContext.js +190 -11
  156. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  157. package/lib/module/context/xmppProvider.js +22 -7
  158. package/lib/module/context/xmppProvider.js.map +1 -1
  159. package/lib/module/helpers/createRoomFromApi.js +36 -2
  160. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  161. package/lib/module/helpers/emoji.js +44 -0
  162. package/lib/module/helpers/emoji.js.map +1 -0
  163. package/lib/module/helpers/haptics.js +24 -0
  164. package/lib/module/helpers/haptics.js.map +1 -0
  165. package/lib/module/helpers/historyPreloadScheduler.js +32 -66
  166. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  167. package/lib/module/helpers/insertMessageWithDelimiter.js +21 -12
  168. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  169. package/lib/module/helpers/mamReactions.js +51 -0
  170. package/lib/module/helpers/mamReactions.js.map +1 -0
  171. package/lib/module/helpers/parseMessageReference.js +37 -0
  172. package/lib/module/helpers/parseMessageReference.js.map +1 -0
  173. package/lib/module/helpers/reactionsConfig.js +10 -0
  174. package/lib/module/helpers/reactionsConfig.js.map +1 -0
  175. package/lib/module/helpers/updateMessagesTillLast.js +17 -2
  176. package/lib/module/helpers/updateMessagesTillLast.js.map +1 -1
  177. package/lib/module/hooks/useHeapSender.js +3 -1
  178. package/lib/module/hooks/useHeapSender.js.map +1 -1
  179. package/lib/module/hooks/useMessageHeapState.js +3 -2
  180. package/lib/module/hooks/useMessageHeapState.js.map +1 -1
  181. package/lib/module/hooks/useRoomInitialization.js +17 -8
  182. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  183. package/lib/module/hooks/useSendMessage.js +14 -8
  184. package/lib/module/hooks/useSendMessage.js.map +1 -1
  185. package/lib/module/hooks/useUnreadMessagesCounter.js +1 -1
  186. package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
  187. package/lib/module/networking/stanzaHandlers.js +107 -51
  188. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  189. package/lib/module/networking/xmpp/getHistory.xmpp.js +29 -74
  190. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  191. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +4 -0
  192. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  193. package/lib/module/networking/xmpp/mamRouter.js +175 -0
  194. package/lib/module/networking/xmpp/mamRouter.js.map +1 -0
  195. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +38 -2
  196. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  197. package/lib/module/networking/xmppClient.js +99 -24
  198. package/lib/module/networking/xmppClient.js.map +1 -1
  199. package/lib/module/roomStore/Middleware/newMessageMidlleware.js +29 -34
  200. package/lib/module/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  201. package/lib/module/roomStore/Middleware/perfMiddleware.js +45 -0
  202. package/lib/module/roomStore/Middleware/perfMiddleware.js.map +1 -0
  203. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +66 -43
  204. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  205. package/lib/module/roomStore/Middleware/unreadMidlleware.js +89 -69
  206. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  207. package/lib/module/roomStore/index.js +19 -15
  208. package/lib/module/roomStore/index.js.map +1 -1
  209. package/lib/module/roomStore/persistBackend.js +89 -0
  210. package/lib/module/roomStore/persistBackend.js.map +1 -0
  211. package/lib/module/roomStore/persistence.js +245 -48
  212. package/lib/module/roomStore/persistence.js.map +1 -1
  213. package/lib/module/roomStore/roomsSlice.js +275 -134
  214. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  215. package/lib/module/theme/theme.js +3 -0
  216. package/lib/module/theme/theme.js.map +1 -1
  217. package/lib/module/utils/devLogger.js +13 -0
  218. package/lib/module/utils/devLogger.js.map +1 -1
  219. package/lib/module/version.js +1 -1
  220. package/lib/typescript/assets/emojiData.d.ts +8 -0
  221. package/lib/typescript/assets/emojiData.d.ts.map +1 -0
  222. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  223. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  224. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  225. package/lib/typescript/components/MainComponents/MessageContainer.d.ts +2 -2
  226. package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
  227. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  228. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  229. package/lib/typescript/components/MainComponents/RoomStack.d.ts +7 -2
  230. package/lib/typescript/components/MainComponents/RoomStack.d.ts.map +1 -1
  231. package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
  232. package/lib/typescript/components/MessageBubble/Avatar.d.ts +2 -0
  233. package/lib/typescript/components/MessageBubble/Avatar.d.ts.map +1 -1
  234. package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
  235. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts +11 -0
  236. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts.map +1 -0
  237. package/lib/typescript/components/MessageBubble/Message.d.ts +2 -2
  238. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  239. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +2 -0
  240. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  241. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts +1 -0
  242. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts.map +1 -1
  243. package/lib/typescript/components/MessageBubble/MessageReply.d.ts +7 -7
  244. package/lib/typescript/components/MessageBubble/MessageReply.d.ts.map +1 -1
  245. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts +2 -1
  246. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts.map +1 -1
  247. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts +2 -2
  248. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  249. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts +3 -6
  250. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts.map +1 -1
  251. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +7 -1
  252. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  253. package/lib/typescript/components/styled/DateLabel.d.ts +1 -0
  254. package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
  255. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  256. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  257. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  258. package/lib/typescript/helpers/emoji.d.ts +6 -0
  259. package/lib/typescript/helpers/emoji.d.ts.map +1 -0
  260. package/lib/typescript/helpers/haptics.d.ts +3 -0
  261. package/lib/typescript/helpers/haptics.d.ts.map +1 -0
  262. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +1 -0
  263. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  264. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  265. package/lib/typescript/helpers/mamReactions.d.ts +13 -0
  266. package/lib/typescript/helpers/mamReactions.d.ts.map +1 -0
  267. package/lib/typescript/helpers/parseMessageReference.d.ts +16 -0
  268. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -0
  269. package/lib/typescript/helpers/reactionsConfig.d.ts +5 -0
  270. package/lib/typescript/helpers/reactionsConfig.d.ts.map +1 -0
  271. package/lib/typescript/helpers/updateMessagesTillLast.d.ts.map +1 -1
  272. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  273. package/lib/typescript/hooks/useMessageHeapState.d.ts.map +1 -1
  274. package/lib/typescript/hooks/useRoomInitialization.d.ts +2 -2
  275. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  276. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  277. package/lib/typescript/networking/stanzaHandlers.d.ts +4 -2
  278. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  279. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +3 -1
  280. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  281. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  282. package/lib/typescript/networking/xmpp/mamRouter.d.ts +23 -0
  283. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -0
  284. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +1 -0
  285. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  286. package/lib/typescript/networking/xmppClient.d.ts +22 -1
  287. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  288. package/lib/typescript/roomStore/Middleware/newMessageMidlleware.d.ts.map +1 -1
  289. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts +4 -0
  290. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts.map +1 -0
  291. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts +9 -0
  292. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  293. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  294. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  295. package/lib/typescript/roomStore/persistBackend.d.ts +11 -0
  296. package/lib/typescript/roomStore/persistBackend.d.ts.map +1 -0
  297. package/lib/typescript/roomStore/persistence.d.ts +5 -6
  298. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  299. package/lib/typescript/roomStore/roomsSlice.d.ts +41 -1
  300. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  301. package/lib/typescript/theme/theme.d.ts +4 -1
  302. package/lib/typescript/theme/theme.d.ts.map +1 -1
  303. package/lib/typescript/types/models/message.model.d.ts +4 -0
  304. package/lib/typescript/types/models/message.model.d.ts.map +1 -1
  305. package/lib/typescript/types/models/room.model.d.ts +16 -0
  306. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  307. package/lib/typescript/types/models/xmpp.model.d.ts +6 -1
  308. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  309. package/lib/typescript/types/types.d.ts +15 -3
  310. package/lib/typescript/types/types.d.ts.map +1 -1
  311. package/lib/typescript/utils/devLogger.d.ts +8 -0
  312. package/lib/typescript/utils/devLogger.d.ts.map +1 -1
  313. package/lib/typescript/version.d.ts +1 -1
  314. package/package.json +10 -1
  315. package/src/assets/emojiData.ts +2146 -0
  316. package/src/assets/icons.tsx +5 -5
  317. package/src/components/MainComponents/ChatHeader.tsx +16 -7
  318. package/src/components/MainComponents/ChatRoom.tsx +35 -29
  319. package/src/components/MainComponents/ChatWrapper.tsx +28 -10
  320. package/src/components/MainComponents/MessageContainer.tsx +7 -15
  321. package/src/components/MainComponents/MessageList.tsx +96 -43
  322. package/src/components/MainComponents/RoomList.tsx +28 -29
  323. package/src/components/MainComponents/RoomStack.tsx +156 -83
  324. package/src/components/MainComponents/SystemMessage.tsx +6 -2
  325. package/src/components/MessageBubble/Avatar.tsx +7 -1
  326. package/src/components/MessageBubble/BottomReplyContainer.tsx +19 -21
  327. package/src/components/MessageBubble/EmojiPickerSheet.tsx +468 -0
  328. package/src/components/MessageBubble/Message.tsx +146 -87
  329. package/src/components/MessageBubble/MessageInteractions.tsx +213 -12
  330. package/src/components/MessageBubble/MessageReaction.tsx +120 -96
  331. package/src/components/MessageBubble/MessageReply.tsx +65 -32
  332. package/src/components/Modals/Modal/SwipeBackLayer.tsx +114 -63
  333. package/src/components/RoomComponents/ChatRoomItem.tsx +11 -4
  334. package/src/components/RoomComponents/styled/LastMessageEmoji.tsx +7 -8
  335. package/src/components/Thread/ThreadWrapper.tsx +274 -198
  336. package/src/components/styled/DateLabel.tsx +7 -3
  337. package/src/context/MessageNotificationContext.tsx +205 -7
  338. package/src/context/xmppProvider.tsx +29 -9
  339. package/src/helpers/createRoomFromApi.tsx +37 -1
  340. package/src/helpers/emoji.ts +39 -0
  341. package/src/helpers/haptics.ts +19 -0
  342. package/src/helpers/historyPreloadScheduler.ts +37 -69
  343. package/src/helpers/insertMessageWithDelimiter.ts +23 -16
  344. package/src/helpers/mamReactions.ts +59 -0
  345. package/src/helpers/parseMessageReference.ts +38 -0
  346. package/src/helpers/reactionsConfig.ts +13 -0
  347. package/src/helpers/updateMessagesTillLast.tsx +14 -2
  348. package/src/hooks/useHeapSender.tsx +3 -2
  349. package/src/hooks/useMessageHeapState.tsx +6 -2
  350. package/src/hooks/useRoomInitialization.tsx +32 -15
  351. package/src/hooks/useSendMessage.tsx +18 -11
  352. package/src/hooks/useUnreadMessagesCounter.ts +1 -1
  353. package/src/networking/stanzaHandlers.ts +116 -60
  354. package/src/networking/xmpp/getHistory.xmpp.ts +44 -106
  355. package/src/networking/xmpp/handleStanzas.xmpp.ts +2 -0
  356. package/src/networking/xmpp/mamRouter.ts +176 -0
  357. package/src/networking/xmpp/presenceInRoom.xmpp.ts +46 -3
  358. package/src/networking/xmppClient.ts +105 -20
  359. package/src/roomStore/Middleware/newMessageMidlleware.tsx +35 -38
  360. package/src/roomStore/Middleware/perfMiddleware.ts +50 -0
  361. package/src/roomStore/Middleware/reactionsMiddleware.tsx +53 -52
  362. package/src/roomStore/Middleware/unreadMidlleware.tsx +92 -80
  363. package/src/roomStore/index.ts +28 -27
  364. package/src/roomStore/persistBackend.ts +96 -0
  365. package/src/roomStore/persistence.ts +280 -73
  366. package/src/roomStore/roomsSlice.ts +304 -155
  367. package/src/theme/theme.ts +10 -1
  368. package/src/types/models/message.model.ts +4 -0
  369. package/src/types/models/room.model.ts +17 -0
  370. package/src/types/models/xmpp.model.ts +4 -2
  371. package/src/types/types.ts +15 -3
  372. package/src/utils/devLogger.ts +16 -0
  373. package/src/version.ts +1 -1
@@ -1,5 +1,5 @@
1
1
  import { Middleware } from '@reduxjs/toolkit';
2
- import { updateRoom, msgSortableMs } from '../roomsSlice';
2
+ import { setUnreadCounts, msgSortableMs } from '../roomsSlice';
3
3
  import { IMessage } from '../../types/types';
4
4
 
5
5
  // Per-room cache so we only recompute when something that affects the
@@ -60,6 +60,8 @@ const isOwnMessage = (
60
60
  // 50 rooms × 100 messages that's 5000 Date() parses per modal click.
61
61
  const TRIGGER_ACTIONS = new Set([
62
62
  'roomMessages/addRoomMessage',
63
+ 'roomMessages/addRoomMessages',
64
+ 'roomMessages/addRooms',
63
65
  'roomMessages/setRoomMessages',
64
66
  'roomMessages/editRoomMessage',
65
67
  'roomMessages/setLastViewedTimestamp',
@@ -79,6 +81,41 @@ const TRIGGER_ACTIONS = new Set([
79
81
  'roomMessages/applyRoomsPreloadBatch',
80
82
  ]);
81
83
 
84
+ // Which rooms an action can have changed the unread count of. Walking
85
+ // every room on every message (the previous behaviour) made each incoming
86
+ // message cost O(rooms); `'all'` is reserved for the few actions that move
87
+ // several rooms' baselines at once.
88
+ const touchedRooms = (action: any): string[] | 'all' => {
89
+ const p = action?.payload;
90
+ switch (action?.type) {
91
+ case 'roomMessages/addRoomMessage':
92
+ case 'roomMessages/addRoomMessages':
93
+ case 'roomMessages/setRoomMessages':
94
+ case 'roomMessages/editRoomMessage':
95
+ return p?.roomJID ? [p.roomJID] : [];
96
+ case 'roomMessages/setLastViewedTimestamp':
97
+ return p?.chatJID ? [p.chatJID] : [];
98
+ case 'roomMessages/addRoom':
99
+ return p?.roomData?.jid ? [p.roomData.jid] : [];
100
+ case 'roomMessages/addRooms':
101
+ case 'roomMessages/applyRoomsPreloadBatch':
102
+ return Array.isArray(p?.rooms)
103
+ ? p.rooms.map((r: any) => r?.jid).filter(Boolean)
104
+ : [];
105
+ case 'roomMessages/updateRoom': {
106
+ // The counts this middleware writes itself, and the room-list
107
+ // ordering stamp, never change what is unread.
108
+ const keys = Object.keys(p?.updates || {});
109
+ const relevant = keys.some(
110
+ (k) => k !== 'unreadMessages' && k !== 'lastMessageTimestamp'
111
+ );
112
+ return relevant && p?.jid ? [p.jid] : [];
113
+ }
114
+ default:
115
+ return 'all';
116
+ }
117
+ };
118
+
82
119
  export const unreadMiddleware: Middleware =
83
120
  (storeAPI) => (next) => (action: any) => {
84
121
  if (!action || !action.type) {
@@ -105,92 +142,67 @@ export const unreadMiddleware: Middleware =
105
142
 
106
143
  const state = storeAPI.getState();
107
144
  const rooms = state.rooms.rooms;
145
+ if (!rooms) {return result;}
108
146
  const visibleRoomJID = state.rooms.visibleRoomJID;
109
147
  const selfUser = state.chatSettingStore?.user;
110
148
  const selfXmpp = selfUser?.xmppUsername || '';
111
149
  const selfWallet = selfUser?.walletAddress || '';
112
150
 
113
- if (rooms && Object.keys(rooms).length > 0) {
114
- Object.keys(rooms).forEach((jid) => {
115
- const room = rooms[jid];
116
- if (!room) {return;}
117
- // Skip rooms the user is currently viewing — visibility clears the
118
- // badge directly. Skip rooms with no reference point (covers
119
- // undefined / null / 0) — after logout→login, hydrated rooms
120
- // come back without lastViewedTimestamp, and treating that as 0
121
- // made every history message satisfy `date > 0` and incorrectly
122
- // bumped unread for already-seen content.
123
- if (jid === visibleRoomJID) {
124
- if (room.unreadMessages !== 0) {
125
- storeAPI.dispatch(
126
- updateRoom({
127
- jid,
128
- updates: { unreadMessages: 0 },
129
- })
130
- );
131
- }
132
- return;
133
- }
134
- if (!(room.lastViewedTimestamp > 0)) {return;}
135
-
136
- const msgs = room.messages;
137
- const currentMessagesLength = msgs?.length || 0;
138
- const firstId = currentMessagesLength ? String(msgs![0]?.id ?? '') : '';
139
- const lastId = currentMessagesLength
140
- ? String(msgs![currentMessagesLength - 1]?.id ?? '')
141
- : '';
142
- const fingerprint = `${currentMessagesLength}|${room.lastViewedTimestamp || 0}|${firstId}|${lastId}`;
143
- if (triggerCache[jid] === fingerprint) {return;}
144
- triggerCache[jid] = fingerprint;
145
-
146
- // Ignore the "delimiter-new" sentinel + locally-pending sends
147
- // so the two unread-counting paths (this middleware + the
148
- // reducer's countNewerMessages) never disagree. Also exclude
149
- // own messages so MAM-replayed sends on re-login don't bump
150
- // the user's own badge.
151
- const unreadMessagesCount = room.messages?.filter(
152
- (msg: IMessage) =>
153
- msg.id !== 'delimiter-new' &&
154
- !msg.pending &&
155
- !isOwnMessage(msg, selfXmpp, selfWallet) &&
156
- msgSortableMs(msg) >
157
- (room.lastViewedTimestamp || 0)
158
- ).length;
159
-
160
- const newerByTs = (room.messages || []).filter(
161
- (m: IMessage) =>
162
- m.id !== 'delimiter-new' &&
163
- !m.pending &&
164
- msgSortableMs(m) > (room.lastViewedTimestamp || 0)
165
- );
166
- if (newerByTs.length > 0 && (unreadMessagesCount || 0) === 0) {
167
- const s: any = newerByTs[newerByTs.length - 1] || {};
168
- console.log('[unread-diag] ownership suppressed', {
169
- jid,
170
- selfXmpp,
171
- selfWallet,
172
- newerByTs: newerByTs.length,
173
- unreadAfterOwnFilter: unreadMessagesCount,
174
- sample: {
175
- id: s.id,
176
- userId: s?.user?.id,
177
- userJID: s?.user?.userJID,
178
- xmppUsername: s?.user?.xmppUsername,
179
- xmppFrom: s?.xmppFrom,
180
- senderJID: s?.senderJID,
181
- },
182
- });
151
+ const touched = touchedRooms(action);
152
+ const jids = touched === 'all' ? Object.keys(rooms) : touched;
153
+ if (jids.length === 0) {return result;}
154
+
155
+ const counts: Record<string, number> = {};
156
+ for (const jid of jids) {
157
+ const room = rooms[jid];
158
+ if (!room) {continue;}
159
+ // The room the user is looking at never carries a badge.
160
+ if (jid === visibleRoomJID) {
161
+ if (room.unreadMessages !== 0) {counts[jid] = 0;}
162
+ continue;
163
+ }
164
+ // No reference point (undefined / null / 0): after logout→login,
165
+ // hydrated rooms come back without lastViewedTimestamp, and treating
166
+ // that as 0 made every history message count as unread.
167
+ if (!(room.lastViewedTimestamp > 0)) {continue;}
168
+
169
+ const msgs = room.messages;
170
+ const currentMessagesLength = msgs?.length || 0;
171
+ const firstId = currentMessagesLength ? String(msgs![0]?.id ?? '') : '';
172
+ const lastId = currentMessagesLength
173
+ ? String(msgs![currentMessagesLength - 1]?.id ?? '')
174
+ : '';
175
+ const fingerprint = `${currentMessagesLength}|${room.lastViewedTimestamp || 0}|${firstId}|${lastId}`;
176
+ if (triggerCache[jid] === fingerprint) {continue;}
177
+ triggerCache[jid] = fingerprint;
178
+
179
+ // Ignore the "delimiter-new" sentinel + locally-pending sends
180
+ // so the two unread-counting paths (this middleware + the
181
+ // reducer's countNewerMessages) never disagree. Also exclude
182
+ // own messages so MAM-replayed sends on re-login don't bump
183
+ // the user's own badge.
184
+ const since = room.lastViewedTimestamp || 0;
185
+ let unreadMessagesCount = 0;
186
+ for (const msg of msgs || []) {
187
+ if (
188
+ msg.id !== 'delimiter-new' &&
189
+ !msg.pending &&
190
+ msgSortableMs(msg) > since &&
191
+ !isOwnMessage(msg, selfXmpp, selfWallet)
192
+ ) {
193
+ unreadMessagesCount += 1;
183
194
  }
195
+ }
184
196
 
185
- if (room.unreadMessages !== unreadMessagesCount) {
186
- storeAPI.dispatch(
187
- updateRoom({
188
- jid,
189
- updates: { unreadMessages: unreadMessagesCount },
190
- })
191
- );
192
- }
193
- });
197
+ if (room.unreadMessages !== unreadMessagesCount) {
198
+ counts[jid] = unreadMessagesCount;
199
+ }
200
+ }
201
+
202
+ // One action for every room that changed — and one that is not itself
203
+ // a trigger, so the chain stops here.
204
+ if (Object.keys(counts).length > 0) {
205
+ storeAPI.dispatch(setUnreadCounts(counts));
194
206
  }
195
207
 
196
208
  return result;
@@ -1,6 +1,6 @@
1
1
  import { configureStore, combineReducers } from '@reduxjs/toolkit';
2
2
  import chatSettingsReducer, { setUser } from './chatSettingsSlice';
3
- import roomsSlice, { addRoom } from './roomsSlice';
3
+ import roomsSlice, { addRooms } from './roomsSlice';
4
4
  import { roomHeapSlice, markMessageFailed } from './roomHeapSlice';
5
5
  import callReducer from './callSlice';
6
6
  import { IRoom } from '../types/types';
@@ -8,6 +8,7 @@ import { unreadMiddleware } from './Middleware/unreadMidlleware';
8
8
  import { logoutMiddleware } from './Middleware/logoutMiddleware';
9
9
  import { newMessageMidlleware } from './Middleware/newMessageMidlleware';
10
10
  import { reactionsMiddleware } from './Middleware/reactionsMiddleware';
11
+ import { isPerfProfilingEnabled, perfMiddleware } from './Middleware/perfMiddleware';
11
12
  import {
12
13
  persistenceMiddleware,
13
14
  readPersistedState,
@@ -29,29 +30,27 @@ export type RootState = ReturnType<typeof rootReducer>;
29
30
  const createChatStore = () =>
30
31
  configureStore({
31
32
  reducer: rootReducer,
32
- middleware: (getDefaultMiddleware) =>
33
- getDefaultMiddleware({
34
- serializableCheck: {
35
- // Slice names: chatSlice→'chat', roomsStore→'roomMessages'.
36
- ignoredActions: [
37
- 'chat/addMessage',
38
- 'chat/setStoreClient',
39
- 'chat/setConfig',
40
- 'roomMessages/addRoom',
41
- ],
42
- ignoredActionPaths: ['payload.client', 'payload.config'],
43
- ignoredPaths: [
44
- 'chat.messages.timestamp',
45
- 'chatSettingStore.client',
46
- 'chatSettingStore.config',
47
- ],
48
- },
49
- })
50
- .concat(unreadMiddleware)
51
- .concat(newMessageMidlleware)
52
- .concat(reactionsMiddleware)
53
- .concat(logoutMiddleware)
54
- .concat(persistenceMiddleware),
33
+ middleware: (getDefaultMiddleware) => {
34
+ const base = getDefaultMiddleware({
35
+ // Both dev-only invariant checks walk the WHOLE state on every
36
+ // action. With rooms + message history in the store that took
37
+ // 60-80 ms per dispatch (RTK's own "took Xms" warning), blocking
38
+ // the JS thread long enough to make taps feel dead in dev builds.
39
+ // Production builds never ran them.
40
+ serializableCheck: false,
41
+ immutableCheck: false,
42
+ });
43
+ const chain = [
44
+ unreadMiddleware,
45
+ newMessageMidlleware,
46
+ reactionsMiddleware,
47
+ logoutMiddleware,
48
+ persistenceMiddleware,
49
+ ];
50
+ return isPerfProfilingEnabled()
51
+ ? base.concat(perfMiddleware, ...chain)
52
+ : base.concat(...chain);
53
+ },
55
54
  });
56
55
 
57
56
  const globalScope = globalThis as typeof globalThis & {
@@ -82,9 +81,11 @@ export const persistorReady =
82
81
  store.dispatch(setUser(chat.user));
83
82
  }
84
83
  if (rooms?.rooms) {
85
- for (const [jid, room] of Object.entries(rooms.rooms)) {
86
- if (!jid || !room) {continue;}
87
- store.dispatch(addRoom({ roomData: room as IRoom }));
84
+ const restored = Object.entries(rooms.rooms)
85
+ .filter(([jid, room]) => !!jid && !!room)
86
+ .map(([, room]) => room as IRoom);
87
+ if (restored.length) {
88
+ store.dispatch(addRooms({ rooms: restored }));
88
89
  }
89
90
  }
90
91
 
@@ -0,0 +1,96 @@
1
+ import AsyncStorage from '@react-native-async-storage/async-storage';
2
+ import { secureGet, secureSet } from '../helpers/secureKeyValue';
3
+ import { encryptForPersist, decryptFromPersist } from '../helpers/persistCrypto';
4
+
5
+
6
+ export interface PersistBackend {
7
+ name: 'mmkv' | 'async-storage';
8
+ getMany(keys: string[]): Promise<(string | null)[]>;
9
+ setMany(pairs: [string, string][]): Promise<void>;
10
+ removeMany(keys: string[]): Promise<void>;
11
+ allKeys(): Promise<string[]>;
12
+ }
13
+
14
+ const MMKV_INSTANCE_ID = 'ethora-chat-persist';
15
+ const MMKV_KEY_STORE_KEY = '@ethora/persist:mmkvKey';
16
+ const MMKV_KEY_LENGTH = 16;
17
+
18
+ const randomKey = (length: number): string => {
19
+ const alphabet =
20
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
21
+ const bytes = new Uint8Array(length);
22
+ (globalThis as any).crypto.getRandomValues(bytes);
23
+ let out = '';
24
+ for (let i = 0; i < length; i++) {out += alphabet[bytes[i] % alphabet.length];}
25
+ return out;
26
+ };
27
+
28
+ const loadOrCreateMmkvKey = async (): Promise<string> => {
29
+ const existing = await secureGet(MMKV_KEY_STORE_KEY);
30
+ if (existing) {return existing;}
31
+ const key = randomKey(MMKV_KEY_LENGTH);
32
+ await secureSet(MMKV_KEY_STORE_KEY, key);
33
+ return key;
34
+ };
35
+
36
+ const createMmkvBackend = async (): Promise<PersistBackend | null> => {
37
+ let MMKV: any;
38
+ try {
39
+ MMKV = require('react-native-mmkv').MMKV;
40
+ } catch {
41
+ return null;
42
+ }
43
+ if (typeof MMKV !== 'function') {return null;}
44
+ try {
45
+ const encryptionKey = await loadOrCreateMmkvKey();
46
+ // Throws when the native module is missing from the binary.
47
+ const storage = new MMKV({ id: MMKV_INSTANCE_ID, encryptionKey });
48
+ return {
49
+ name: 'mmkv',
50
+ getMany: async (keys) => keys.map((k) => storage.getString(k) ?? null),
51
+ setMany: async (pairs) => {
52
+ for (const [k, v] of pairs) {storage.set(k, v);}
53
+ },
54
+ removeMany: async (keys) => {
55
+ for (const k of keys) {storage.delete(k);}
56
+ },
57
+ allKeys: async () => storage.getAllKeys(),
58
+ };
59
+ } catch (e) {
60
+ console.warn('[persist] react-native-mmkv present but unusable, falling back', e);
61
+ return null;
62
+ }
63
+ };
64
+
65
+ const asyncStorageBackend: PersistBackend = {
66
+ name: 'async-storage',
67
+ getMany: async (keys) => {
68
+ const pairs = await AsyncStorage.multiGet(keys);
69
+ return Promise.all(
70
+ pairs.map(([, raw]) => (raw ? decryptFromPersist(raw) : Promise.resolve(null)))
71
+ );
72
+ },
73
+ setMany: async (pairs) => {
74
+ const encrypted = await Promise.all(
75
+ pairs.map(async ([k, v]) => [k, await encryptForPersist(v)] as [string, string])
76
+ );
77
+ await AsyncStorage.multiSet(encrypted);
78
+ },
79
+ removeMany: (keys) => AsyncStorage.multiRemove(keys),
80
+ allKeys: async () => [...(await AsyncStorage.getAllKeys())],
81
+ };
82
+
83
+ let backendPromise: Promise<PersistBackend> | null = null;
84
+
85
+ export const getPersistBackend = (): Promise<PersistBackend> => {
86
+ if (!backendPromise) {
87
+ backendPromise = createMmkvBackend().then((mmkv) => mmkv ?? asyncStorageBackend);
88
+ }
89
+ return backendPromise;
90
+ };
91
+
92
+ export const legacyAsyncStorageBackend = asyncStorageBackend;
93
+
94
+ export const __resetPersistBackend = () => {
95
+ backendPromise = null;
96
+ };