@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,8 +1,11 @@
1
- import AsyncStorage from '@react-native-async-storage/async-storage';
2
1
  import { Middleware } from '@reduxjs/toolkit';
3
2
  import { IMessage, IRoom, User } from '../types/types';
4
- import { encryptForPersist, decryptFromPersist } from '../helpers/persistCrypto';
5
3
  import type { FailedMessagePayload } from './roomHeapSlice';
4
+ import {
5
+ getPersistBackend,
6
+ legacyAsyncStorageBackend,
7
+ type PersistBackend,
8
+ } from './persistBackend';
6
9
 
7
10
  // -------------------------------------------------------------------
8
11
  // Lightweight RN persistence layer. Mirrors what redux-persist gives
@@ -11,17 +14,21 @@ import type { FailedMessagePayload } from './roomHeapSlice';
11
14
  // - persist chatSettingStore.user (sanitized) and rooms state
12
15
  // - blacklist transient fields (modals, activeRoomJID, etc.)
13
16
  // - cap each room's messages to the most recent MESSAGE_LIMIT (100)
14
- // - debounced writes (200ms) on relevant action types
17
+ // - debounced writes (1 s, at most 4 s apart) of the rooms that changed
15
18
  //
16
- // AES-256-CBC at rest (see `helpers/persistCrypto.ts`): the JSON blob
17
- // under each key below is encrypted before it reaches AsyncStorage, with
18
- // the symmetric key held in the platform Keychain/Keystore. `user` here
19
- // is already secret-free (see `sanitizeUser`) — the encryption is for
20
- // the message bodies in `rooms`, which aren't.
19
+ // Encrypted at rest either way (see `persistBackend.ts`): natively by
20
+ // MMKV when the host ships it, otherwise AES-256-CBC through crypto-js
21
+ // into AsyncStorage. `user` here is already secret-free (see
22
+ // `sanitizeUser`) — the encryption is for the message bodies in `rooms`,
23
+ // which aren't.
21
24
  // -------------------------------------------------------------------
22
25
 
26
+ const PERSIST_PREFIX = '@ethora/persist:';
23
27
  const KEY_CHAT = '@ethora/persist:chatSettingStore';
24
28
  const KEY_ROOMS = '@ethora/persist:rooms';
29
+ const KEY_ROOM_INDEX = '@ethora/persist:roomIndex';
30
+ const KEY_ROOM_PREFIX = '@ethora/persist:room:';
31
+ const roomKey = (jid: string) => `${KEY_ROOM_PREFIX}${jid}`;
25
32
  // bug #39: a failed send needs to survive a relaunch as "failed / tap
26
33
  // to retry", not silently render as delivered. `roomHeapStore.failedMessages`
27
34
  // is the map the bubble reads (`isFailed = failedMessages[id]`, see
@@ -372,11 +379,159 @@ export function computeBootTimeFailures(
372
379
  return out;
373
380
  }
374
381
 
