@ethora/chat-component-rn 26.8.1 → 26.8.2

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 (604) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +43 -10
  3. package/lib/commonjs/assets/icons.js +7 -2
  4. package/lib/commonjs/assets/icons.js.map +1 -1
  5. package/lib/commonjs/components/AuthForms/Login.js +4 -4
  6. package/lib/commonjs/components/AuthForms/Login.js.map +1 -1
  7. package/lib/commonjs/components/Header/HeaderRoomList.js +29 -8
  8. package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/ChatHeader.js +9 -3
  10. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  11. package/lib/commonjs/components/MainComponents/ChatRoom.js +150 -14
  12. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  13. package/lib/commonjs/components/MainComponents/ChatWrapper.js +34 -13
  14. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  15. package/lib/commonjs/components/MainComponents/LoginWrapper.js +2 -1
  16. package/lib/commonjs/components/MainComponents/LoginWrapper.js.map +1 -1
  17. package/lib/commonjs/components/MainComponents/MediaMessage.js +29 -9
  18. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  19. package/lib/commonjs/components/MainComponents/MessageContainer.js +5 -1
  20. package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
  21. package/lib/commonjs/components/MainComponents/MessageList.js +13 -5
  22. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  23. package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js +14 -13
  24. package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
  25. package/lib/commonjs/components/MainComponents/RoomList.js +208 -35
  26. package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
  27. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +317 -98
  28. package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
  29. package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +322 -110
  30. package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
  31. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +546 -203
  32. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  33. package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js +226 -0
  34. package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -0
  35. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +69 -27
  36. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  37. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +2 -1
  38. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  39. package/lib/commonjs/components/Modals/Modal/Modal.js +8 -0
  40. package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
  41. package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js +2 -1
  42. package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js.map +1 -1
  43. package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js +202 -106
  44. package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
  45. package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
  46. package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
  47. package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js +563 -0
  48. package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -0
  49. package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js +210 -0
  50. package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js.map +1 -0
  51. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +4 -2
  52. package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  53. package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js +7 -21
  54. package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
  55. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +507 -244
  56. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  57. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +74 -46
  58. package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  59. package/lib/commonjs/components/Modals/styledModalComponents.js +9 -2
  60. package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
  61. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +21 -7
  62. package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
  63. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +22 -3
  64. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  65. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +17 -3
  66. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  67. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +17 -3
  68. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  69. package/lib/commonjs/components/VideoCalls/VideoCallSession.js +6 -3
  70. package/lib/commonjs/components/VideoCalls/VideoCallSession.js.map +1 -1
  71. package/lib/commonjs/components/styled/AudioMessage.js +2 -1
  72. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  73. package/lib/commonjs/components/styled/MessageImage.js +37 -9
  74. package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
  75. package/lib/commonjs/components/styled/SendInput.js +80 -11
  76. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  77. package/lib/commonjs/components/styled/StyledComponents.js +9 -3
  78. package/lib/commonjs/components/styled/StyledComponents.js.map +1 -1
  79. package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js +11 -4
  80. package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
  81. package/lib/commonjs/components/styled/UnsupportedType.js +14 -4
  82. package/lib/commonjs/components/styled/UnsupportedType.js.map +1 -1
  83. package/lib/commonjs/components/styled/VideoMessage.js +119 -61
  84. package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
  85. package/lib/commonjs/context/xmppProvider.js +184 -59
  86. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  87. package/lib/commonjs/helpers/createMessageFromXml.js +19 -1
  88. package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
  89. package/lib/commonjs/helpers/ensureScopedChatCache.js +2 -2
  90. package/lib/commonjs/helpers/ensureScopedChatCache.js.map +1 -1
  91. package/lib/commonjs/helpers/getChatBackground.js +23 -0
  92. package/lib/commonjs/helpers/getChatBackground.js.map +1 -0
  93. package/lib/commonjs/helpers/getDisplayFileName.js +79 -0
  94. package/lib/commonjs/helpers/getDisplayFileName.js.map +1 -0
  95. package/lib/commonjs/helpers/getServerReadTimestamp.js +188 -0
  96. package/lib/commonjs/helpers/getServerReadTimestamp.js.map +1 -0
  97. package/lib/commonjs/helpers/historyPreloadScheduler.js +65 -2
  98. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  99. package/lib/commonjs/helpers/initXmppRooms.js +14 -8
  100. package/lib/commonjs/helpers/initXmppRooms.js.map +1 -1
  101. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +51 -9
  102. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  103. package/lib/commonjs/helpers/isOwnMessage.js +75 -0
  104. package/lib/commonjs/helpers/isOwnMessage.js.map +1 -0
  105. package/lib/commonjs/helpers/keyboardLayout.js +12 -2
  106. package/lib/commonjs/helpers/keyboardLayout.js.map +1 -1
  107. package/lib/commonjs/helpers/mediaLibraryRuntime.js +31 -0
  108. package/lib/commonjs/helpers/mediaLibraryRuntime.js.map +1 -0
  109. package/lib/commonjs/helpers/mimeToExtension.js +6 -14
  110. package/lib/commonjs/helpers/mimeToExtension.js.map +1 -1
  111. package/lib/commonjs/helpers/msgSortableMs.js +37 -0
  112. package/lib/commonjs/helpers/msgSortableMs.js.map +1 -0
  113. package/lib/commonjs/helpers/persistCrypto.js +122 -0
  114. package/lib/commonjs/helpers/persistCrypto.js.map +1 -0
  115. package/lib/commonjs/helpers/pickImageAsset.js +68 -0
  116. package/lib/commonjs/helpers/pickImageAsset.js.map +1 -0
  117. package/lib/commonjs/helpers/pushPayload.js +71 -0
  118. package/lib/commonjs/helpers/pushPayload.js.map +1 -0
  119. package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js +130 -17
  120. package/lib/commonjs/helpers/resolveInitBeforeLoadUser.js.map +1 -1
  121. package/lib/commonjs/helpers/secureFileUrl.js +101 -0
  122. package/lib/commonjs/helpers/secureFileUrl.js.map +1 -0
  123. package/lib/commonjs/helpers/secureKeyValue.js +83 -0
  124. package/lib/commonjs/helpers/secureKeyValue.js.map +1 -0
  125. package/lib/commonjs/helpers/secureStoreRuntime.js +59 -0
  126. package/lib/commonjs/helpers/secureStoreRuntime.js.map +1 -0
  127. package/lib/commonjs/helpers/secureUserStorage.js +75 -0
  128. package/lib/commonjs/helpers/secureUserStorage.js.map +1 -0
  129. package/lib/commonjs/helpers/shallowEqual.js +36 -0
  130. package/lib/commonjs/helpers/shallowEqual.js.map +1 -0
  131. package/lib/commonjs/helpers/sheetGestures.js +32 -0
  132. package/lib/commonjs/helpers/sheetGestures.js.map +1 -0
  133. package/lib/commonjs/hooks/useChatRoomFocus.js +45 -12
  134. package/lib/commonjs/hooks/useChatRoomFocus.js.map +1 -1
  135. package/lib/commonjs/hooks/useChatWrapperInit.js +30 -10
  136. package/lib/commonjs/hooks/useChatWrapperInit.js.map +1 -1
  137. package/lib/commonjs/hooks/useComposing.js +27 -0
  138. package/lib/commonjs/hooks/useComposing.js.map +1 -1
  139. package/lib/commonjs/hooks/useFileToken.js +10 -0
  140. package/lib/commonjs/hooks/useFileToken.js.map +1 -0
  141. package/lib/commonjs/hooks/useLogout.js +23 -7
  142. package/lib/commonjs/hooks/useLogout.js.map +1 -1
  143. package/lib/commonjs/hooks/usePendingNotification.js +8 -11
  144. package/lib/commonjs/hooks/usePendingNotification.js.map +1 -1
  145. package/lib/commonjs/hooks/useSendMessage.js +50 -14
  146. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  147. package/lib/commonjs/hooks/useUnreadMessagesCounter.js +6 -1
  148. package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
  149. package/lib/commonjs/i18n/strings.js +145 -37
  150. package/lib/commonjs/i18n/strings.js.map +1 -1
  151. package/lib/commonjs/main.js +44 -0
  152. package/lib/commonjs/main.js.map +1 -1
  153. package/lib/commonjs/networking/api-requests/auth.api.js +134 -60
  154. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  155. package/lib/commonjs/networking/api-requests/roomMembers.api.js +1 -1
  156. package/lib/commonjs/networking/api-requests/roomMembers.api.js.map +1 -1
  157. package/lib/commonjs/networking/api-requests/rooms.api.js +9 -9
  158. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  159. package/lib/commonjs/networking/api-requests/user.api.js +68 -9
  160. package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
  161. package/lib/commonjs/networking/apiClient.js +62 -112
  162. package/lib/commonjs/networking/apiClient.js.map +1 -1
  163. package/lib/commonjs/networking/authRefresh.js +332 -0
  164. package/lib/commonjs/networking/authRefresh.js.map +1 -0
  165. package/lib/commonjs/networking/stanzaHandlers.js +41 -28
  166. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  167. package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js +46 -8
  168. package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
  169. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +8 -1
  170. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  171. package/lib/commonjs/networking/xmpp/subscribeToRoomMessages.xmpp.js +5 -1
  172. package/lib/commonjs/networking/xmpp/subscribeToRoomMessages.xmpp.js.map +1 -1
  173. package/lib/commonjs/networking/xmppClient.js +124 -8
  174. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  175. package/lib/commonjs/roomStore/chatSettingsSlice.js +26 -7
  176. package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
  177. package/lib/commonjs/roomStore/index.js +35 -2
  178. package/lib/commonjs/roomStore/index.js.map +1 -1
  179. package/lib/commonjs/roomStore/persistence.js +226 -23
  180. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  181. package/lib/commonjs/roomStore/roomsSlice.js +151 -38
  182. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  183. package/lib/commonjs/services/pushSubscriptionService.js +15 -13
  184. package/lib/commonjs/services/pushSubscriptionService.js.map +1 -1
  185. package/lib/commonjs/version.js +1 -1
  186. package/lib/module/assets/icons.js +6 -1
  187. package/lib/module/assets/icons.js.map +1 -1
  188. package/lib/module/components/AuthForms/Login.js +4 -4
  189. package/lib/module/components/AuthForms/Login.js.map +1 -1
  190. package/lib/module/components/Header/HeaderRoomList.js +29 -8
  191. package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
  192. package/lib/module/components/MainComponents/ChatHeader.js +9 -3
  193. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  194. package/lib/module/components/MainComponents/ChatRoom.js +152 -16
  195. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  196. package/lib/module/components/MainComponents/ChatWrapper.js +35 -14
  197. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  198. package/lib/module/components/MainComponents/LoginWrapper.js +2 -1
  199. package/lib/module/components/MainComponents/LoginWrapper.js.map +1 -1
  200. package/lib/module/components/MainComponents/MediaMessage.js +30 -10
  201. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  202. package/lib/module/components/MainComponents/MessageContainer.js +5 -1
  203. package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
  204. package/lib/module/components/MainComponents/MessageList.js +13 -5
  205. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  206. package/lib/module/components/MainComponents/ProfileImagePlaceholder.js +14 -13
  207. package/lib/module/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
  208. package/lib/module/components/MainComponents/RoomList.js +207 -35
  209. package/lib/module/components/MainComponents/RoomList.js.map +1 -1
  210. package/lib/module/components/Menu/HeaderRoomListMenu.js +319 -101
  211. package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
  212. package/lib/module/components/Modals/AttachSheet/AttachSheet.js +313 -113
  213. package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
  214. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +549 -207
  215. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  216. package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js +223 -0
  217. package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -0
  218. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +70 -28
  219. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  220. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +2 -1
  221. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  222. package/lib/module/components/Modals/Modal/Modal.js +9 -1
  223. package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
  224. package/lib/module/components/Modals/NewChatModal/ModalContent.js +2 -1
  225. package/lib/module/components/Modals/NewChatModal/ModalContent.js.map +1 -1
  226. package/lib/module/components/Modals/NewChatModal/NewChatModal.js +205 -108
  227. package/lib/module/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
  228. package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js +8 -0
  229. package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
  230. package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js +555 -0
  231. package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -0
  232. package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js +205 -0
  233. package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js.map +1 -0
  234. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +4 -2
  235. package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
  236. package/lib/module/components/Modals/UserProfileModal/EditUserModal.js +9 -23
  237. package/lib/module/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
  238. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +509 -248
  239. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  240. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +76 -48
  241. package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
  242. package/lib/module/components/Modals/styledModalComponents.js +9 -2
  243. package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
  244. package/lib/module/components/RoomComponents/ChatRoomItem.js +21 -7
  245. package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
  246. package/lib/module/components/RoomComponents/styled/LastMessageFile.js +22 -3
  247. package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  248. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +17 -3
  249. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  250. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +17 -3
  251. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  252. package/lib/module/components/VideoCalls/VideoCallSession.js +6 -3
  253. package/lib/module/components/VideoCalls/VideoCallSession.js.map +1 -1
  254. package/lib/module/components/styled/AudioMessage.js +2 -1
  255. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  256. package/lib/module/components/styled/MessageImage.js +37 -9
  257. package/lib/module/components/styled/MessageImage.js.map +1 -1
  258. package/lib/module/components/styled/SendInput.js +81 -12
  259. package/lib/module/components/styled/SendInput.js.map +1 -1
  260. package/lib/module/components/styled/StyledComponents.js +9 -3
  261. package/lib/module/components/styled/StyledComponents.js.map +1 -1
  262. package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js +11 -4
  263. package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
  264. package/lib/module/components/styled/UnsupportedType.js +14 -4
  265. package/lib/module/components/styled/UnsupportedType.js.map +1 -1
  266. package/lib/module/components/styled/VideoMessage.js +120 -62
  267. package/lib/module/components/styled/VideoMessage.js.map +1 -1
  268. package/lib/module/context/xmppProvider.js +184 -60
  269. package/lib/module/context/xmppProvider.js.map +1 -1
  270. package/lib/module/helpers/createMessageFromXml.js +19 -1
  271. package/lib/module/helpers/createMessageFromXml.js.map +1 -1
  272. package/lib/module/helpers/ensureScopedChatCache.js +2 -2
  273. package/lib/module/helpers/ensureScopedChatCache.js.map +1 -1
  274. package/lib/module/helpers/getChatBackground.js +18 -0
  275. package/lib/module/helpers/getChatBackground.js.map +1 -0
  276. package/lib/module/helpers/getDisplayFileName.js +73 -0
  277. package/lib/module/helpers/getDisplayFileName.js.map +1 -0
  278. package/lib/module/helpers/getServerReadTimestamp.js +181 -0
  279. package/lib/module/helpers/getServerReadTimestamp.js.map +1 -0
  280. package/lib/module/helpers/historyPreloadScheduler.js +66 -3
  281. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  282. package/lib/module/helpers/initXmppRooms.js +14 -8
  283. package/lib/module/helpers/initXmppRooms.js.map +1 -1
  284. package/lib/module/helpers/insertMessageWithDelimiter.js +52 -9
  285. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  286. package/lib/module/helpers/isOwnMessage.js +70 -0
  287. package/lib/module/helpers/isOwnMessage.js.map +1 -0
  288. package/lib/module/helpers/keyboardLayout.js +12 -2
  289. package/lib/module/helpers/keyboardLayout.js.map +1 -1
  290. package/lib/module/helpers/mediaLibraryRuntime.js +25 -0
  291. package/lib/module/helpers/mediaLibraryRuntime.js.map +1 -0
  292. package/lib/module/helpers/mimeToExtension.js +6 -13
  293. package/lib/module/helpers/mimeToExtension.js.map +1 -1
  294. package/lib/module/helpers/msgSortableMs.js +32 -0
  295. package/lib/module/helpers/msgSortableMs.js.map +1 -0
  296. package/lib/module/helpers/persistCrypto.js +115 -0
  297. package/lib/module/helpers/persistCrypto.js.map +1 -0
  298. package/lib/module/helpers/pickImageAsset.js +63 -0
  299. package/lib/module/helpers/pickImageAsset.js.map +1 -0
  300. package/lib/module/helpers/pushPayload.js +63 -0
  301. package/lib/module/helpers/pushPayload.js.map +1 -0
  302. package/lib/module/helpers/resolveInitBeforeLoadUser.js +130 -16
  303. package/lib/module/helpers/resolveInitBeforeLoadUser.js.map +1 -1
  304. package/lib/module/helpers/secureFileUrl.js +91 -0
  305. package/lib/module/helpers/secureFileUrl.js.map +1 -0
  306. package/lib/module/helpers/secureKeyValue.js +75 -0
  307. package/lib/module/helpers/secureKeyValue.js.map +1 -0
  308. package/lib/module/helpers/secureStoreRuntime.js +52 -0
  309. package/lib/module/helpers/secureStoreRuntime.js.map +1 -0
  310. package/lib/module/helpers/secureUserStorage.js +72 -0
  311. package/lib/module/helpers/secureUserStorage.js.map +1 -0
  312. package/lib/module/helpers/shallowEqual.js +31 -0
  313. package/lib/module/helpers/shallowEqual.js.map +1 -0
  314. package/lib/module/helpers/sheetGestures.js +26 -0
  315. package/lib/module/helpers/sheetGestures.js.map +1 -0
  316. package/lib/module/hooks/useChatRoomFocus.js +46 -13
  317. package/lib/module/hooks/useChatRoomFocus.js.map +1 -1
  318. package/lib/module/hooks/useChatWrapperInit.js +30 -10
  319. package/lib/module/hooks/useChatWrapperInit.js.map +1 -1
  320. package/lib/module/hooks/useComposing.js +28 -1
  321. package/lib/module/hooks/useComposing.js.map +1 -1
  322. package/lib/module/hooks/useFileToken.js +5 -0
  323. package/lib/module/hooks/useFileToken.js.map +1 -0
  324. package/lib/module/hooks/useLogout.js +23 -7
  325. package/lib/module/hooks/useLogout.js.map +1 -1
  326. package/lib/module/hooks/usePendingNotification.js +8 -11
  327. package/lib/module/hooks/usePendingNotification.js.map +1 -1
  328. package/lib/module/hooks/useSendMessage.js +52 -16
  329. package/lib/module/hooks/useSendMessage.js.map +1 -1
  330. package/lib/module/hooks/useUnreadMessagesCounter.js +6 -1
  331. package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
  332. package/lib/module/i18n/strings.js +145 -37
  333. package/lib/module/i18n/strings.js.map +1 -1
  334. package/lib/module/main.js +14 -2
  335. package/lib/module/main.js.map +1 -1
  336. package/lib/module/networking/api-requests/auth.api.js +131 -59
  337. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  338. package/lib/module/networking/api-requests/roomMembers.api.js +1 -1
  339. package/lib/module/networking/api-requests/roomMembers.api.js.map +1 -1
  340. package/lib/module/networking/api-requests/rooms.api.js +9 -9
  341. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  342. package/lib/module/networking/api-requests/user.api.js +64 -7
  343. package/lib/module/networking/api-requests/user.api.js.map +1 -1
  344. package/lib/module/networking/apiClient.js +61 -113
  345. package/lib/module/networking/apiClient.js.map +1 -1
  346. package/lib/module/networking/authRefresh.js +321 -0
  347. package/lib/module/networking/authRefresh.js.map +1 -0
  348. package/lib/module/networking/stanzaHandlers.js +41 -28
  349. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  350. package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js +46 -8
  351. package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
  352. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +8 -1
  353. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  354. package/lib/module/networking/xmpp/subscribeToRoomMessages.xmpp.js +5 -1
  355. package/lib/module/networking/xmpp/subscribeToRoomMessages.xmpp.js.map +1 -1
  356. package/lib/module/networking/xmppClient.js +124 -8
  357. package/lib/module/networking/xmppClient.js.map +1 -1
  358. package/lib/module/roomStore/chatSettingsSlice.js +26 -7
  359. package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
  360. package/lib/module/roomStore/index.js +37 -4
  361. package/lib/module/roomStore/index.js.map +1 -1
  362. package/lib/module/roomStore/persistence.js +223 -22
  363. package/lib/module/roomStore/persistence.js.map +1 -1
  364. package/lib/module/roomStore/roomsSlice.js +139 -34
  365. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  366. package/lib/module/services/pushSubscriptionService.js +15 -13
  367. package/lib/module/services/pushSubscriptionService.js.map +1 -1
  368. package/lib/module/version.js +1 -1
  369. package/lib/typescript/assets/icons.d.ts +16 -0
  370. package/lib/typescript/assets/icons.d.ts.map +1 -1
  371. package/lib/typescript/components/AuthForms/Login.d.ts.map +1 -1
  372. package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
  373. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  374. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  375. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  376. package/lib/typescript/components/MainComponents/LoginWrapper.d.ts.map +1 -1
  377. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  378. package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
  379. package/lib/typescript/components/MainComponents/MessageList.d.ts +10 -1
  380. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  381. package/lib/typescript/components/MainComponents/ProfileImagePlaceholder.d.ts.map +1 -1
  382. package/lib/typescript/components/MainComponents/RoomList.d.ts +7 -0
  383. package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
  384. package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts +3 -0
  385. package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
  386. package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts +9 -0
  387. package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts.map +1 -1
  388. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +10 -0
  389. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  390. package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts +9 -0
  391. package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts.map +1 -0
  392. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  393. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  394. package/lib/typescript/components/Modals/Modal/Modal.d.ts.map +1 -1
  395. package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts +4 -2
  396. package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts.map +1 -1
  397. package/lib/typescript/components/Modals/NewChatModal/NewChatModal.d.ts +1 -1
  398. package/lib/typescript/components/Modals/NewChatModal/NewChatModal.d.ts.map +1 -1
  399. package/lib/typescript/components/Modals/NewChatModal/UpdNewChatModal.d.ts.map +1 -1
  400. package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts +75 -0
  401. package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts.map +1 -0
  402. package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts +25 -0
  403. package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts.map +1 -0
  404. package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts +6 -1
  405. package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
  406. package/lib/typescript/components/Modals/UserProfileModal/EditUserModal.d.ts.map +1 -1
  407. package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts +16 -0
  408. package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
  409. package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts +1 -0
  410. package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
  411. package/lib/typescript/components/Modals/styledModalComponents.d.ts.map +1 -1
  412. package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
  413. package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts +1 -1
  414. package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
  415. package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts +1 -1
  416. package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
  417. package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts +1 -1
  418. package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
  419. package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts.map +1 -1
  420. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  421. package/lib/typescript/components/styled/MessageImage.d.ts +14 -0
  422. package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
  423. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  424. package/lib/typescript/components/styled/StyledComponents.d.ts.map +1 -1
  425. package/lib/typescript/components/styled/StyledInputComponents/StyledInputComponents.d.ts.map +1 -1
  426. package/lib/typescript/components/styled/UnsupportedType.d.ts.map +1 -1
  427. package/lib/typescript/components/styled/VideoMessage.d.ts +8 -0
  428. package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
  429. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  430. package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
  431. package/lib/typescript/helpers/getChatBackground.d.ts +15 -0
  432. package/lib/typescript/helpers/getChatBackground.d.ts.map +1 -0
  433. package/lib/typescript/helpers/getDisplayFileName.d.ts +49 -0
  434. package/lib/typescript/helpers/getDisplayFileName.d.ts.map +1 -0
  435. package/lib/typescript/helpers/getServerReadTimestamp.d.ts +108 -0
  436. package/lib/typescript/helpers/getServerReadTimestamp.d.ts.map +1 -0
  437. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  438. package/lib/typescript/helpers/initXmppRooms.d.ts.map +1 -1
  439. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts +1 -1
  440. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  441. package/lib/typescript/helpers/isOwnMessage.d.ts +36 -0
  442. package/lib/typescript/helpers/isOwnMessage.d.ts.map +1 -0
  443. package/lib/typescript/helpers/keyboardLayout.d.ts +5 -1
  444. package/lib/typescript/helpers/keyboardLayout.d.ts.map +1 -1
  445. package/lib/typescript/helpers/mediaLibraryRuntime.d.ts +3 -0
  446. package/lib/typescript/helpers/mediaLibraryRuntime.d.ts.map +1 -0
  447. package/lib/typescript/helpers/mimeToExtension.d.ts +0 -15
  448. package/lib/typescript/helpers/mimeToExtension.d.ts.map +1 -1
  449. package/lib/typescript/helpers/msgSortableMs.d.ts +2 -0
  450. package/lib/typescript/helpers/msgSortableMs.d.ts.map +1 -0
  451. package/lib/typescript/helpers/persistCrypto.d.ts +13 -0
  452. package/lib/typescript/helpers/persistCrypto.d.ts.map +1 -0
  453. package/lib/typescript/helpers/pickImageAsset.d.ts +27 -0
  454. package/lib/typescript/helpers/pickImageAsset.d.ts.map +1 -0
  455. package/lib/typescript/helpers/pushPayload.d.ts +7 -0
  456. package/lib/typescript/helpers/pushPayload.d.ts.map +1 -0
  457. package/lib/typescript/helpers/resolveInitBeforeLoadUser.d.ts.map +1 -1
  458. package/lib/typescript/helpers/secureFileUrl.d.ts +7 -0
  459. package/lib/typescript/helpers/secureFileUrl.d.ts.map +1 -0
  460. package/lib/typescript/helpers/secureKeyValue.d.ts +13 -0
  461. package/lib/typescript/helpers/secureKeyValue.d.ts.map +1 -0
  462. package/lib/typescript/helpers/secureStoreRuntime.d.ts +29 -0
  463. package/lib/typescript/helpers/secureStoreRuntime.d.ts.map +1 -0
  464. package/lib/typescript/helpers/secureUserStorage.d.ts +23 -0
  465. package/lib/typescript/helpers/secureUserStorage.d.ts.map +1 -0
  466. package/lib/typescript/helpers/shallowEqual.d.ts +11 -0
  467. package/lib/typescript/helpers/shallowEqual.d.ts.map +1 -0
  468. package/lib/typescript/helpers/sheetGestures.d.ts +20 -0
  469. package/lib/typescript/helpers/sheetGestures.d.ts.map +1 -0
  470. package/lib/typescript/hooks/useChatRoomFocus.d.ts +4 -1
  471. package/lib/typescript/hooks/useChatRoomFocus.d.ts.map +1 -1
  472. package/lib/typescript/hooks/useChatWrapperInit.d.ts.map +1 -1
  473. package/lib/typescript/hooks/useComposing.d.ts.map +1 -1
  474. package/lib/typescript/hooks/useFileToken.d.ts +2 -0
  475. package/lib/typescript/hooks/useFileToken.d.ts.map +1 -0
  476. package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
  477. package/lib/typescript/hooks/usePendingNotification.d.ts.map +1 -1
  478. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  479. package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts +1 -0
  480. package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts.map +1 -1
  481. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  482. package/lib/typescript/main.d.ts +9 -2
  483. package/lib/typescript/main.d.ts.map +1 -1
  484. package/lib/typescript/networking/api-requests/auth.api.d.ts +3 -1
  485. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  486. package/lib/typescript/networking/api-requests/user.api.d.ts +27 -0
  487. package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
  488. package/lib/typescript/networking/apiClient.d.ts +12 -6
  489. package/lib/typescript/networking/apiClient.d.ts.map +1 -1
  490. package/lib/typescript/networking/authRefresh.d.ts +95 -0
  491. package/lib/typescript/networking/authRefresh.d.ts.map +1 -0
  492. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  493. package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts +10 -2
  494. package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts.map +1 -1
  495. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  496. package/lib/typescript/networking/xmpp/subscribeToRoomMessages.xmpp.d.ts.map +1 -1
  497. package/lib/typescript/networking/xmppClient.d.ts +14 -0
  498. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  499. package/lib/typescript/roomStore/chatSettingsSlice.d.ts +16 -0
  500. package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
  501. package/lib/typescript/roomStore/index.d.ts.map +1 -1
  502. package/lib/typescript/roomStore/persistence.d.ts +18 -1
  503. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  504. package/lib/typescript/roomStore/roomsSlice.d.ts +43 -3
  505. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  506. package/lib/typescript/services/pushSubscriptionService.d.ts +1 -1
  507. package/lib/typescript/services/pushSubscriptionService.d.ts.map +1 -1
  508. package/lib/typescript/types/types.d.ts +50 -5
  509. package/lib/typescript/types/types.d.ts.map +1 -1
  510. package/lib/typescript/version.d.ts +1 -1
  511. package/package.json +41 -28
  512. package/src/assets/icons.tsx +48 -9
  513. package/src/components/AuthForms/Login.tsx +3 -3
  514. package/src/components/Header/HeaderRoomList.tsx +29 -7
  515. package/src/components/MainComponents/ChatHeader.tsx +9 -3
  516. package/src/components/MainComponents/ChatRoom.tsx +161 -15
  517. package/src/components/MainComponents/ChatWrapper.tsx +36 -20
  518. package/src/components/MainComponents/LoginWrapper.tsx +1 -0
  519. package/src/components/MainComponents/MediaMessage.tsx +26 -8
  520. package/src/components/MainComponents/MessageContainer.tsx +5 -1
  521. package/src/components/MainComponents/MessageList.tsx +23 -4
  522. package/src/components/MainComponents/ProfileImagePlaceholder.tsx +21 -14
  523. package/src/components/MainComponents/RoomList.tsx +236 -39
  524. package/src/components/Menu/HeaderRoomListMenu.tsx +328 -75
  525. package/src/components/Modals/AttachSheet/AttachSheet.tsx +333 -97
  526. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +600 -282
  527. package/src/components/Modals/ChatProfileModal/ReportChatModal.tsx +244 -0
  528. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +79 -38
  529. package/src/components/Modals/FilePreviewModal/PdfView.tsx +2 -1
  530. package/src/components/Modals/Modal/Modal.tsx +7 -0
  531. package/src/components/Modals/NewChatModal/ModalContent.tsx +6 -3
  532. package/src/components/Modals/NewChatModal/NewChatModal.tsx +219 -119
  533. package/src/components/Modals/NewChatModal/UpdNewChatModal.tsx +12 -1
  534. package/src/components/Modals/ProfileHeader/ProfileHeader.tsx +624 -0
  535. package/src/components/Modals/ProfileHeader/ProfileMenu.tsx +217 -0
  536. package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +14 -4
  537. package/src/components/Modals/UserProfileModal/EditUserModal.tsx +9 -25
  538. package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +617 -307
  539. package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +75 -58
  540. package/src/components/Modals/styledModalComponents.tsx +9 -2
  541. package/src/components/RoomComponents/ChatRoomItem.tsx +18 -3
  542. package/src/components/RoomComponents/styled/LastMessageFile.tsx +28 -4
  543. package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +18 -3
  544. package/src/components/RoomComponents/styled/LastMessageVideo.tsx +18 -3
  545. package/src/components/VideoCalls/VideoCallSession.tsx +8 -3
  546. package/src/components/styled/AudioMessage.tsx +2 -1
  547. package/src/components/styled/MessageImage.tsx +53 -7
  548. package/src/components/styled/SendInput.tsx +83 -12
  549. package/src/components/styled/StyledComponents.ts +9 -3
  550. package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +11 -4
  551. package/src/components/styled/UnsupportedType.tsx +14 -4
  552. package/src/components/styled/VideoMessage.tsx +131 -54
  553. package/src/context/xmppProvider.tsx +216 -57
  554. package/src/helpers/createMessageFromXml.ts +20 -1
  555. package/src/helpers/ensureScopedChatCache.ts +2 -2
  556. package/src/helpers/getChatBackground.ts +18 -0
  557. package/src/helpers/getDisplayFileName.ts +87 -0
  558. package/src/helpers/getServerReadTimestamp.ts +197 -0
  559. package/src/helpers/historyPreloadScheduler.ts +80 -3
  560. package/src/helpers/initXmppRooms.tsx +14 -10
  561. package/src/helpers/insertMessageWithDelimiter.ts +55 -19
  562. package/src/helpers/isOwnMessage.ts +90 -0
  563. package/src/helpers/keyboardLayout.ts +23 -2
  564. package/src/helpers/mediaLibraryRuntime.ts +25 -0
  565. package/src/helpers/mimeToExtension.ts +6 -22
  566. package/src/helpers/msgSortableMs.ts +25 -0
  567. package/src/helpers/persistCrypto.ts +127 -0
  568. package/src/helpers/pickImageAsset.ts +68 -0
  569. package/src/helpers/pushPayload.ts +62 -0
  570. package/src/helpers/resolveInitBeforeLoadUser.ts +125 -18
  571. package/src/helpers/secureFileUrl.ts +103 -0
  572. package/src/helpers/secureKeyValue.ts +80 -0
  573. package/src/helpers/secureStoreRuntime.ts +62 -0
  574. package/src/helpers/secureUserStorage.ts +80 -0
  575. package/src/helpers/shallowEqual.ts +33 -0
  576. package/src/helpers/sheetGestures.ts +25 -0
  577. package/src/hooks/useChatRoomFocus.ts +49 -9
  578. package/src/hooks/useChatWrapperInit.ts +30 -10
  579. package/src/hooks/useComposing.tsx +37 -1
  580. package/src/hooks/useFileToken.ts +7 -0
  581. package/src/hooks/useLogout.tsx +29 -9
  582. package/src/hooks/usePendingNotification.ts +5 -11
  583. package/src/hooks/useSendMessage.tsx +60 -15
  584. package/src/hooks/useUnreadMessagesCounter.ts +11 -0
  585. package/src/i18n/strings.ts +145 -37
  586. package/src/main.ts +26 -2
  587. package/src/networking/api-requests/auth.api.ts +156 -48
  588. package/src/networking/api-requests/roomMembers.api.ts +1 -1
  589. package/src/networking/api-requests/rooms.api.ts +9 -9
  590. package/src/networking/api-requests/user.api.ts +79 -7
  591. package/src/networking/apiClient.ts +68 -123
  592. package/src/networking/authRefresh.ts +451 -0
  593. package/src/networking/stanzaHandlers.ts +44 -28
  594. package/src/networking/xmpp/flushLastViewedToPrivateStore.ts +71 -10
  595. package/src/networking/xmpp/presenceInRoom.xmpp.ts +6 -1
  596. package/src/networking/xmpp/subscribeToRoomMessages.xmpp.ts +12 -1
  597. package/src/networking/xmppClient.ts +141 -9
  598. package/src/roomStore/chatSettingsSlice.ts +34 -10
  599. package/src/roomStore/index.ts +40 -4
  600. package/src/roomStore/persistence.ts +234 -24
  601. package/src/roomStore/roomsSlice.ts +161 -29
  602. package/src/services/pushSubscriptionService.ts +18 -13
  603. package/src/types/types.ts +72 -5
  604. package/src/version.ts +1 -1
