@ethora/chat-component-rn 26.8.4 → 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 (417) 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/Header/HeaderRoomList.js +12 -7
  7. package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
  8. package/lib/commonjs/components/MainComponents/ChatHeader.js +7 -9
  9. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  10. package/lib/commonjs/components/MainComponents/ChatRoom.js +47 -26
  11. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  12. package/lib/commonjs/components/MainComponents/ChatWrapper.js +58 -21
  13. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  14. package/lib/commonjs/components/MainComponents/KeyboardInputDock.js +40 -0
  15. package/lib/commonjs/components/MainComponents/KeyboardInputDock.js.map +1 -0
  16. package/lib/commonjs/components/MainComponents/MessageContainer.js +4 -12
  17. package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
  18. package/lib/commonjs/components/MainComponents/MessageList.js +110 -35
  19. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  20. package/lib/commonjs/components/MainComponents/RoomList.js +32 -29
  21. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  22. package/lib/commonjs/components/MainComponents/RoomStack.js +270 -0
  23. package/lib/commonjs/components/MainComponents/RoomStack.js.map +1 -0
  24. package/lib/commonjs/components/MainComponents/SystemMessage.js +6 -2
  25. package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
  26. package/lib/commonjs/components/MessageBubble/Avatar.js +5 -1
  27. package/lib/commonjs/components/MessageBubble/Avatar.js.map +1 -1
  28. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +17 -21
  29. package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  30. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js +447 -0
  31. package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  32. package/lib/commonjs/components/MessageBubble/Message.js +200 -132
  33. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  34. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +213 -12
  35. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  36. package/lib/commonjs/components/MessageBubble/MessageReaction.js +113 -94
  37. package/lib/commonjs/components/MessageBubble/MessageReaction.js.map +1 -1
  38. package/lib/commonjs/components/MessageBubble/MessageReply.js +66 -24
  39. package/lib/commonjs/components/MessageBubble/MessageReply.js.map +1 -1
  40. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +6 -1
  41. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  42. package/lib/commonjs/components/Modals/Modal/Modal.js +24 -0
  43. package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
  44. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js +178 -0
  45. package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js.map +1 -0
  46. package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js +28 -10
  47. package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -1
  48. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +9 -3
  49. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  50. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +5 -4
  51. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  52. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  53. package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  54. package/lib/commonjs/components/Thread/ThreadWrapper.js +265 -152
  55. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  56. package/lib/commonjs/components/styled/DateLabel.js +6 -3
  57. package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
  58. package/lib/commonjs/context/MessageNotificationContext.js +188 -9
  59. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  60. package/lib/commonjs/context/xmppProvider.js +22 -7
  61. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  62. package/lib/commonjs/helpers/createRoomFromApi.js +36 -2
  63. package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
  64. package/lib/commonjs/helpers/emoji.js +51 -0
  65. package/lib/commonjs/helpers/emoji.js.map +1 -0
  66. package/lib/commonjs/helpers/haptics.js +29 -0
  67. package/lib/commonjs/helpers/haptics.js.map +1 -0
  68. package/lib/commonjs/helpers/historyPreloadScheduler.js +32 -66
  69. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  70. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +21 -12
  71. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  72. package/lib/commonjs/helpers/keyboardLayout.js +23 -1
  73. package/lib/commonjs/helpers/keyboardLayout.js.map +1 -1
  74. package/lib/commonjs/helpers/mamReactions.js +57 -0
  75. package/lib/commonjs/helpers/mamReactions.js.map +1 -0
  76. package/lib/commonjs/helpers/parseMessageReference.js +42 -0
  77. package/lib/commonjs/helpers/parseMessageReference.js.map +1 -0
  78. package/lib/commonjs/helpers/reactionsConfig.js +17 -0
  79. package/lib/commonjs/helpers/reactionsConfig.js.map +1 -0
  80. package/lib/commonjs/helpers/updateMessagesTillLast.js +17 -2
  81. package/lib/commonjs/helpers/updateMessagesTillLast.js.map +1 -1
  82. package/lib/commonjs/hooks/useHeapSender.js +3 -1
  83. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  84. package/lib/commonjs/hooks/useMessageHeapState.js +3 -2
  85. package/lib/commonjs/hooks/useMessageHeapState.js.map +1 -1
  86. package/lib/commonjs/hooks/useRoomInitialization.js +16 -7
  87. package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
  88. package/lib/commonjs/hooks/useSendMessage.js +14 -8
  89. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  90. package/lib/commonjs/hooks/useUnreadMessagesCounter.js +1 -1
  91. package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
  92. package/lib/commonjs/networking/stanzaHandlers.js +106 -50
  93. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  94. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +29 -74
  95. package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
  96. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +4 -0
  97. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  98. package/lib/commonjs/networking/xmpp/mamRouter.js +186 -0
  99. package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -0
  100. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +41 -4
  101. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  102. package/lib/commonjs/networking/xmppClient.js +98 -23
  103. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  104. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js +29 -34
  105. package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  106. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js +51 -0
  107. package/lib/commonjs/roomStore/Middleware/perfMiddleware.js.map +1 -0
  108. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +66 -43
  109. package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  110. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +88 -68
  111. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  112. package/lib/commonjs/roomStore/index.js +18 -14
  113. package/lib/commonjs/roomStore/index.js.map +1 -1
  114. package/lib/commonjs/roomStore/persistBackend.js +96 -0
  115. package/lib/commonjs/roomStore/persistBackend.js.map +1 -0
  116. package/lib/commonjs/roomStore/persistence.js +245 -50
  117. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  118. package/lib/commonjs/roomStore/roomsSlice.js +282 -136
  119. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  120. package/lib/commonjs/theme/theme.js +3 -0
  121. package/lib/commonjs/theme/theme.js.map +1 -1
  122. package/lib/commonjs/utils/devLogger.js +14 -0
  123. package/lib/commonjs/utils/devLogger.js.map +1 -1
  124. package/lib/commonjs/version.js +1 -1
  125. package/lib/module/assets/emojiData.js +36 -0
  126. package/lib/module/assets/emojiData.js.map +1 -0
  127. package/lib/module/assets/icons.js +1 -1
  128. package/lib/module/assets/icons.js.map +1 -1
  129. package/lib/module/components/Header/HeaderRoomList.js +12 -7
  130. package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
  131. package/lib/module/components/MainComponents/ChatHeader.js +8 -10
  132. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  133. package/lib/module/components/MainComponents/ChatRoom.js +49 -28
  134. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  135. package/lib/module/components/MainComponents/ChatWrapper.js +60 -23
  136. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  137. package/lib/module/components/MainComponents/KeyboardInputDock.js +33 -0
  138. package/lib/module/components/MainComponents/KeyboardInputDock.js.map +1 -0
  139. package/lib/module/components/MainComponents/MessageContainer.js +7 -14
  140. package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
  141. package/lib/module/components/MainComponents/MessageList.js +110 -35
  142. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  143. package/lib/module/components/MainComponents/RoomList.js +32 -29
  144. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  145. package/lib/module/components/MainComponents/RoomStack.js +266 -0
  146. package/lib/module/components/MainComponents/RoomStack.js.map +1 -0
  147. package/lib/module/components/MainComponents/SystemMessage.js +6 -2
  148. package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
  149. package/lib/module/components/MessageBubble/Avatar.js +5 -1
  150. package/lib/module/components/MessageBubble/Avatar.js.map +1 -1
  151. package/lib/module/components/MessageBubble/BottomReplyContainer.js +18 -22
  152. package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
  153. package/lib/module/components/MessageBubble/EmojiPickerSheet.js +438 -0
  154. package/lib/module/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
  155. package/lib/module/components/MessageBubble/Message.js +203 -134
  156. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  157. package/lib/module/components/MessageBubble/MessageInteractions.js +215 -14
  158. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  159. package/lib/module/components/MessageBubble/MessageReaction.js +115 -94
  160. package/lib/module/components/MessageBubble/MessageReaction.js.map +1 -1
  161. package/lib/module/components/MessageBubble/MessageReply.js +65 -24
  162. package/lib/module/components/MessageBubble/MessageReply.js.map +1 -1
  163. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +6 -1
  164. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  165. package/lib/module/components/Modals/Modal/Modal.js +25 -1
  166. package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
  167. package/lib/module/components/Modals/Modal/SwipeBackLayer.js +172 -0
  168. package/lib/module/components/Modals/Modal/SwipeBackLayer.js.map +1 -0
  169. package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js +29 -11
  170. package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -1
  171. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +10 -4
  172. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  173. package/lib/module/components/RoomComponents/ChatRoomItem.js +5 -4
  174. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  175. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
  176. package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
  177. package/lib/module/components/Thread/ThreadWrapper.js +264 -152
  178. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  179. package/lib/module/components/styled/DateLabel.js +6 -3
  180. package/lib/module/components/styled/DateLabel.js.map +1 -1
  181. package/lib/module/context/MessageNotificationContext.js +190 -11
  182. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  183. package/lib/module/context/xmppProvider.js +22 -7
  184. package/lib/module/context/xmppProvider.js.map +1 -1
  185. package/lib/module/helpers/createRoomFromApi.js +36 -2
  186. package/lib/module/helpers/createRoomFromApi.js.map +1 -1
  187. package/lib/module/helpers/emoji.js +44 -0
  188. package/lib/module/helpers/emoji.js.map +1 -0
  189. package/lib/module/helpers/haptics.js +24 -0
  190. package/lib/module/helpers/haptics.js.map +1 -0
  191. package/lib/module/helpers/historyPreloadScheduler.js +32 -66
  192. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  193. package/lib/module/helpers/insertMessageWithDelimiter.js +21 -12
  194. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  195. package/lib/module/helpers/keyboardLayout.js +20 -0
  196. package/lib/module/helpers/keyboardLayout.js.map +1 -1
  197. package/lib/module/helpers/mamReactions.js +51 -0
  198. package/lib/module/helpers/mamReactions.js.map +1 -0
  199. package/lib/module/helpers/parseMessageReference.js +37 -0
  200. package/lib/module/helpers/parseMessageReference.js.map +1 -0
  201. package/lib/module/helpers/reactionsConfig.js +10 -0
  202. package/lib/module/helpers/reactionsConfig.js.map +1 -0
  203. package/lib/module/helpers/updateMessagesTillLast.js +17 -2
  204. package/lib/module/helpers/updateMessagesTillLast.js.map +1 -1
  205. package/lib/module/hooks/useHeapSender.js +3 -1
  206. package/lib/module/hooks/useHeapSender.js.map +1 -1
  207. package/lib/module/hooks/useMessageHeapState.js +3 -2
  208. package/lib/module/hooks/useMessageHeapState.js.map +1 -1
  209. package/lib/module/hooks/useRoomInitialization.js +17 -8
  210. package/lib/module/hooks/useRoomInitialization.js.map +1 -1
  211. package/lib/module/hooks/useSendMessage.js +14 -8
  212. package/lib/module/hooks/useSendMessage.js.map +1 -1
  213. package/lib/module/hooks/useUnreadMessagesCounter.js +1 -1
  214. package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
  215. package/lib/module/networking/stanzaHandlers.js +107 -51
  216. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  217. package/lib/module/networking/xmpp/getHistory.xmpp.js +29 -74
  218. package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
  219. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +4 -0
  220. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  221. package/lib/module/networking/xmpp/mamRouter.js +175 -0
  222. package/lib/module/networking/xmpp/mamRouter.js.map +1 -0
  223. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +38 -2
  224. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  225. package/lib/module/networking/xmppClient.js +99 -24
  226. package/lib/module/networking/xmppClient.js.map +1 -1
  227. package/lib/module/roomStore/Middleware/newMessageMidlleware.js +29 -34
  228. package/lib/module/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
  229. package/lib/module/roomStore/Middleware/perfMiddleware.js +45 -0
  230. package/lib/module/roomStore/Middleware/perfMiddleware.js.map +1 -0
  231. package/lib/module/roomStore/Middleware/reactionsMiddleware.js +66 -43
  232. package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
  233. package/lib/module/roomStore/Middleware/unreadMidlleware.js +89 -69
  234. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  235. package/lib/module/roomStore/index.js +19 -15
  236. package/lib/module/roomStore/index.js.map +1 -1
  237. package/lib/module/roomStore/persistBackend.js +89 -0
  238. package/lib/module/roomStore/persistBackend.js.map +1 -0
  239. package/lib/module/roomStore/persistence.js +245 -48
  240. package/lib/module/roomStore/persistence.js.map +1 -1
  241. package/lib/module/roomStore/roomsSlice.js +275 -134
  242. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  243. package/lib/module/theme/theme.js +3 -0
  244. package/lib/module/theme/theme.js.map +1 -1
  245. package/lib/module/utils/devLogger.js +13 -0
  246. package/lib/module/utils/devLogger.js.map +1 -1
  247. package/lib/module/version.js +1 -1
  248. package/lib/typescript/assets/emojiData.d.ts +8 -0
  249. package/lib/typescript/assets/emojiData.d.ts.map +1 -0
  250. package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
  251. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  252. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  253. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  254. package/lib/typescript/components/MainComponents/KeyboardInputDock.d.ts +16 -0
  255. package/lib/typescript/components/MainComponents/KeyboardInputDock.d.ts.map +1 -0
  256. package/lib/typescript/components/MainComponents/MessageContainer.d.ts +2 -2
  257. package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
  258. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  259. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  260. package/lib/typescript/components/MainComponents/RoomStack.d.ts +42 -0
  261. package/lib/typescript/components/MainComponents/RoomStack.d.ts.map +1 -0
  262. package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
  263. package/lib/typescript/components/MessageBubble/Avatar.d.ts +2 -0
  264. package/lib/typescript/components/MessageBubble/Avatar.d.ts.map +1 -1
  265. package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
  266. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts +11 -0
  267. package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts.map +1 -0
  268. package/lib/typescript/components/MessageBubble/Message.d.ts +2 -2
  269. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  270. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +2 -0
  271. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  272. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts +1 -0
  273. package/lib/typescript/components/MessageBubble/MessageReaction.d.ts.map +1 -1
  274. package/lib/typescript/components/MessageBubble/MessageReply.d.ts +7 -7
  275. package/lib/typescript/components/MessageBubble/MessageReply.d.ts.map +1 -1
  276. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  277. package/lib/typescript/components/Modals/Modal/Modal.d.ts.map +1 -1
  278. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts +16 -0
  279. package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts.map +1 -0
  280. package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts.map +1 -1
  281. package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
  282. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts +2 -2
  283. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  284. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts +3 -6
  285. package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts.map +1 -1
  286. package/lib/typescript/components/Thread/ThreadWrapper.d.ts +7 -1
  287. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  288. package/lib/typescript/components/styled/DateLabel.d.ts +1 -0
  289. package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
  290. package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
  291. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  292. package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
  293. package/lib/typescript/helpers/emoji.d.ts +6 -0
  294. package/lib/typescript/helpers/emoji.d.ts.map +1 -0
  295. package/lib/typescript/helpers/haptics.d.ts +3 -0
  296. package/lib/typescript/helpers/haptics.d.ts.map +1 -0
  297. package/lib/typescript/helpers/historyPreloadScheduler.d.ts +1 -0
  298. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  299. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  300. package/lib/typescript/helpers/keyboardLayout.d.ts +6 -0
  301. package/lib/typescript/helpers/keyboardLayout.d.ts.map +1 -1
  302. package/lib/typescript/helpers/mamReactions.d.ts +13 -0
  303. package/lib/typescript/helpers/mamReactions.d.ts.map +1 -0
  304. package/lib/typescript/helpers/parseMessageReference.d.ts +16 -0
  305. package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -0
  306. package/lib/typescript/helpers/reactionsConfig.d.ts +5 -0
  307. package/lib/typescript/helpers/reactionsConfig.d.ts.map +1 -0
  308. package/lib/typescript/helpers/updateMessagesTillLast.d.ts.map +1 -1
  309. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  310. package/lib/typescript/hooks/useMessageHeapState.d.ts.map +1 -1
  311. package/lib/typescript/hooks/useRoomInitialization.d.ts +2 -2
  312. package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
  313. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  314. package/lib/typescript/networking/stanzaHandlers.d.ts +4 -2
  315. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  316. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +3 -1
  317. package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
  318. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  319. package/lib/typescript/networking/xmpp/mamRouter.d.ts +23 -0
  320. package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -0
  321. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +1 -0
  322. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  323. package/lib/typescript/networking/xmppClient.d.ts +22 -1
  324. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  325. package/lib/typescript/roomStore/Middleware/newMessageMidlleware.d.ts.map +1 -1
  326. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts +4 -0
  327. package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts.map +1 -0
  328. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts +9 -0
  329. package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
  330. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  331. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  332. package/lib/typescript/roomStore/persistBackend.d.ts +11 -0
  333. package/lib/typescript/roomStore/persistBackend.d.ts.map +1 -0
  334. package/lib/typescript/roomStore/persistence.d.ts +5 -6
  335. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  336. package/lib/typescript/roomStore/roomsSlice.d.ts +41 -1
  337. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  338. package/lib/typescript/theme/theme.d.ts +4 -1
  339. package/lib/typescript/theme/theme.d.ts.map +1 -1
  340. package/lib/typescript/types/models/message.model.d.ts +4 -0
  341. package/lib/typescript/types/models/message.model.d.ts.map +1 -1
  342. package/lib/typescript/types/models/room.model.d.ts +16 -0
  343. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  344. package/lib/typescript/types/models/xmpp.model.d.ts +6 -1
  345. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  346. package/lib/typescript/types/types.d.ts +15 -3
  347. package/lib/typescript/types/types.d.ts.map +1 -1
  348. package/lib/typescript/utils/devLogger.d.ts +8 -0
  349. package/lib/typescript/utils/devLogger.d.ts.map +1 -1
  350. package/lib/typescript/version.d.ts +1 -1
  351. package/package.json +10 -1
  352. package/src/assets/emojiData.ts +2146 -0
  353. package/src/assets/icons.tsx +5 -5
  354. package/src/components/Header/HeaderRoomList.tsx +7 -5
  355. package/src/components/MainComponents/ChatHeader.tsx +16 -7
  356. package/src/components/MainComponents/ChatRoom.tsx +64 -32
  357. package/src/components/MainComponents/ChatWrapper.tsx +73 -21
  358. package/src/components/MainComponents/KeyboardInputDock.tsx +47 -0
  359. package/src/components/MainComponents/MessageContainer.tsx +7 -15
  360. package/src/components/MainComponents/MessageList.tsx +96 -43
  361. package/src/components/MainComponents/RoomList.tsx +28 -29
  362. package/src/components/MainComponents/RoomStack.tsx +309 -0
  363. package/src/components/MainComponents/SystemMessage.tsx +6 -2
  364. package/src/components/MessageBubble/Avatar.tsx +7 -1
  365. package/src/components/MessageBubble/BottomReplyContainer.tsx +19 -21
  366. package/src/components/MessageBubble/EmojiPickerSheet.tsx +468 -0
  367. package/src/components/MessageBubble/Message.tsx +146 -87
  368. package/src/components/MessageBubble/MessageInteractions.tsx +213 -12
  369. package/src/components/MessageBubble/MessageReaction.tsx +120 -96
  370. package/src/components/MessageBubble/MessageReply.tsx +65 -32
  371. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +4 -0
  372. package/src/components/Modals/Modal/Modal.tsx +32 -1
  373. package/src/components/Modals/Modal/SwipeBackLayer.tsx +221 -0
  374. package/src/components/Modals/ProfileHeader/ProfileHeader.tsx +29 -8
  375. package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +6 -3
  376. package/src/components/RoomComponents/ChatRoomItem.tsx +11 -4
  377. package/src/components/RoomComponents/styled/LastMessageEmoji.tsx +7 -8
  378. package/src/components/Thread/ThreadWrapper.tsx +274 -198
  379. package/src/components/styled/DateLabel.tsx +7 -3
  380. package/src/context/MessageNotificationContext.tsx +205 -7
  381. package/src/context/xmppProvider.tsx +29 -9
  382. package/src/helpers/createRoomFromApi.tsx +37 -1
  383. package/src/helpers/emoji.ts +39 -0
  384. package/src/helpers/haptics.ts +19 -0
  385. package/src/helpers/historyPreloadScheduler.ts +37 -69
  386. package/src/helpers/insertMessageWithDelimiter.ts +23 -16
  387. package/src/helpers/keyboardLayout.ts +26 -0
  388. package/src/helpers/mamReactions.ts +59 -0
  389. package/src/helpers/parseMessageReference.ts +38 -0
  390. package/src/helpers/reactionsConfig.ts +13 -0
  391. package/src/helpers/updateMessagesTillLast.tsx +14 -2
  392. package/src/hooks/useHeapSender.tsx +3 -2
  393. package/src/hooks/useMessageHeapState.tsx +6 -2
  394. package/src/hooks/useRoomInitialization.tsx +32 -15
  395. package/src/hooks/useSendMessage.tsx +18 -11
  396. package/src/hooks/useUnreadMessagesCounter.ts +1 -1
  397. package/src/networking/stanzaHandlers.ts +116 -60
  398. package/src/networking/xmpp/getHistory.xmpp.ts +44 -106
  399. package/src/networking/xmpp/handleStanzas.xmpp.ts +2 -0
  400. package/src/networking/xmpp/mamRouter.ts +176 -0
  401. package/src/networking/xmpp/presenceInRoom.xmpp.ts +46 -3
  402. package/src/networking/xmppClient.ts +105 -20
  403. package/src/roomStore/Middleware/newMessageMidlleware.tsx +35 -38
  404. package/src/roomStore/Middleware/perfMiddleware.ts +50 -0
  405. package/src/roomStore/Middleware/reactionsMiddleware.tsx +53 -52
  406. package/src/roomStore/Middleware/unreadMidlleware.tsx +92 -80
  407. package/src/roomStore/index.ts +28 -27
  408. package/src/roomStore/persistBackend.ts +96 -0
  409. package/src/roomStore/persistence.ts +280 -73
  410. package/src/roomStore/roomsSlice.ts +304 -155
  411. package/src/theme/theme.ts +10 -1
  412. package/src/types/models/message.model.ts +4 -0
  413. package/src/types/models/room.model.ts +17 -0
  414. package/src/types/models/xmpp.model.ts +4 -2
  415. package/src/types/types.ts +15 -3
  416. package/src/utils/devLogger.ts +16 -0
  417. package/src/version.ts +1 -1