382
+ type RoomTouch = (payload: any) => string[] | 'all';
383
+ const asList = (v: unknown): string[] =>
384
+ typeof v === 'string' && v ? [v] : [];
385
+
386
+ const ROOM_ACTIONS: Record<string, RoomTouch> = {
387
+ 'roomMessages/addRoom': (p) => asList(p?.roomData?.jid),
388
+ 'roomMessages/addRooms': (p) =>
389
+ Array.isArray(p?.rooms) ? p.rooms.map((r: any) => r?.jid).filter(Boolean) : 'all',
390
+ 'roomMessages/addRoomFromApi': (p) => asList(p?.room?.jid),
391
+ 'roomMessages/deleteRoom': (p) => asList(p?.jid),
392
+ 'roomMessages/updateRoom': (p) => asList(p?.jid),
393
+ 'roomMessages/setRoomMessages': (p) => asList(p?.roomJID),
394
+ 'roomMessages/deleteRoomMessage': (p) => asList(p?.roomJID),
395
+ 'roomMessages/editRoomMessage': (p) => asList(p?.roomJID),
396
+ 'roomMessages/addRoomMessage': (p) => asList(p?.roomJID),
397
+ 'roomMessages/addRoomMessages': (p) => asList(p?.roomJID),
398
+ 'roomMessages/setReactions': (p) => asList(p?.roomJID),
399
+ 'roomMessages/setLastViewedTimestamp': (p) => asList(p?.chatJID),
400
+ 'roomMessages/setRoomRole': (p) => asList(p?.chatJID),
401
+ 'roomMessages/setRoomNoMessages': (p) => asList(p?.chatJID),
402
+ 'roomMessages/setUnreadCounts': (p) =>
403
+ p && typeof p === 'object' ? Object.keys(p) : 'all',
404
+ 'roomMessages/applyRoomsPreloadBatch': (p) =>
405
+ Array.isArray(p?.rooms) ? p.rooms.map((r: any) => r?.jid).filter(Boolean) : 'all',
406
+ 'roomMessages/applyPrivateStoreMarkers': () => 'all',
407
+ 'roomMessages/deleteAllRooms': () => 'all',
408
+ 'roomMessages/setLogoutState': () => 'all',
409
+ };
410
+
411
+ const TRANSIENT_ROOM_ACTIONS = new Set([
412
+ 'roomMessages/setComposing',
413
+ 'roomMessages/setIsLoading',
414
+ 'roomMessages/setUnreadSyncing',
415
+ 'roomMessages/setCurrentRoom',
416
+ 'roomMessages/setVisibleRoom',
417
+ 'roomMessages/clearVisibleRoom',
418
+ 'roomMessages/setPendingNotificationJid',
419
+ 'roomMessages/clearPendingNotificationJid',
420
+ 'roomMessages/setActiveMessage',
421
+ 'roomMessages/setCloseActiveMessage',
422
+ 'roomMessages/setEditAction',
423
+ 'roomMessages/setReadBoundary',
424
+ 'roomMessages/clearReadBoundary',
425
+ 'roomMessages/setLoadingText',
426
+ 'roomMessages/mergeUsersSet',
427
+ ]);
428
+
429
+ const roomsTouchedBy = (action: any): string[] | 'all' | null => {
430
+ const type: string = action?.type || '';
431
+ const touch = ROOM_ACTIONS[type];
432
+ if (touch) {return touch(action?.payload);}
433
+ if (!type.startsWith('roomMessages/')) {return null;}
434
+ if (TRANSIENT_ROOM_ACTIONS.has(type)) {return null;}
435
+ return 'all';
436
+ };
437
+
438
+ const DEBOUNCE_MS = 1000;
439
+ const MAX_WAIT_MS = 4000;
440
+
375
441
  let writeTimer: ReturnType<typeof setTimeout> | null = null;
