@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
@@ -121,10 +121,16 @@ const RoomList: React.FC<RoomListProps> = ({
121
121
  setSearchTerm(text);
122
122
  }, []);
123
123
 
124
- const getLastMessage = useCallback(
125
- (chat: IRoom) => chat?.messages?.[chat?.messages.length - 1],
126
- []
127
- );
124
+ const activityOf = useCallback((chat: IRoom): number => {
125
+ const last = chat?.messages?.[chat?.messages.length - 1];
126
+ const fromLive = Number(last?.id);
127
+ if (Number.isFinite(fromLive) && fromLive > 0) {return fromLive;}
128
+ const fromStamp = Number(chat?.lastMessageTimestamp);
129
+ if (Number.isFinite(fromStamp) && fromStamp > 0) {return fromStamp;}
130
+ const fromSeed = Number(chat?.lastMessage?.id);
131
+ if (Number.isFinite(fromSeed) && fromSeed > 0) {return fromSeed;}
132
+ return 0;
133
+ }, []);
128
134
 
129
135
  const filteredChats = useMemo(() => {
130
136
  const lowerCaseSearchTerm = searchTerm.toLowerCase();
@@ -136,22 +142,13 @@ const RoomList: React.FC<RoomListProps> = ({
136
142
  const hay = `${chat?.title || ''} ${chat?.name || ''}`.toLowerCase();
137
143
  return hay.includes(lowerCaseSearchTerm);
138
144
  })
139
- .sort((a, b) => {
140
- if (getLastMessage(a)?.id && getLastMessage(b)?.id) {
141
- return Number(getLastMessage(b).id) - Number(getLastMessage(a).id);
142
- } else if (getLastMessage(a)?.id) {
143
- return -1;
144
- } else if (getLastMessage(b)?.id) {
145
- return 1;
146
- }
147
- return -1;
148
- });
145
+ .sort((a, b) => activityOf(b) - activityOf(a));
149
146
 
150
147
  chatsMap.set(lowerCaseSearchTerm, result);
151
148
  }
152
149
 
153
150
  return chatsMap.get(lowerCaseSearchTerm) || [];
154
- }, [chats, searchTerm]);
151
+ }, [chats, searchTerm, activityOf]);
155
152
 