@@ -1,5 +1,4 @@
1
1
  import { IMessage } from '../types/types';
2
- import { isDateAfter, isDateBefore } from './dateComparison';
3
2
  import { msgSortableMs } from './msgSortableMs';
4
3
 
5
4
  // Robustly resolve a caller-supplied read marker to epoch milliseconds.
@@ -90,17 +89,29 @@ export function insertMessageWithDelimiter(
90
89
  return;
91
90
  }
92
91
 
93
- const newMessageDate = message.date;
94
92
  const lastMessage = roomMessages[roomMessages.length - 1];
95
- const firstMessage = roomMessages[0];
93
+ // Ordered by the id-encoded server timestamp (msgSortableMs), the same
94
+ // key the list and the unread logic use. The old `date` string compare
95
+ // had a hole: a message neither strictly after the last one nor
96
+ // strictly before the first (same second, or an unparseable date) fell
97
+ // through every branch and was silently DROPPED.
98
+ const newMs = msgSortableMs(message);
99
+ const lastMs = lastMessage ? msgSortableMs(lastMessage) : 0;
96
100
 
97
- if (isDateAfter(newMessageDate.toString(), lastMessage?.date?.toString() ?? '')) {
101
+ if (!lastMessage || !newMs || newMs >= lastMs) {
98
102
  const index = roomMessages.findIndex(
99
103
  (msg) => msg.id === message.xmppId || msg.id === message.id
100
104
  );
101
105
 
102
106
  if (index !== -1) {
103
- roomMessages[index] = { ...message, id: message.id, pending: false };
107
+ // Keep an open thread open when its parent is replaced by the echo.
108
+ const keepThread = (roomMessages[index] as any)?.activeMessage;
109
+ roomMessages[index] = {
110
+ ...message,
111
+ id: message.id,
112
+ pending: false,
113
+ ...(keepThread ? { activeMessage: true } : {}),
114
+ };
104
115
  } else {
105
116
  roomMessages.push(message);
106
117
  }
@@ -153,18 +164,14 @@ export function insertMessageWithDelimiter(
153
164
  });
154
165
  }