442
+ let firstPendingAt = 0;
443
+ let dirtyRooms = new Set<string>();
444
+ let allRoomsDirty = false;
445
+ let chatDirty = false;
446
+ let heapDirty = false;
447
+ let knownRoomJids = new Set<string>();
448
+ let legacyBlobPresent = false;
449
+ let migrateFromAsyncStorage = false;
450
+ let writeChain: Promise<void> = Promise.resolve();
451
+
452
+ const schedule = (flush: () => void) => {
453
+ const now = Date.now();
454
+ if (!firstPendingAt) {firstPendingAt = now;}
455
+ if (writeTimer) {clearTimeout(writeTimer);}
456
+ const remaining = Math.max(0, firstPendingAt + MAX_WAIT_MS - now);
457
+ writeTimer = setTimeout(flush, Math.min(DEBOUNCE_MS, remaining));
458
+ };
459
+
460
+ const persistedRoom = (jid: string, room: IRoom | undefined) => {
461
+ const clean = sanitizeRooms(room ? { [jid]: room } : {});
462
+ return clean[jid];
463
+ };
464
+
465
+ async function writePending(getState: () => any): Promise<void> {
466
+ const backend = await getPersistBackend();
467
+ const rooms = dirtyRooms;
468
+ const all = allRoomsDirty;
469
+ const writeChat = chatDirty;
470
+ const writeHeap = heapDirty;
471
+ dirtyRooms = new Set();
472
+ allRoomsDirty = false;
473
+ chatDirty = false;
474
+ heapDirty = false;
475
+
476
+ const state = getState();
477
+ const sets: [string, string][] = [];
478
+ const removes: string[] = [];
479
+
480
+ if (writeChat) {
481
+ const chatPayload: PersistedChatState = {
482
+ user: sanitizeUser(state.chatSettingStore?.user) as User,
483
+ };
484
+ sets.push([KEY_CHAT, JSON.stringify(chatPayload)]);
485
+ }
486
+ if (writeHeap) {
487
+ const heapPayload: PersistedHeapState = {
488
+ failedMessages: sanitizeFailedMessages(
489
+ state.roomHeapSlice?.failedMessages
490
+ ),
491
+ };
492
+ sets.push([KEY_HEAP, JSON.stringify(heapPayload)]);
493
+ }
494
+
495
+ const liveRooms: Record<string, IRoom> = state.rooms?.rooms || {};
496
+ const jids = all
497
+ ? new Set<string>([...Object.keys(liveRooms), ...knownRoomJids])
498
+ : rooms;
499
+ const nextKnown = new Set(knownRoomJids);
500
+ for (const jid of jids) {
501
+ const clean = persistedRoom(jid, liveRooms[jid]);
502
+ if (clean) {
503
+ sets.push([roomKey(jid), JSON.stringify(clean)]);
504
+ nextKnown.add(jid);
505
+ } else if (knownRoomJids.has(jid)) {
506
+ removes.push(roomKey(jid));
507
+ nextKnown.delete(jid);
508
+ }
509
+ }
510
+ if (jids.size > 0 || legacyBlobPresent) {
511
+ sets.push([KEY_ROOM_INDEX, JSON.stringify({ jids: [...nextKnown] })]);
512
+ }
513
+ if (legacyBlobPresent) {
514
+ removes.push(KEY_ROOMS);
515
+ legacyBlobPresent = false;
516
+ }
517
+
518
+ if (sets.length) {await backend.setMany(sets);}
519
+ if (removes.length) {await backend.removeMany(removes);}
520
+ knownRoomJids = nextKnown;
521
+
522
+ if (migrateFromAsyncStorage && backend.name === 'mmkv') {
523
+ migrateFromAsyncStorage = false;
524
+ const old = (await legacyAsyncStorageBackend.allKeys()).filter((k) =>
525
+ k.startsWith(PERSIST_PREFIX)
526
+ );
527
+ if (old.length) {await legacyAsyncStorageBackend.removeMany(old);}
528
+ }
529
+ }
376
530
 
377
531
  /**
378
532
  * Middleware that debounces writes of the persisted slices to AsyncStorage.
379
- * Only triggers on actions that actually mutate persisted state.
533
+ * Only the slices — and only the rooms — an action actually changed are
534
+ * written.
380
535
  */