156
153
  useEffect(() => {
157
154
  if (burgerMenu) {
@@ -278,6 +275,21 @@ const RoomList: React.FC<RoomListProps> = ({
278
275
  }
279
276
  }, [isSearchFocused]);
280
277
 
278
+ const renderRoom = useCallback(
279
+ ({ item }: { item: IRoom }) => (
280
+ <Pressable
281
+ testID={`room-${(item.jid || '').split('@')[0]}`}
282
+ accessibilityLabel={`room-${item.title || item.name}`}
283
+ onPress={() => performClick(item)}
284
+ onPressIn={handlePressIn}
285
+ onPressOut={handlePressOut}
286
+ >
287
+ <ChatRoomItem chat={item} config={config} />
288
+ </Pressable>
289
+ ),
290
+ [performClick, handlePressIn, handlePressOut, config]
291
+ );
292
+
281
293
  const toggleDrawer = () => {
282
294
  if (isDrawerOpen) {
283
295
  closeDrawer();
@@ -392,20 +404,7 @@ const RoomList: React.FC<RoomListProps> = ({
392
404
  onMomentumScrollBegin={handleMomentumBegin}
393
405
  onMomentumScrollEnd={handleMomentumEnd}
394
406
  keyboardShouldPersistTaps="handled"
395
- renderItem={({ item }) => (
396
- <Pressable
397
- // Stable testID so e2e drivers can target a room
398
- // row by its jid local-part (e.g. Main chat under
399
- // app id `..._...759` → testID `room-...759`).
400
- testID={`room-${(item.jid || '').split('@')[0]}`}
401
- accessibilityLabel={`room-${item.title || item.name}`}
402
- onPress={() => performClick(item)}
403
- onPressIn={handlePressIn}
404
- onPressOut={handlePressOut}
405
- >
406
- <ChatRoomItem chat={item} config={config} />
407
- </Pressable>
408
- )}
407
+ renderItem={renderRoom}
409
408
  style={[
410
409
  styles.chatList,
411
410
  { backgroundColor: theme.listBackground },
@@ -1,27 +1,24 @@
1
1
  import React, {
2
2
  forwardRef,
3
+ memo,
3
4
  ReactNode,
4
5
  useCallback,
5
6
  useEffect,
6
7
  useImperativeHandle,
8
+ useMemo,
7
9
  useRef,
10
+ useState,
8
11
  } from 'react';
9
12
  import {
13
+ Animated,
10
14
  BackHandler,
15
+ Easing,
11
16
  Keyboard,
12
17
  LayoutChangeEvent,
13
18
  StyleSheet,
14
19
  useWindowDimensions,
15
20
  View,
16
21
  } from 'react-native';
17
- import Animated, {
18
- Easing,
19
- interpolate,
20
- runOnJS,
21
- useAnimatedStyle,
22
- useSharedValue,
23
- withTiming,
24
- } from 'react-native-reanimated';
25
22
  import { Gesture, GestureDetector } from 'react-native-gesture-handler';
26
23
 
27
24
  // Width of the left-edge strip that starts the back swipe.
@@ -37,6 +34,17 @@ export const LIST_DIM = 0.25;
37
34
  export const PUSH = { duration: 320, easing: Easing.bezier(0.2, 0.8, 0.2, 1) };
38
35
  export const POP = { duration: 240, easing: Easing.out(Easing.cubic) };
39
36
 
37
+ /**
38
+ * Holds its children still while `frozen`: the list under an open room is
39
+ * fully covered, so re-rendering it on every store update (each incoming
40
+ * message) is wasted work on the JS thread. It thaws as soon as it is
41
+ * about to be seen again.
42
+ */
43
+ const Freezable = memo(
44
+ ({ children }: { frozen: boolean; children: ReactNode }) => <>{children}</>,
45
+ (_prev, next) => next.frozen
46
+ );
47
+
40
48
  export interface RoomStackHandle {
41
49
  /** Slide the room out, then call `onBack`. */
42
50
  pop: () => void;
@@ -59,16 +67,43 @@ interface RoomStackProps {
59
67
  * Two-layer stack for the list → room navigation: the room slides in over
60
68
  * the list, and a swipe from the left edge drags it back out, following the
61
69
  * finger, with the list parallaxing in underneath (the iOS navigation feel).
70
+ *
71
+ * Driven by RN's own `Animated` (native driver), not Reanimated: every layer
72
+ * derives from ONE value through interpolation, so the layers cannot drift
73
+ * apart, and a React re-render mid-flight cannot reset a layer to the style
74
+ * it was first rendered with.
62
75
  */
63
76
  export const RoomStack = forwardRef<RoomStackHandle, RoomStackProps>(
64
77
  ({ list, room, onBack, roomBackground, hardwareBack = true }, ref) => {
65
78
  const { width: windowWidth } = useWindowDimensions();
66
- const width = useSharedValue(windowWidth);
79
+ const [width, setWidth] = useState(windowWidth);
80
+ const widthRef = useRef(width);
81
+ widthRef.current = width;
67
82
  const hasRoom = !!room;
68
83
  // Room's horizontal offset: 0 = covering the list, `width` = off-screen.
69
84
  // A room already open on the first render is shown in place.
70
- const x = useSharedValue(hasRoom ? 0 : windowWidth);
71
- const closing = useSharedValue(false);
85
+ const x = useRef(new Animated.Value(hasRoom ? 0 : windowWidth)).current;
86
+ const closing = useRef(false);
87
+
88
+ // True while the list is (about to be) visible under a moving room.
89
+ const [peeking, setPeeking] = useState(false);
90
+ // Bumped after every completed pop — see the settle effect below.
91
+ const [popCount, setPopCount] = useState(0);
92
+
93
+ const slideTo = useCallback(
94
+ (
95
+ toValue: number,
96
+ config: typeof PUSH,
97
+ done?: (finished: boolean) => void
98
+ ) => {
99
+ Animated.timing(x, {
100
+ toValue,
101
+ ...config,
102
+ useNativeDriver: true,
103
+ }).start(({ finished }) => done?.(finished));
104
+ },
105
+ [x]
106
+ );
72
107
 
73
108
  const isFirstRender = useRef(true);
74
109
  useEffect(() => {
@@ -76,31 +111,56 @@ export const RoomStack = forwardRef<RoomStackHandle, RoomStackProps>(
76
111
  isFirstRender.current = false;
77
112
  return;
78
113
  }
79
- closing.value = false;
114
+ closing.current = false;
115
+ setPeeking(false);
116
+ x.stopAnimation();
117
+ x.setValue(widthRef.current);
80
118
  if (hasRoom) {
81
- x.value = width.value;
82
- x.value = withTiming(0, PUSH);
83
- } else {
84
- x.value = width.value;
119
+ slideTo(0, PUSH);
85
120
  }
86
121
  }, [hasRoom]); // eslint-disable-line react-hooks/exhaustive-deps
87
122
 
88
123
  const onBackRef = useRef(onBack);
89
124
  onBackRef.current = onBack;
90
- const finish = useCallback(() => onBackRef.current(), []);
125
+ const finish = useCallback(() => {
126
+ onBackRef.current();
127
+ setPopCount(count => count + 1);
128
+ }, []);
91
129
 
92
- const pop = useCallback(() => {
93
- if (closing.value) {
130
+ // `onBack` normally clears the room, and the effect above takes over.
131
+ // If the room is still (or again) there after a pop — something
132
+ // re-selected it — bring it back on screen: a room parked off-screen
133
+ // would leave the list visible but untouchable.
134
+ const hasRoomRef = useRef(hasRoom);
135
+ hasRoomRef.current = hasRoom;
136
+ useEffect(() => {
137
+ if (popCount === 0 || !hasRoomRef.current) {
94
138
  return;
95
139
  }
96
- closing.value = true;
97
- Keyboard.dismiss();
98
- x.value = withTiming(width.value, POP, finished => {
140
+ closing.current = false;
141
+ setPeeking(false);
142
+ slideTo(0, POP);
143
+ }, [popCount]); // eslint-disable-line react-hooks/exhaustive-deps
144
+
145
+ const slideOut = useCallback(() => {
146
+ closing.current = true;
147
+ setPeeking(true);
148
+ slideTo(widthRef.current, POP, finished => {
99
149
  if (finished) {
100
- runOnJS(finish)();
150
+ finish();
151
+ } else {
152
+ closing.current = false;
101
153
  }
102
154
  });
103
- }, [finish]); // eslint-disable-line react-hooks/exhaustive-deps
155
+ }, [finish, slideTo]);
156
+
157
+ const pop = useCallback(() => {
158
+ if (closing.current) {
159
+ return;
160
+ }
161
+ Keyboard.dismiss();
162
+ slideOut();
163
+ }, [slideOut]);
104
164
 
105
165
  useImperativeHandle(ref, () => ({ pop }), [pop]);
106
166
 
@@ -115,80 +175,93 @@ export const RoomStack = forwardRef<RoomStackHandle, RoomStackProps>(
115
175
  return () => sub.remove();
116
176
  }, [hasRoom, hardwareBack, pop]);
117
177
 
118
- const dismissKeyboard = useCallback(() => Keyboard.dismiss(), []);
119
-
120
- const swipeBack = Gesture.Pan()
121
- .hitSlop({ left: 0, width: EDGE_WIDTH })
122
- .activeOffsetX(12)
123
- .failOffsetY([-16, 16])
124
- .onStart(() => {
125
- runOnJS(dismissKeyboard)();
126
- })
127
- .onUpdate(e => {
128
- if (closing.value) {
129
- return;
130
- }
131
- x.value = Math.min(Math.max(e.translationX, 0), width.value);
132
- })
133
- .onEnd(e => {
134
- if (closing.value) {
135
- return;
136
- }
137
- const complete =
138
- x.value > width.value * COMPLETE_DISTANCE ||
139
- e.velocityX > COMPLETE_VELOCITY;
140
- if (complete) {
141
- closing.value = true;
142
- x.value = withTiming(width.value, POP, finished => {
143
- if (finished) {
144
- runOnJS(finish)();
178
+ const swipeBack = useMemo(
179
+ () =>
180
+ Gesture.Pan()
181
+ .runOnJS(true)
182
+ .hitSlop({ left: 0, width: EDGE_WIDTH })
183
+ .activeOffsetX(12)
184
+ .failOffsetY([-16, 16])
185
+ .onStart(() => {
186
+ if (closing.current) {
187
+ return;
145
188
  }
146
- });
147
- } else {
148
- x.value = withTiming(0, POP);
149
- }
150
- });
189
+ Keyboard.dismiss();
190
+ setPeeking(true);
191
+ x.stopAnimation();
192
+ })
193
+ .onUpdate(e => {
194
+ if (closing.current) {
195
+ return;
196
+ }
197
+ x.setValue(Math.min(Math.max(e.translationX, 0), widthRef.current));
198
+ })
199
+ .onEnd(e => {
200
+ if (closing.current) {
201
+ return;
202
+ }
203
+ const complete =
204
+ e.translationX > widthRef.current * COMPLETE_DISTANCE ||
205
+ e.velocityX > COMPLETE_VELOCITY;
206
+ if (complete) {
207
+ slideOut();
208
+ } else {
209
+ slideTo(0, POP, () => setPeeking(false));
210
+ }
211
+ }),
212
+ [slideOut, slideTo, x]
213
+ );
151
214
 
152
- const onLayout = useCallback((e: LayoutChangeEvent) => {
153
- const next = e.nativeEvent.layout.width;
154
- if (next > 0 && next !== width.value) {
155
- // Keep an off-screen room off-screen when the container resizes.
156
- if (x.value === width.value) {
157
- x.value = next;
215
+ const onLayout = useCallback(
216
+ (e: LayoutChangeEvent) => {
217
+ const next = e.nativeEvent.layout.width;
218
+ if (next > 0 && next !== widthRef.current) {
219
+ // Keep an off-screen room off-screen when the container resizes.
220
+ if (!hasRoomRef.current) {
221
+ x.setValue(next);
222
+ }
223
+ setWidth(next);
158
224
  }
159
- width.value = next;
160
- }
161
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
162
-
163
- const roomStyle = useAnimatedStyle(() => ({
164
- transform: [{ translateX: x.value }],
165
- }));
166
- // 1 while the room fully covers the list, 0 once it is gone.
167
- const listStyle = useAnimatedStyle(() => {
168
- const covered = 1 - Math.min(Math.max(x.value / width.value, 0), 1);
169
- return {
170
- transform: [{ translateX: -width.value * LIST_PARALLAX * covered }],
171
- };
172
- });
173
- const dimStyle = useAnimatedStyle(() => ({
174
- opacity: interpolate(x.value, [0, width.value], [LIST_DIM, 0]),
175
- }));
225
+ },
226
+ [x]
227
+ );
228
+
229
+ const { listShift, dimOpacity } = useMemo(
230
+ () => ({
231
+ listShift: x.interpolate({
232
+ inputRange: [0, width],
233
+ outputRange: [-width * LIST_PARALLAX, 0],
234
+ extrapolate: 'clamp',
235
+ }),
236
+ dimOpacity: x.interpolate({
237
+ inputRange: [0, width],
238
+ outputRange: [LIST_DIM, 0],
239
+ extrapolate: 'clamp',
240
+ }),
241
+ }),
242
+ [x, width]
243
+ );
176
244
 
177
245
  return (
178
246
  <View style={styles.container} onLayout={onLayout}>
179
247
  <Animated.View
180
- style={[styles.layer, listStyle]}
248
+ style={[
249
+ styles.layer,
250
+ // Without a room the list always rests in place, whatever the
251
+ // animated value is doing.
252
+ hasRoom ? { transform: [{ translateX: listShift }] } : null,
253
+ ]}
181
254
  pointerEvents={hasRoom ? 'none' : 'auto'}
182
255
  accessibilityElementsHidden={hasRoom}
183
256
  importantForAccessibility={hasRoom ? 'no-hide-descendants' : 'auto'}
184
257
  >
185
- {list}
258
+ <Freezable frozen={hasRoom && !peeking}>{list}</Freezable>
186
259
  </Animated.View>
187
260
  {hasRoom && (
188
261
  <>
189
262
  <Animated.View
190
263
  pointerEvents="none"
191
- style={[styles.layer, styles.dim, dimStyle]}
264
+ style={[styles.layer, styles.dim, { opacity: dimOpacity }]}
192
265
  />
193
266
  <GestureDetector gesture={swipeBack}>
194
267
  <Animated.View
@@ -196,7 +269,7 @@ export const RoomStack = forwardRef<RoomStackHandle, RoomStackProps>(
196
269
  styles.layer,
197
270
  styles.room,
198
271
  { backgroundColor: roomBackground },
199
- roomStyle,
272
+ { transform: [{ translateX: x }] },
200
273
  ]}
201
274
  >
202
275
  {room}
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { View, Text, StyleSheet } from 'react-native';
3
+ import { useTheme } from '../../hooks/useTheme';
3
4
 
4
5
  interface SystemMessageProps {
5
6
  messageText?: string;
@@ -10,6 +11,9 @@ const SystemMessage: React.FC<SystemMessageProps> = ({
10
11
  messageText,
11
12
  colors,
12
13
  }) => {
14
+ // Same pill as the day separator; `colors.secondary` is not a pill
15
+ // colour (see DateLabel).
16
+ const theme = useTheme();
13
17
  return (
14
18
  <View style={styles.container}>
15
19
  {/* maxWidth lives on this View (not the Text) so the Text reliably
@@ -19,10 +23,10 @@ const SystemMessage: React.FC<SystemMessageProps> = ({
19
23
  <View
20
24
  style={[
21
25
  styles.bubble,
22
- { backgroundColor: colors?.secondary || '#e7edf9' },
26
+ { backgroundColor: theme.dateLabelBackground },
23
27
  ]}
24
28
  >
25
- <Text style={[styles.text, { color: colors?.primary || '#0052cd' }]}>
29
+ <Text style={[styles.text, { color: colors?.primary || theme.dateLabel }]}>
26
30
  {messageText}
27
31
  </Text>
28
32
  </View>
@@ -11,6 +11,8 @@ interface AvatarProps {
11
11
  firstName?: string;
12
12
  lastName?: string;
13
13
  style?: object;
14
+ /** Initials size (default 16) — small avatars need smaller text. */
15
+ textSize?: number;
14
16
  }
15
17
 
16
18
  const AvatarCircle = styled.View<{ bgColor?: string }>`
@@ -41,6 +43,7 @@ export const Avatar: React.FC<AvatarProps> = ({
41
43
  firstName,
42
44
  lastName,
43
45
  style,
46
+ textSize,
44
47
  }) => {
45
48
  const { config } = useChatSettingState();
46
49
  const backgroundColor = useMemo(() => {
@@ -85,7 +88,10 @@ export const Avatar: React.FC<AvatarProps> = ({
85
88
 
86
89
  return (
87
90
  <AvatarCircle style={style} bgColor={backgroundColor?.backgroundColor}>
88
- <AvatarText color={getAvatarTextColor(backgroundColor?.backgroundColor)}>
91
+ <AvatarText
92
+ color={getAvatarTextColor(backgroundColor?.backgroundColor)}
93
+ style={textSize ? { fontSize: textSize } : undefined}
94
+ >
89
95
  {getInitials()}
90
96
  </AvatarText>
91
97
  </AvatarCircle>
@@ -2,8 +2,10 @@ import { FC, useMemo } from 'react';
2
2
  import { IReply, IUser } from '../../types/types';
3
3
  import { Avatar } from './Avatar';
4
4
  import { styled } from 'styled-components/native';
5
- import { Platform, Text, View } from 'react-native';
5
+ import { Text, View } from 'react-native';
6
6
  import { useTheme } from '../../hooks/useTheme';
7
+ import { useSelector } from 'react-redux';
8
+ import type { RootState } from '../../roomStore';
7
9
 
8
10
  interface BottomReplyContainerProps {
9
11
  isUser: boolean;
@@ -13,29 +15,13 @@ interface BottomReplyContainerProps {
13
15
 
14
16
  const ReplyContainer = styled.TouchableOpacity<{ isUser: boolean }>`
15
17
  background-color: ${({ theme }) => theme.surface};
16
- left: ${(props) => (!props.isUser ? '10px' : 'auto')};
17
- right: ${(props) => (props.isUser ? '10px' : 'auto')};
18
- padding: 4px 8px 4px 16px;
19
- border-radius: 20px;
18
+ border: 0.5px solid ${({ theme }) => theme.border};
19
+ padding: 3px 10px 3px 14px;
20
+ border-radius: 14px;
20
21
  flex-direction: row;
21
22
  align-items: center;
22
23
  gap: 6px;
23
- margin: 8px 8px 0;
24
24
 
25
- ${({ theme }) =>
26
- Platform.select({
27
- // The light shadow is a soft bluish-grey tuned for a white card; on
28
- // the dark palette that would read as a glow, so use the theme shadow.
29
- ios: `
30
- shadow-color: ${theme.dark ? theme.shadow : 'rgba(185, 198, 199, 1)'};
31
- shadow-offset: 0px 0px;
32
- shadow-opacity: 1;
33
- shadow-radius: 8px;
34
- `,
35
- android: `
36
- elevation: 8;
37
- `,
38
- })}
39
25
  `;
40
26
 
41
27
  const AvatarCircle = styled.View`
@@ -75,6 +61,17 @@ export const BottomReplyContainer: FC<BottomReplyContainerProps> = ({
75
61
  onClick,
76
62
  }) => {
77
63
  const theme = useTheme();
64
+ // The repliers' real names: a reply restored from cache carries only the
65
+ // sender's id, so resolve through the same directory the bubbles use.
66
+ const usersSet = useSelector((state: RootState) => state.rooms.usersSet);
67
+ const nameOf = (u: any): string => {
68
+ const raw = String(u?.id || '');
69
+ const entry = usersSet?.[raw.split('@')[0]] || usersSet?.[raw];
70
+ const full = entry
71
+ ? `${entry.firstName || ''} ${entry.lastName || ''}`.trim() || entry.name
72
+ : '';
73
+ return full || u?.name || '';
74
+ };
78
75
  const uniqueUsers: IUser[] = useMemo(() => {
79
76
  return Object.values(
80
77
  reply.reduce<Record<string, IUser>>((acc, item) => {
@@ -94,7 +91,8 @@ export const BottomReplyContainer: FC<BottomReplyContainerProps> = ({
94
91
  {uniqueUsers.slice(0, 3).map((item) => (
95
92
  <AvatarCircle key={item.id}>
96
93
  <Avatar
97
- username={item.name}
94
+ username={nameOf(item)}
95
+ textSize={10}
98
96
  style={{
99
97
  height: '100%',
100
98
  width: '100%',