155
166
  }
156
- } else if (
157
- isDateBefore(newMessageDate.toString(), firstMessage?.date?.toString() ?? '')
158
- ) {
159
- roomMessages.unshift(message);
160
167
  } else {
161
- for (let i = 0; i < roomMessages.length; i++) {
162
- if (
163
- isDateBefore(newMessageDate.toString(), roomMessages[i].date?.toString() ?? '')
164
- ) {
165
- roomMessages.splice(i, 0, message);
166
- break;
167
- }
168
+ // Before the first message strictly newer than it; equal keys keep
169
+ // arrival order.
170
+ const at = roomMessages.findIndex((msg) => msgSortableMs(msg) > newMs);
171
+ if (at === -1) {
172
+ roomMessages.push(message);
173
+ } else {
174
+ roomMessages.splice(at, 0, message);
168
175
  }
169
176
  }
170
177
  }
@@ -6,6 +6,9 @@ type KeyboardLayoutArgs = {
6
6
  };
7
7
 
8
8
  export const ANDROID_INPUT_DOCK_GAP = 12;
9
+ // Bottom padding the dock keeps while the iOS keyboard is open, so the
10
+ // composer is glued to the keyboard without touching its edge.
11
+ export const IOS_KEYBOARD_DOCK_GAP = 4;
9
12
 