@@ -2,6 +2,7 @@ import { createAsyncThunk, createSlice, PayloadAction, type Slice } from '@redux
2
2
  import type { WritableDraft } from 'immer';
3
3
  import { EditAction, HistoryPreloadState, IMessage, IRoom } from '../types/types';
4
4
  import { insertMessageWithDelimiter } from '../helpers/insertMessageWithDelimiter';
5
+ import { msgSortableMs } from '../helpers/msgSortableMs';
5
6
  import type XmppClient from '../networking/xmppClient';
6
7
 
7
8
  // Per-room runtime message cap. Mirrors the persistence layer's
@@ -13,7 +14,7 @@ import type XmppClient from '../networking/xmppClient';
13
14
  // older history added via unshift/splice is exempt, so the user can
14
15
  // page backward arbitrarily far without instantly losing what they
15
16
  // just fetched. After cap eviction we drop from the head (oldest).
16
- const RUNTIME_MESSAGE_LIMIT = 100;
17
+ export const RUNTIME_MESSAGE_LIMIT = 100;
17
18
 
18
19
  // Body strings the server uses for call signaling broadcasts (call-token,
19
20
  // call-state ringing/ended, etc). These should never reach the chat
@@ -142,7 +143,6 @@ function mergeHistoryIntoCache(
142
143
  const ex = stripCallSignals(existing);
143
144
  const fe = stripCallSignals(fetched);
144
145
 
145
- const pending = ex.filter((m) => m?.pending);
146
146
  const realExisting = ex.filter(
147
147
  (m) => m && !m.pending && m.id !== 'delimiter-new'
148
148
  );
@@ -151,6 +151,29 @@ function mergeHistoryIntoCache(
151
151
  // Nothing usable came back → keep the cache exactly as it was.
152
152
  if (realFetched.length === 0) {return ex;}
153
153
 
154
+ // Optimistic sends are preserved across a history merge - EXCEPT the
155
+ // ones the fetched page proves the server already has. That happens
156
+ // whenever a send reached the server but its echo did not reach us
157
+ // before the process died: the optimistic bubble is restored from disk
158
+ // still `pending: true` (and, since bug #39, flagged failed at boot),
159
+ // while MAM hands back the very same message under its ARCHIVE id.
160
+ // Keying only on `id` never matched those two, so the room ended up
161
+ // showing the message twice - once for real and once as a bubble stuck
162
+ // on "sending…"/"Failed" that nothing could ever clear. The archived
163
+ // copy carries our original stanza id as `xmppId` (getDataFromXml), so
164
+ // match on that too and drop the local ghost.
165
+ const fetchedKeys = new Set<string>();
166
+ for (const m of realFetched) {
167
+ if (m?.id != null) {fetchedKeys.add(String(m.id));}
168
+ if ((m as any)?.xmppId) {fetchedKeys.add(String((m as any).xmppId));}
169
+ }
170
+ const pending = ex.filter(
171
+ (m) =>
172
+ m?.pending &&
173
+ !fetchedKeys.has(String(m.id)) &&
174
+ !(m.xmppId && fetchedKeys.has(String(m.xmppId)))
175
+ );
176
+
154
177
  const byMs = (a: IMessage, b: IMessage) =>
155
178
  msgSortableMs(a) - msgSortableMs(b);
156
179
  const capTail = (arr: IMessage[]) =>
@@ -214,6 +237,33 @@ export interface RoomMessagesState {
214
237
  // — see `applyPrivateStoreMarkers`. Re-fetched every init/reconnect,
215
238
  // so it is intentionally NOT persisted.
216
239
  privateStoreMarkers: Record<string, number>;
240
+ // The single source of truth for "read up to here, but the user
241
+ // hasn't reached the bottom yet" (`{ roomJID: boundaryMs }`).
242
+ // Set by MessageList (via ChatRoom's `onReadBoundaryChange`) the
243
+ // moment the user first scrolls away from the bottom, to the
244
+ // msgSortableMs of the newest message they'd actually seen. Every
245
+ // path that stamps a read marker for a room the user is leaving
246
+ // (ChatRoom unmount, xmppProvider's AppState background handler and
247
+ // `isVisible=false` handler, the live `advance()` effect, and
248
+ // `useChatRoomFocus`'s `leaveRoom`) must consult this instead of
249
+ // unconditionally stamping "the newest acked message" - otherwise
250
+ // leaving a room while scrolled up marks messages the user never
251
+ // reached as read (customer #42, a regression of #33 reintroduced by
252
+ // #38's server-timestamp marker). See `getReadMarkerTimestamp` in
253
+ // helpers/getServerReadTimestamp.ts.
254
+ //
255
+ // Cleared when the boundary no longer applies: the user scrolls back
256
+ // to the bottom, the visible room changes, or the room is truly left
257
+ // (ChatRoom unmounts, or a tab-navigator focus hook releases the
258
+ // room). NOT cleared merely because the app backgrounds or a host's
259
+ // `isVisible` flips false - MessageList typically stays mounted
260
+ // through those, so its own scroll-tracking ref (the only thing that
261
+ // could re-derive this value) is still intact and the boundary must
262
+ // stay in sync with it. Deliberately NOT persisted (this key isn't
263
+ // read by `persistence.ts`, which only ever picks `rooms` back out of
264
+ // this slice) - it's meaningless across a process restart, where
265
+ // MessageList always mounts fresh at the bottom.
266
+ readBoundaries: Record<string, number>;
217
267
  }
218
268
 
219
269
  const initialState: RoomMessagesState = {
@@ -230,6 +280,7 @@ const initialState: RoomMessagesState = {
230
280
  },
231
281
  pendingNotificationJid: null,
232
282
  privateStoreMarkers: {},
283
+ readBoundaries: {},
233
284
  };
234
285
 
235
286
  const isValidRoomJid = (jid: unknown): jid is string => {
@@ -317,6 +368,8 @@ const reducers = {
317
368
  : [];
318
369
  state.rooms[roomData.jid] = {
319
370
  ...roomData,
371
+ icon: roomData.icon !== undefined ? roomData.icon : existing?.icon,
372
+ roomBg: roomData.roomBg !== undefined ? roomData.roomBg : existing?.roomBg,
320
373
  messages:
321
374
  existingMessages.length > 0 ? existingMessages : incomingMessages,
322
375
  lastViewedTimestamp: lastViewed,
@@ -494,7 +547,7 @@ const reducers = {
494
547
  state.visibleRoomJID === roomJID
495
548
  ? null
496
549
  : lastViewedValue
497
- ? new Date(lastViewedValue)
550
+ ? lastViewedValue
498
551
  : null;
499
552
 
500
553
  insertMessageWithDelimiter(roomMessages, message, lastViewedTimestamp);
@@ -512,6 +565,7 @@ const reducers = {
512
565
  state.rooms = {};
513
566
  state.visibleRoomJID = null;
514
567
  state.privateStoreMarkers = {};
568
+ state.readBoundaries = {};
515
569
  state.isUnreadSyncing = false;
516
570
  },
517
571
  setComposing(
@@ -578,7 +632,19 @@ const reducers = {
578
632
  *
579
633
  * Monotonic: a marker only ever moves a baseline FORWARD, so a stale
580
634
  * server value can't resurrect already-read messages and a more-recent
581
- * local read (tab blur stamping Date.now()) always wins.
635
+ * local read (tab blur stamping the server read timestamp) always wins.
636
+ *
637
+ * Bug #38 self-heal: forward-only is correct for a SANE existing
638
+ * value, but a device whose clock was ahead may have already stamped
639
+ * a marker in the future (either persisted locally from a previous
640
+ * session, or fetched from the server before this fix existed). To
641
+ * "only ever move forward" from a corrupt future value is to never
642
+ * move at all - the room would stay stuck at `unreadMessages: 0`
643
+ * forever. When the room is loaded, detect a marker that sits well
644
+ * past the newest message we actually know it has and waive the
645
+ * forward-only check for that one comparison, so the incoming
646
+ * (already-clamped, see xmppClient.getChatsPrivateStoreRequestStanza)
647
+ * value can correct it even though it's numerically smaller.
582
648
  */
583
649
  applyPrivateStoreMarkers: (
584
650
  state: WritableDraft<RoomMessagesState>,
@@ -590,20 +656,72 @@ const reducers = {
590
656
  for (const jid of Object.keys(markers)) {
591
657
  const ts = Number(markers[jid]);
592
658
  if (!jid || !Number.isFinite(ts) || ts <= 0) {continue;}
659
+
660
+ const room = state.rooms[jid];
661
+ const newestKnownMs = room ? newestAckedMessageMs(room.messages) : 0;
662
+ // Mirrors isCorruptFutureReadMarker in helpers/getServerReadTimestamp.ts
663
+ // (duplicated to avoid a roomStore <-> helpers import cycle):
664
+ // BOTH signals are required. "Further ahead than the newest
665
+ // message this room has locally" happens all the time on a room
666
+ // whose history hasn't synced yet, and healing on that alone
667
+ // would drop a legitimate marker another device wrote after
668
+ // reading newer messages. A real read marker can never be ahead
669
+ // of real time, so that second signal is what distinguishes a
670
+ // stale cache from a wrong clock.
671
+ const nowMs = Date.now();
672
+ const looksCorrupt = (existing: number) =>
673
+ newestKnownMs > 0 &&
674
+ existing > newestKnownMs + FUTURE_MARKER_TOLERANCE_MS &&
675
+ existing > nowMs + FUTURE_MARKER_TOLERANCE_MS;
676
+
593
677
  // Remember the marker so rooms that load LATER (via addRoom)
594
678
  // inherit it even though they don't exist in the store yet.
595
- if (ts > (state.privateStoreMarkers[jid] || 0)) {
679
+ const cachedMarker = state.privateStoreMarkers[jid] || 0;
680
+ if (ts > cachedMarker || looksCorrupt(cachedMarker)) {
596
681
  state.privateStoreMarkers[jid] = ts;
597
682
  }
598
683
  // Upgrade an already-loaded room's baseline + recompute its badge.
599
- // Only ever forward, so a later local read isn't clobbered.
600
- const room = state.rooms[jid];
601
- if (room && ts > (room.lastViewedTimestamp || 0)) {
684
+ // Forward-only, unless the room's CURRENT baseline is itself the
685
+ // corrupt value being corrected.
686
+ if (room && (ts > (room.lastViewedTimestamp || 0) || looksCorrupt(room.lastViewedTimestamp || 0))) {
602
687
  room.lastViewedTimestamp = ts;
603
688
  room.unreadMessages = countNewerMessages(room.messages, ts);
604
689
  }
605
690
  }
606
691
  },
692
+ /**
693
+ * Set (or clear) the "read up to here, but not further" boundary for
694
+ * a room - see `readBoundaries` on `RoomMessagesState` for the full
695
+ * contract. `ts` is the msgSortableMs of the newest message the user
696
+ * actually reached before scrolling away from the bottom; `null`/`0`
697
+ * clears it (the user is at the bottom, or nothing was reached yet).
698
+ */
699
+ setReadBoundary: (
700
+ state: WritableDraft<RoomMessagesState>,
701
+ action: PayloadAction<{ jid: string; ts: number | null }>
702
+ ) => {
703
+ const { jid, ts } = action.payload;
704
+ if (!jid) {return;}
705
+ if (!state.readBoundaries) {state.readBoundaries = {};}
706
+ if (typeof ts === 'number' && Number.isFinite(ts) && ts > 0) {
707
+ state.readBoundaries[jid] = ts;
708
+ } else {
709
+ delete state.readBoundaries[jid];
710
+ }
711
+ },
712
+ /**
713
+ * Release a room's read boundary once it has been consumed by a
714
+ * genuine "leave" (ChatRoom unmount, or a tab-navigator focus hook
715
+ * switching to a different room) - see `readBoundaries` for why the
716
+ * background/`isVisible=false` paths deliberately do NOT call this.
717
+ */
718
+ clearReadBoundary: (
719
+ state: WritableDraft<RoomMessagesState>,
720
+ action: PayloadAction<{ jid: string }>
721
+ ) => {
722
+ const { jid } = action.payload;
723
+ if (jid && state.readBoundaries) {delete state.readBoundaries[jid];}
724
+ },
607
725
  setRoomRole: (
608
726
  state: WritableDraft<RoomMessagesState>,
609
727
  action: PayloadAction<{ chatJID: string; role: string }>
@@ -697,6 +815,7 @@ const reducers = {
697
815
  state.isLoading = false;
698
816
  state.isUnreadSyncing = false;
699
817
  state.privateStoreMarkers = {};
818
+ state.readBoundaries = {};
700
819
  },
701
820
  setActiveMessage: (
702
821
  state: WritableDraft<RoomMessagesState>,
@@ -818,27 +937,13 @@ export const roomsStore: Slice<RoomMessagesState, typeof reducers, 'roomMessages
818
937
  reducers,
819
938
  });
820
939
 
821
- // Count messages strictly newer than the given millisecond timestamp.
822
- // Uses `msg.id` (server-authoritative microsecond timestamp prefixed by
823
- // 13-digit millis — see helpers/dateComparison `getHighResolutionTimestamp`)
824
- // because `msg.date` can be derived client-side (createMessageFromXml
825
- // falls back to `Date.now()` for realtime stanzas without a `date`
826
- // attr), which makes the comparison drift vs what the server assigned.
827
- // Excludes the "delimiter-new" sentinel, pending sends, and the current
828
- // user's own messages (parity with unreadMiddleware's isOwnMessage
829
- // filter — without this, the reducer and the middleware disagree about
830
- // the count and we get a flicker as the badge gets written twice with
831
- // different values on every message).
832
- export const msgSortableMs = (msg: any): number => {
833
- const id = String(msg?.id || '');
834
- const m = /^(\d{13})/.exec(id);
835
- if (m) {return Number(m[1]);}
836
- if (msg?.date) {
837
- const t = new Date(msg.date as any).getTime();
838
- if (Number.isFinite(t)) {return t;}
839
- }
840
- return 0;
841
- };
940
+ // Re-exported for backward compatibility - every existing call site
941
+ // imports `msgSortableMs` from here. The implementation now lives in
942
+ // helpers/msgSortableMs.ts (imported above), so insertMessageWithDelimiter.ts
943
+ // (which this file itself imports) can use the SAME ordering source
944
+ // without a roomStore <-> helpers import cycle. See that file for the
945
+ // full rationale (server id vs. client `date`).
946
+ export { msgSortableMs };
842
947
 
843
948
  const norm = (s: any): string => {
844
949
  if (s == null) {return '';}
@@ -870,6 +975,31 @@ const isOwn = (
870
975
  return false;
871
976
  };
872
977
 
978
+ // Bug #38 tolerance: a stored read marker more than this far past the
979
+ // newest message a room actually has is not "the user is a little
980
+ // ahead" - it's a leftover from a device whose clock was wrong when it
981
+ // stamped the marker. Kept in sync with (but duplicated from, to avoid
982
+ // a roomStore ↔ helpers import cycle) FUTURE_READ_MARKER_TOLERANCE_MS
983
+ // in helpers/getServerReadTimestamp.ts.
984
+ const FUTURE_MARKER_TOLERANCE_MS = 5 * 60 * 1000;
985
+
986
+ // Newest message in `messages` this room actually has proof the server
987
+ // accepted - used only to sanity-check an already-stored read marker
988
+ // against reality (see applyPrivateStoreMarkers's self-heal). Excludes
989
+ // pending/optimistic sends via the `pending` flag alone: unlike
990
+ // getServerReadTimestamp, this runs inside a reducer and can't reach
991
+ // across to the roomHeapSlice slice, but `pending` already identifies
992
+ // every optimistic send that matters for this comparison.
993
+ const newestAckedMessageMs = (messages: IMessage[] | undefined): number => {
994
+ let newest = 0;
995
+ for (const m of messages || []) {
996
+ if (!m || m.id === 'delimiter-new' || m.pending) {continue;}
997
+ const ms = msgSortableMs(m);
998
+ if (ms > newest) {newest = ms;}
999
+ }
1000
+ return newest;
1001
+ };
1002
+
873
1003
  const countNewerMessages = (
874
1004
  messages: IMessage[],
875
1005
  timestamp: number,
@@ -900,6 +1030,8 @@ export const {
900
1030
  setUnreadSyncing,
901
1031
  setLastViewedTimestamp,
902
1032
  applyPrivateStoreMarkers,
1033
+ setReadBoundary,
1034
+ clearReadBoundary,
903
1035
  setRoomNoMessages,
904
1036
  setCurrentRoom,
905
1037
  setVisibleRoom,
@@ -81,7 +81,9 @@ export class PushSubscriptionService {
81
81
  this.subscribedRooms.add(roomJID);
82
82
  await this.saveSubscribedRoomsToStorage();
83
83
  }
84
- console.log('Successfully Subscribed to room', roomJID);
84
+ if (!result) {
85
+ console.warn('[PushService] MucSub subscribe refused for', roomJID);
86
+ }
85
87
  return result;
86
88
  } catch (error) {
87
89
  console.error(`[PushService] Failed to subscribe to room ${roomJID}:`, error);
@@ -92,30 +94,33 @@ export class PushSubscriptionService {
92
94
  async subscribeToRooms(
93
95
  client: Client,
94
96
  roomJIDs: string[],
95
- userNick?: string
97
+ userNick?: string,
98
+ concurrency = 8
96
99
  ): Promise<void> {
97
100
  let successful = 0;
98
101
  let failed = 0;
99
102
 
100
- console.log('test roomJIDs', roomJIDs);
103
+ await this.loadSubscribedRoomsFromStorage();
104
+ const pending = roomJIDs.filter((jid) => !this.subscribedRooms.has(jid));
105
+ if (!pending.length) {
106
+ return;
107
+ }
101
108
 
102
- for (const roomJID of roomJIDs) {
103
- try {
104
- const result = await this.subscribeToRoom(client, roomJID, userNick);
105
- console.log('test roomJID-1', result);
106
- if (result) {
109
+ for (let i = 0; i < pending.length; i += concurrency) {
110
+ const batch = pending.slice(i, i + concurrency);
111
+ const results = await Promise.allSettled(
112
+ batch.map((roomJID) => this.subscribeToRoom(client, roomJID, userNick))
113
+ );
114
+ for (const r of results) {
115
+ if (r.status === 'fulfilled' && r.value) {
107
116
  successful++;
108
117
  } else {
109
118
  failed++;
110
119
  }
111
- await new Promise(resolve => setTimeout(resolve, 100));
112
- } catch (error) {
113
- failed++;
114
- console.error(`Failed to subscribe to room ${roomJID}:`, error);
115
120
  }
116
121
  }
117
122
 
118
- console.log(`Subscribed to ${successful} rooms, ${failed} failed`);
123
+ console.log(`[PushService] MucSub: ${successful} rooms subscribed, ${failed} failed`);
119
124
  }
120
125
 
121
126
  async reset(): Promise<void> {
@@ -105,6 +105,7 @@ export interface User {
105
105
  ];
106
106
  appId: string;
107
107
  xmppPassword: string;
108
+ fileToken?: string;
108
109
 
109
110
  homeScreen?: string;
110
111
  registrationChannelType?: string;
@@ -150,6 +151,7 @@ export interface xmppSettingsInterface {
150
151
  disableLastRead?: boolean;
151
152
  xmppPingOnSendEnabled?: boolean;
152
153
  historyQoS?: HistoryQoSConfig;
154
+ keepAliveInBackground?: boolean;
153
155
  }
154
156
 
155
157
  export interface InAppNotificationConfig {
@@ -309,13 +311,16 @@ export interface TypographyConfig {
309
311
  };
310
312
  /** Attach (photo/document picker) bottom sheet. */
311
313
  attachSheet?: {
312
- /** "Attach" header label. Default 13 / "600". */
314
+ /** "Photos & Videos" section header. Default 17 / "700". */
313
315
  title?: ChatTextStyle;
314
- /** Row labels (Camera / Gallery / Document). Default 16 / "500". */
316
+ /** "View Library" link next to the section header. Default 15 / "500". */
317
+ viewLibrary?: ChatTextStyle;
318
+ /** Row labels ("Upload a File"). Default 16 / "500". */
315
319
  rowLabel?: ChatTextStyle;
316
- /** Grey hint under each row. Default 12. */
320
+ /** @deprecated Rows no longer render a hint line. */
317
321
  rowHint?: ChatTextStyle;
318
- /** Cancel button. Default 16 / "600". */
322
+ /** @deprecated The sheet has no Cancel button — it closes by tapping
323
+ * the backdrop, dragging it down, or the hardware back gesture. */
319
324
  cancelButton?: ChatTextStyle;
320
325
  };
321
326
 
@@ -393,6 +398,16 @@ export interface IConfig {
393
398
  * value takes effect.
394
399
  */
395
400
  height?: number;
401
+ /**
402
+ * Extend the header cards (room list + chat) under the status bar:
403
+ * each pads its top by the safe-area inset and paints it white, so
404
+ * the card and the status-bar band are one surface. Use this instead
405
+ * of wrapping `<Chat>` in a top-edge SafeAreaView: a host-side white
406
+ * band above the card shows a hairline seam where the card's
407
+ * shadow/elevation starts. Off by default (hosts that already pad the
408
+ * top keep their layout).
409
+ */
410
+ safeAreaTop?: boolean;
396
411
  };
397
412
  disableHeader?: boolean;
398
413
  disableMedia?: boolean;
@@ -421,7 +436,7 @@ export interface IConfig {
421
436
  hideMemberSendMessageAction?: boolean; // hides only "Message"
422
437
  hideMemberCopyIdAction?: boolean; // hides only "Copy User Id"
423
438
  chatHeaderAdditional?: { enabled: boolean; element: any };
424
- headerMenu?: () => void;
439
+ headerMenu?: (() => void) | boolean;
425
440
  headerChatMenu?: () => void;
426
441
  chatHeaderSettings?: {
427
442
  hide?: boolean;
@@ -453,11 +468,41 @@ export interface IConfig {
453
468
  loginFunction: () => Promise<User | null>;
454
469
  };
455
470
  defaultLogin?: boolean;
471
+ logout?: {
472
+ enabled: boolean;
473
+ label?: string;
474
+ confirm?:
475
+ | boolean
476
+ | {
477
+ title?: string;
478
+ message?: string;
479
+ confirmText?: string;
480
+ cancelText?: string;
481
+ };
482
+ onBeforeLogout?: () => Promise<boolean | void> | boolean | void;
483
+ onAfterLogout?: () => Promise<void> | void;
484
+ };
456
485
  refreshTokens?: {
457
486
  enabled: boolean;
487
+ /**
488
+ * Host-owned rotation. When set, the SDK calls this INSTEAD of
489
+ * `/users/login/refresh` — always, including during bootstrap — and
490
+ * never rotates the Ethora refresh token itself. Serialised through
491
+ * the same lock as the built-in path.
492
+ *
493
+ * Return `refreshToken` whenever the host's flow actually rotates an
494
+ * Ethora refresh token: the backend now treats a re-presented one as
495
+ * theft, so omitting it leaves a burned token in storage that ends
496
+ * the session the next time it is used. It stays optional because
497
+ * some hosts re-mint an access token from a different authority
498
+ * (SuperTokens, an owner-session endpoint) and hold no Ethora
499
+ * refresh token at all.
500
+ */
458
501
  refreshFunction?: () => Promise<{
459
502
  accessToken: string;
460
503
  refreshToken?: string;
504
+ fileToken?: string;
505
+ xmppPassword?: string;
461
506
  } | null>;
462
507
  };
463
508
 
@@ -540,6 +585,28 @@ export interface IConfig {
540
585
  // `disableKeyboardAvoidingView` is set. Needs on-device tuning of any
541
586
  // `keyboardVerticalOffset`.
542
587
  keyboardStickyInput?: boolean;
588
+ // Bottom padding applied to the input dock (the composer's outer
589
+ // wrapper), on both iOS and Android. When a number is provided (0 is
590
+ // allowed) it is used verbatim on both platforms, overriding the
591
+ // built-in default below.
592
+ //
593
+ // Left unset, the default is:
594
+ // - 0 when `disableKeyboardAvoidingView` is set, since the host owns
595
+ // layout entirely and typically already places the chat above its
596
+ // own chrome (e.g. a tab bar) - the built-in padding would just add
597
+ // an extra gap between the composer and that chrome.
598
+ // - otherwise unchanged: the iOS safe-area bottom inset, or a fixed
599
+ // 12dp gap on Android (`ANDROID_INPUT_DOCK_GAP`).
600
+ // Customer-reported #44.
601
+ inputDockPaddingBottom?: number;
602
+ // The message list's FlatList uses keyboardDismissMode="interactive" by
603
+ // default, so a drag can be used to pull the keyboard closed. Because
604
+ // the list is `inverted`, an ordinary scroll gesture through history can
605
+ // also be read as a dismiss drag, closing the keyboard mid-scroll. Set
606
+ // this to keep the keyboard open regardless of how the list is scrolled
607
+ // — dismissal then only happens when the user deliberately closes it
608
+ // (tapping outside, back button, etc). Customer-reported #36.
609
+ keepKeyboardOpenOnScroll?: boolean;
543
610
 
544
611
  // ----- interactions / messages -----
545
612
  disableInteractions?: boolean;
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated by scripts/sync-version.mjs on `npm version`.
2
2
  // Edit package.json's version instead of this file.
3
- export const ETHORA_CHAT_COMPONENT_VERSION = '26.8.1';
3
+ export const ETHORA_CHAT_COMPONENT_VERSION = '26.8.2';