381
536
  export const persistenceMiddleware: Middleware = (storeAPI) => (next) => (
382
537
  action: any
@@ -384,48 +539,37 @@ export const persistenceMiddleware: Middleware = (storeAPI) => (next) => (
384
539
  const result = next(action);
385
540
 
386
541
  const type: string = action?.type || '';
387
- if (
388
- !type.startsWith('roomMessages/') &&
389
- !type.startsWith('roomHeapStore/') &&
390
- !type.startsWith('chat/setUser') &&
391
- !type.startsWith('chat/updateUser') &&
392
- !type.startsWith('chat/refreshTokens') &&
393
- !type.startsWith('chat/logout')
542
+ let touched = false;
543
+ if (type.startsWith('roomHeapStore/')) {
544
+ heapDirty = true;
545
+ touched = true;
546
+ } else if (
547
+ type.startsWith('chat/setUser') ||
548
+ type.startsWith('chat/updateUser') ||
549
+ type.startsWith('chat/refreshTokens') ||
550
+ type.startsWith('chat/logout')
394
551
  ) {
395
- return result;
552
+ chatDirty = true;
553
+ touched = true;
554
+ } else {
555
+ const rooms = roomsTouchedBy(action);
556
+ if (rooms === 'all') {
557
+ allRoomsDirty = true;
558
+ touched = true;
559
+ } else if (rooms && rooms.length) {
560
+ for (const jid of rooms) {dirtyRooms.add(jid);}
561
+ touched = true;
562
+ }
396
563
  }
564
+ if (!touched) {return result;}
397
565
 
398
- if (writeTimer) {clearTimeout(writeTimer);}
399
- writeTimer = setTimeout(() => {
400
- (async () => {
401
- try {
402
- const state = storeAPI.getState();
403
- const chatPayload: PersistedChatState = {
404
- user: sanitizeUser(state.chatSettingStore?.user) as User,
405
- };
406
- const roomsPayload: PersistedRoomsState = {
407
- rooms: sanitizeRooms(state.rooms?.rooms || {}),
408
- };
409
- const heapPayload: PersistedHeapState = {
410
- failedMessages: sanitizeFailedMessages(
411
- state.roomHeapSlice?.failedMessages
412
- ),
413
- };
414
- const [chatCipher, roomsCipher, heapCipher] = await Promise.all([
415
- encryptForPersist(JSON.stringify(chatPayload)),
416
- encryptForPersist(JSON.stringify(roomsPayload)),
417
- encryptForPersist(JSON.stringify(heapPayload)),
418
- ]);
419
- await AsyncStorage.multiSet([
420
- [KEY_CHAT, chatCipher],
421
- [KEY_ROOMS, roomsCipher],
422
- [KEY_HEAP, heapCipher],
423
- ]);
424
- } catch (e) {
425
- console.warn('persist write failed', e);
426
- }
427
- })();
428
- }, 200);
566
+ schedule(() => {
567
+ writeTimer = null;
568
+ firstPendingAt = 0;
569
+ writeChain = writeChain
570
+ .then(() => writePending(storeAPI.getState))
571
+ .catch((e) => console.warn('persist write failed', e));
572
+ });
429
573
 
430
574
  return result;
431
575
  };
@@ -435,35 +579,81 @@ export const persistenceMiddleware: Middleware = (storeAPI) => (next) => (
435
579
  * we DON'T hydrate synchronously (AsyncStorage is async) — instead, the
436
580
  * caller dispatches rehydrate actions when the read resolves.
437
581
  */
582
+ async function readFrom(backend: PersistBackend): Promise<{
583
+ chat: PersistedChatState | null;
584
+ rooms: PersistedRoomsState | null;
585
+ heap: PersistedHeapState | null;
586
+ legacyBlob: boolean;
587
+ empty: boolean;
588
+ }> {
589
+ const [chatPlain, indexPlain, legacyPlain, heapPlain] = await backend.getMany([
590
+ KEY_CHAT,
591
+ KEY_ROOM_INDEX,
592
+ KEY_ROOMS,
593
+ KEY_HEAP,
594
+ ]);
595
+
596
+ const parse = <T>(plain: string | null): T | null => {
597
+ if (!plain) {return null;}
598
+ try {
599
+ return JSON.parse(plain) as T;
600
+ } catch {
601
+ return null;
602
+ }
603
+ };
604
+ const chat = parse<PersistedChatState>(chatPlain);
605
+ const heap = parse<PersistedHeapState>(heapPlain);
606
+
607
+ let rooms: PersistedRoomsState | null = null;
608
+ let legacyBlob = false;
609
+ const jids = parse<{ jids?: string[] }>(indexPlain)?.jids || [];
610
+ if (jids.length) {
611
+ const plains = await backend.getMany(jids.map(roomKey));
612
+ const out: Record<string, IRoom> = {};
613
+ plains.forEach((plain, idx) => {
614
+ const room = parse<IRoom>(plain);
615
+ if (room) {out[jids[idx]] = room;}
616
+ });
617
+ rooms = { rooms: out };
618
+ } else if (legacyPlain) {
619
+ rooms = parse<PersistedRoomsState>(legacyPlain);
620
+ legacyBlob = !!rooms;
621
+ }
622
+ return {
623
+ chat,
624
+ rooms,
625
+ heap,
626
+ legacyBlob,
627
+ empty: !chat && !rooms && !heap,
628
+ };
629
+ }
630
+
438
631
  export async function readPersistedState(): Promise<{
439
632
  chat: PersistedChatState | null;
440
633
  rooms: PersistedRoomsState | null;
441
634
  heap: PersistedHeapState | null;
442
635
  }> {
443
636
  try {
444
- const [chatRaw, roomsRaw, heapRaw] = await AsyncStorage.multiGet([
445
- KEY_CHAT,
446
- KEY_ROOMS,
447
- KEY_HEAP,
448
- ]);
449
- const [chatPlain, roomsPlain, heapPlain] = await Promise.all([
450
- chatRaw[1] ? decryptFromPersist(chatRaw[1]) : Promise.resolve(null),
451
- roomsRaw[1] ? decryptFromPersist(roomsRaw[1]) : Promise.resolve(null),
452
- heapRaw[1] ? decryptFromPersist(heapRaw[1]) : Promise.resolve(null),
453
- ]);
454
- // `decryptFromPersist` returns null both for "nothing stored" and
455
- // for "stored value isn't a valid envelope for the current key" —
456
- // notably a plaintext blob left over from a pre-encryption install.
457
- // Either way there is nothing safe to parse, so the caller treats it
458
- // as a cold start and re-hydrates from the server.
459
- const chat = chatPlain ? (JSON.parse(chatPlain) as PersistedChatState) : null;
460
- const rooms = roomsPlain
461
- ? (JSON.parse(roomsPlain) as PersistedRoomsState)
462
- : null;
463
- const heap = heapPlain
464
- ? (JSON.parse(heapPlain) as PersistedHeapState)
465
- : null;
466
- return { chat, rooms, heap };
637
+ const backend = await getPersistBackend();
638
+ let read = await readFrom(backend);
639
+ if (read.empty && backend.name === 'mmkv') {
640
+ read = await readFrom(legacyAsyncStorageBackend);
641
+ if (!read.empty) {
642
+ migrateFromAsyncStorage = true;
643
+ allRoomsDirty = true;
644
+ chatDirty = !!read.chat;
645
+ heapDirty = !!read.heap;
646
+ knownRoomJids = new Set();
647
+ }
648
+ }
649
+ if (read.legacyBlob) {
650
+ legacyBlobPresent = true;
651
+ allRoomsDirty = true;
652
+ knownRoomJids = new Set();
653
+ } else if (read.rooms && !migrateFromAsyncStorage) {
654
+ knownRoomJids = new Set(Object.keys(read.rooms.rooms));
655
+ }
656
+ return { chat: read.chat, rooms: read.rooms, heap: read.heap };
467
657
  } catch (e) {
468
658
  console.warn('persist read failed', e);
469
659
  return { chat: null, rooms: null, heap: null };
@@ -472,10 +662,27 @@ export async function readPersistedState(): Promise<{
472
662
 
473
663
  export async function clearPersistedState(): Promise<void> {
474
664
  try {
475
- await AsyncStorage.multiRemove([KEY_CHAT, KEY_ROOMS, KEY_HEAP]);
665
+ const backend = await getPersistBackend();
666
+ const targets: PersistBackend[] =
667
+ backend.name === 'mmkv' ? [backend, legacyAsyncStorageBackend] : [backend];
668
+ for (const target of targets) {
669
+ const keys = (await target.allKeys()).filter((k) => k.startsWith(PERSIST_PREFIX));
670
+ if (keys.length) {await target.removeMany(keys);}
671
+ }
672
+ knownRoomJids = new Set();
673
+ dirtyRooms = new Set();
674
+ legacyBlobPresent = false;
675
+ migrateFromAsyncStorage = false;
476
676
  } catch (e) {
477
677
  console.warn('persist clear failed', e);
478
678
  }
479
679
  }
480
680
 
481
- export const PERSIST_KEYS = { KEY_CHAT, KEY_ROOMS, KEY_HEAP };
681
+ export const PERSIST_KEYS = {
682
+ KEY_CHAT,
683
+ KEY_ROOMS,
684
+ KEY_HEAP,
685
+ KEY_ROOM_INDEX,
686
+ KEY_ROOM_PREFIX,
687
+ };
688
+ export const persistedRoomKey = roomKey;