10
13
  export const getKeyboardVerticalOffset = ({
11
14
  platform,
@@ -14,6 +17,29 @@ export const getKeyboardVerticalOffset = ({
14
17
  }: KeyboardLayoutArgs): number =>
15
18
  configuredOffset + (platform === 'ios' ? bottomInset : 0);
16
19
 
20
+ // Offset for the KeyboardAvoidingView strategy. Unlike KeyboardStickyView
21
+ // (where a positive `opened` offset pushes the dock DOWN into the keyboard),
22
+ // a positive value here ADDS bottom padding above the keyboard — so the
23
+ // safe-area inset must not be added: the avoiding view already ends exactly
24
+ // at the keyboard's top edge.
25
+ export const getKeyboardAvoidingOffset = ({
26
+ configuredOffset = 0,
27
+ }: Pick<KeyboardLayoutArgs, 'configuredOffset'>): number => configuredOffset;
28
+
29
+ // Dock bottom padding while the keyboard is open (KeyboardAvoidingView
30
+ // strategy). On iOS the safe-area padding collapses to a small gap; Android
31
+ // keeps its fixed gap.
32
+ export const getInputDockKeyboardPadding = ({
33
+ platform,
34
+ inputDockPaddingBottom,
35
+ }: {
36
+ platform: string;
37
+ inputDockPaddingBottom: number;
38
+ }): number =>
39
+ platform === 'ios'
40
+ ? Math.min(inputDockPaddingBottom, IOS_KEYBOARD_DOCK_GAP)
41
+ : inputDockPaddingBottom;
42
+
17
43
  type InputDockPaddingArgs = Omit<KeyboardLayoutArgs, 'configuredOffset'> & {
18
44
  // Explicit `inputDockPaddingBottom` config value, verbatim on both
19
45
  // platforms when provided (0 allowed). Takes priority over every other
@@ -0,0 +1,59 @@
1
+ import { IMessage } from '../types/models/message.model';
2
+ import { applyReactionToMessage, compareStanzaIds } from '../roomStore/roomsSlice';
3
+
4
+ export interface ExtractedReaction {
5
+ messageId: string;
6
+ from: string;
7
+ emoji: string[];
8
+ data: Record<string, string>;
9
+ roomJID: string;
10
+ /** Server stanza id (microsecond timestamp) — orders reactions. */
11
+ ts?: string;
12
+ }
13
+
14
+ export const extractReaction = (
15
+ msg: any,
16
+ fallbackRoomJID?: string,
17
+ archiveId?: string
18
+ ): ExtractedReaction | null => {
19
+ const reactionsEl = msg?.getChild?.('reactions');
20
+ if (!reactionsEl) {return null;}
21
+ const messageId = reactionsEl.attrs?.id;
22
+ const from = String(reactionsEl.attrs?.from || '');
23
+ if (!messageId || !from.split('@')[0]) {return null;}
24
+ const emoji: string[] = (reactionsEl.getChildren?.('reaction') || [])
25
+ .map((reaction: any) => (reaction.text ? reaction.text() : ''))
26
+ .filter(Boolean);
27
+ const data = (msg.getChild?.('data')?.attrs || {}) as Record<string, string>;
28
+ const stanzaId = msg.getChild?.('stanza-id');
29
+ const roomJID = String(
30
+ stanzaId?.attrs?.by || fallbackRoomJID || msg.attrs?.from || ''
31
+ ).split('/')[0];
32
+ const rawTs = String(archiveId || stanzaId?.attrs?.id || '');
33
+ const ts = /^\d+$/.test(rawTs) ? rawTs : undefined;
34
+ return { messageId, from, emoji, data, roomJID, ...(ts ? { ts } : {}) };
35
+ };
36
+
37
+ export const applyMamReactions = (
38
+ messages: IMessage[],
39
+ reactions: ExtractedReaction[]
40
+ ): ExtractedReaction[] => {
41
+ const byId = new Map<string, IMessage>();
42
+ for (const message of messages) {
43
+ if (message?.id) {byId.set(String(message.id), message);}
44
+ }
45
+ const deferred: ExtractedReaction[] = [];
46
+ // Oldest first, so the newest state of each reactor wins.
47
+ const ordered = reactions
48
+ .slice()
49
+ .sort((a, b) => (a.ts && b.ts ? compareStanzaIds(a.ts, b.ts) : 0));
50
+ for (const reaction of ordered) {
51
+ const target = byId.get(String(reaction.messageId));
52
+ if (target) {
53
+ applyReactionToMessage(target, reaction.from, reaction.emoji, reaction.data, reaction.ts);
54
+ } else {
55
+ deferred.push(reaction);
56
+ }
57
+ }
58
+ return deferred;
59
+ };
@@ -0,0 +1,38 @@
1
+ /** The parent a reply points at, read from its `mainMessage` JSON. */
2
+ export interface MessageReference {
3
+ id: string;
4
+ text: string;
5
+ roomJid: string;
6
+ userName?: string;
7
+ }
8
+
9
+ const cache = new WeakMap<object, MessageReference | null>();
10
+
11
+ /**
12
+ * Safe read of `message.mainMessage` (a JSON string on the wire). Null for
13
+ * a missing or malformed value — a bad payload must not crash a bubble.
14
+ * Cached per message object.
15
+ */
16
+ export const parseMessageReference = (message: {
17
+ mainMessage?: string;
18
+ } | null | undefined): MessageReference | null => {
19
+ if (!message?.mainMessage) {return null;}
20
+ const cached = cache.get(message);
21
+ if (cached !== undefined) {return cached;}
22
+ let ref: MessageReference | null = null;
23
+ try {
24
+ const parsed = JSON.parse(message.mainMessage);
25
+ if (parsed && parsed.id != null) {
26
+ ref = {
27
+ id: String(parsed.id),
28
+ text: typeof parsed.text === 'string' ? parsed.text : '',
29
+ roomJid: typeof parsed.roomJid === 'string' ? parsed.roomJid : '',
30
+ userName: typeof parsed.userName === 'string' ? parsed.userName : undefined,
31
+ };
32
+ }
33
+ } catch {
34
+ ref = null;
35
+ }
36
+ cache.set(message, ref);
37
+ return ref;
38
+ };
@@ -0,0 +1,13 @@
1
+ import { IConfig } from '../types/types';
2
+ import { DEFAULT_QUICK_REACTIONS } from './emoji';
3
+
4
+ export const reactionsEnabled = (config?: IConfig | null): boolean =>
5
+ !config?.disableReactions && config?.reactions?.enabled !== false;
6
+
7
+ export const quickReactionIds = (config?: IConfig | null): string[] => {
8
+ const ids = config?.reactions?.quickReactions;
9
+ return Array.isArray(ids) && ids.length ? ids.slice(0, 8) : DEFAULT_QUICK_REACTIONS;
10
+ };
11
+
12
+ export const reactionPickerEnabled = (config?: IConfig | null): boolean =>
13
+ reactionsEnabled(config) && config?.reactions?.picker !== false;
@@ -31,10 +31,20 @@ export const updateMessagesTillLast = async (
31
31
  processedIndex + batchSize
32
32
  );
33
33
 
34
+
34
35
  const lastTimestampsByJid = currentBatch.reduce(
35
36
  (acc: Record<string, number>, current: string) => {
36
37
  const room = (store.getState() as any).rooms?.rooms?.[current];
37
- acc[current] = Number(room?.lastMessageTimestamp ?? 0) || 0;
38
+ const cached: IMessage[] = Array.isArray(room?.messages)
39
+ ? room.messages
40
+ : [];
41
+ let newest = 0;
42
+ for (const m of cached) {
43
+ if (!m || m.pending || m.id === 'delimiter-new') {continue;}
44
+ const id = Number(m.id);
45
+ if (Number.isFinite(id) && id > newest) {newest = id;}
46
+ }
47
+ acc[current] = newest;
38
48
  return acc;
39
49
  },
40
50
  {} as Record<string, number>
@@ -59,7 +69,9 @@ export const updateMessagesTillLast = async (
59
69
  const fetchedMessages = await client.getHistoryStanza(
60
70
  jid,
61
71
  messagesPerFetch,
62
- Number(lastMessageId)
72
+ Number(lastMessageId),
73
+ undefined,
74
+ { coalesceRoom: true, source: 'background', selfApplied: true }
63
75
  );
64
76
 
65
77
  if (!fetchedMessages.length) {break;}
@@ -50,8 +50,9 @@ export const useHeapSender = (client: XmppClient | null) => {
50
50
  msg.user.walletAddress || '',
51
51
  msg.body,
52
52
  '',
53
- !!msg.isReply,
54
- !!msg.showInChannel,
53
+ // Wire values are strings: '"false"' is truthy.
54
+ String(msg.isReply) === 'true',
55
+ String(msg.showInChannel) === 'true',
55
56
  msg.mainMessage,
56
57
  msg.id
57
58
  );
@@ -1,3 +1,4 @@
1
+ import { useMemo } from 'react';
1
2
  import { useSelector } from 'react-redux';
2
3
  import { RootState } from '../roomStore';
3
4
 
@@ -8,8 +9,11 @@ export const useMessageHeapState = () => {
8
9
  const failedMessages = useSelector(
9
10
  (state: RootState) => state.roomHeapSlice?.failedMessages
10
11
  );
11
- const idSet = new Set(queue?.map((m) => m.id) ?? []);
12
- const failedIdSet = new Set(Object.keys(failedMessages || {}));
12
+ const idSet = useMemo(() => new Set(queue?.map((m) => m.id) ?? []), [queue]);
13
+ const failedIdSet = useMemo(
14
+ () => new Set(Object.keys(failedMessages || {})),
15
+ [failedMessages]
16
+ );
13
17
 
14
18
  return { queue, idSet, failedMessages, failedIdSet };
15
19
  };
@@ -2,8 +2,9 @@ import { useEffect } from 'react';
2
2
  import { setIsLoading } from '../roomStore/roomsSlice';
3
3
  import { useXmppClient } from '../context/xmppProvider';
4
4
  import { IConfig, IMessage, IRoom } from '../types/types';
5
- import { useDispatch } from 'react-redux';
5
+ import { useDispatch, useSelector, useStore } from 'react-redux';
6
6
  import useGetNewArchRoom from './useGetNewArchRoom';
7
+ import type { RootState } from '../roomStore';
7
8
 
8
9
  const countUndefinedText = (arr: IMessage[]) =>
9
10
  (Array.isArray(arr) ? arr : []).filter(
@@ -21,14 +22,32 @@ const hasLoadedRoomHistory = (room?: IRoom): boolean => {
21
22
  );
22
23
  };
23
24
 
25
+ const defaultRoomJids = (config: IConfig): string[] =>
26
+ (config?.defaultRooms || []).map((room: any) =>
27
+ typeof room === 'string' ? room : room?.jid
28
+ );
29
+
24
30
  export const useRoomInitialization = (
25
31
  activeRoomJID: string,
26
- roomsList: Record<string, IRoom>,
27
- config: IConfig,
28
- messageLength: number
32
+ config: IConfig
29
33
  ) => {
30
34
  const { client } = useXmppClient();
31
35
  const dispatch = useDispatch();
36
+ const reduxStore = useStore<RootState>();
37
+
38
+ const hasRooms = useSelector(
39
+ (state: RootState) => Object.keys(state.rooms.rooms || {}).length > 0
40
+ );
41
+ const activeRoomExists = useSelector(
42
+ (state: RootState) => !!activeRoomJID && !!state.rooms.rooms?.[activeRoomJID]
43
+ );
44
+ const activeHistoryLoaded = useSelector((state: RootState) =>
45
+ hasLoadedRoomHistory(state.rooms.rooms?.[activeRoomJID])
46
+ );
47
+ const defaultRoomsMissing = useSelector((state: RootState) => {
48
+ const jids = defaultRoomJids(config);
49
+ return jids.length > 0 && jids.some((jid) => !state.rooms.rooms?.[jid]);
50
+ });
32
51
 
33
52
  const syncRooms = useGetNewArchRoom();
34
53
 
@@ -59,9 +78,8 @@ export const useRoomInitialization = (
59
78
  }, [client, activeRoomJID]);
60
79
 
61
80
  useEffect(() => {
62
- const activeRoom = roomsList?.[activeRoomJID];
63
- const shouldLoadActiveHistory =
64
- !!activeRoomJID && !hasLoadedRoomHistory(activeRoom);
81
+ const roomsList = reduxStore.getState().rooms.rooms || {};
82
+ const shouldLoadActiveHistory = !!activeRoomJID && !activeHistoryLoaded;
65
83
 
66
84
  const getDefaultHistory = async () => {
67
85
  if (!client || !activeRoomJID) {return;}
@@ -129,7 +147,7 @@ export const useRoomInitialization = (
129
147
  // real, non-pending message in the room counts as "loaded").
130
148
  dispatch(setIsLoading({ loading: true, chatJID: activeRoomJID }));
131
149
  getDefaultHistory();
132
- } else {
150
+ } else if (roomsList?.[activeRoomJID]?.isLoading) {
133
151
  dispatch(setIsLoading({ loading: false, chatJID: activeRoomJID }));
134
152
  }
135
153
  } else if (!roomsList?.[activeRoomJID]) {
@@ -137,10 +155,7 @@ export const useRoomInitialization = (
137
155
  }
138
156
 
139
157
  if (client && config?.defaultRooms) {
140
- const allExist = config?.defaultRooms.every(
141
- (room) => roomsList[typeof room === 'string' ? room : room.jid] !== undefined
142
- );
143
- if (roomsList && !allExist) {
158
+ if (defaultRoomsMissing) {
144
159
  config?.defaultRooms.map(async (room) => {
145
160
  client.presenceInRoomStanza(typeof room === 'string' ? room : room.jid);
146
161
  });
@@ -151,10 +166,12 @@ export const useRoomInitialization = (
151
166
  }
152
167
  }
153
168
  }
169
+ // eslint-disable-next-line react-hooks/exhaustive-deps
154
170
  }, [
155
171
  activeRoomJID,
156
- Object.keys(roomsList).length,
157
- messageLength,
158
- roomsList?.[activeRoomJID]?.messages?.length,
172
+ hasRooms,
173
+ activeRoomExists,
174
+ activeHistoryLoaded,
175
+ defaultRoomsMissing,
159
176
  ]);
160
177
  };
@@ -79,7 +79,6 @@ export const useSendMessage = (_configOverride?: IConfig) => {
79
79
  (state: RootState) => state.chatSettingStore.langSource
80
80
  );
81
81
  const editAction = useSelector((state: RootState) => state.rooms.editAction);
82
- const rooms = useSelector((state: RootState) => state.rooms.rooms);
83
82
 
84
83
  const {
85
84
  handleMessageSent,
@@ -88,10 +87,6 @@ export const useSendMessage = (_configOverride?: IConfig) => {
88
87
  handleMessageRetry,
89
88
  } = useEventHandlers(config);
90
89
 
91
- const failedMessages = useSelector(
92
- (state: RootState) => state.roomHeapSlice?.failedMessages || {}
93
- );
94
-
95
90
  const sendMessage = useCallback(
96
91
  async (
97
92
  message: string,
@@ -162,6 +157,16 @@ export const useSendMessage = (_configOverride?: IConfig) => {
162
157
  // manual-mode readers see the Translate link on it too (parity with
163
158
  // the web SDK, which stamps langSource on the optimistic message).
164
159
  langSource: (langSource as any) || 'en',
160
+ // Reply fields as the wire carries them (strings), so a thread reply
161
+ // shows in its thread — and NOT in the channel — from the first
162
+ // frame, not only once the server echo lands.
163
+ ...(isReply
164
+ ? {
165
+ isReply: 'true',
166
+ showInChannel: isChecked ? 'true' : 'false',
167
+ mainMessage,
168
+ }
169
+ : {}),
165
170
  user: {
166
171
  ...(user as any),
167
172
  id: selfId,
@@ -423,7 +428,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
423
428
  mimetype: type,
424
429
  originalName: data?.name,
425
430
  size: fileSizeStr,
426
- isReply,
431
+ isReply: isReply ? 'true' : 'false',
427
432
  showInChannel: `${isChecked}`,
428
433
  mainMessage,
429
434
  } as any as IMessage,
@@ -673,7 +678,8 @@ export const useSendMessage = (_configOverride?: IConfig) => {
673
678
  // it. No-op when the id isn't in the failed map.
674
679
  const retryMessage = useCallback(
675
680
  async (failedId: string) => {
676
- const payload = failedMessages[failedId];
681
+ const payload =
682
+ reduxStore.getState().roomHeapSlice?.failedMessages?.[failedId];
677
683
  if (!payload) {return;}
678
684
 
679
685
  // The server may have accepted the original send even though its
@@ -681,7 +687,8 @@ export const useSendMessage = (_configOverride?: IConfig) => {
681
687
  // failed, but a confirmed (non-pending) copy is already sitting in
682
688
  // the room. Resending here would deliver a genuine duplicate; just
683
689
  // clear the failure and let the existing copy stand.
684
- const roomMsgs = rooms?.[payload.roomJID]?.messages || [];
690
+ const roomMsgs =
691
+ reduxStore.getState().rooms?.rooms?.[payload.roomJID]?.messages || [];
685
692
  const alreadyDelivered = roomMsgs.some(
686
693
  (m: any) =>
687
694
  !m.pending && (m.id === failedId || m.xmppId === failedId)
@@ -720,7 +727,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
720
727
  );
721
728
  }
722
729
  },
723
- [failedMessages, rooms, dispatch, handleMessageRetry, sendMessage, sendMedia]
730
+ [reduxStore, dispatch, handleMessageRetry, sendMessage, sendMedia]
724
731
  );
725
732
 
726
733
  // ChatRoom/ThreadWrapper consume this as the "edit branch" of send.
@@ -762,7 +769,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
762
769
  const isLastMessageFromUserAndProcessing = useCallback(
763
770
  (roomJID: string): boolean => {
764
771
  if (!roomJID) {return false;}
765
- const msgs = rooms?.[roomJID]?.messages;
772
+ const msgs = reduxStore.getState().rooms?.rooms?.[roomJID]?.messages;
766
773
  if (!msgs || msgs.length === 0) {return false;}
767
774
  const last = msgs[msgs.length - 1];
768
775
  if (!last?.pending) {return false;}
@@ -770,7 +777,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
770
777
  if (!selfId) {return false;}
771
778
  return last.user?.id === selfId;
772
779
  },
773
- [rooms, user?.xmppUsername, user?.walletAddress]
780
+ [reduxStore, user?.xmppUsername, user?.walletAddress]
774
781
  );
775
782
 
776
783
  return {
@@ -49,7 +49,7 @@ export const useUnreadMessagesCounter = (): UnreadMessagesStats => {
49
49
  unreadByRoom[roomJid] = unreadCount;
50
50
  totalCount += unreadCount;
51
51
  }
52
- if ((room as any)?.unreadCapped) {
52
+ if ((room as any)?.unreadCapped && unreadCount >= 10) {
53
53
  isCapped = true;
54
54
  }
55
55
  });