@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
@@ -1,18 +1,16 @@
1
- import React, { useCallback, useMemo } from 'react';
1
+ /** @format */
2
2
 
3
- import {
4
- ModalContainerFullScreen,
5
- Viewider,
6
- Label,
7
- LabelData,
8
- BorderedContainer,
9
- CenterContainer,
10
- } from '../styledModalComponents';
11
- import ModalHeaderComponent from '../ModalHeaderComponent';
12
- import Button from '../../styled/Button';
3
+ import React, { useCallback, useMemo } from 'react';
4
+ import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
13
5
  import { useDispatch } from 'react-redux';
6
+ import { ModalContainerFullScreen } from '../styledModalComponents';
7
+ import ModalHeaderComponent from '../ModalHeaderComponent';
8
+ import { ArowDownIcon } from '../../../assets/icons';
14
9
  import { setActiveModal } from '../../../roomStore/chatSettingsSlice';
15
10
  import { MODAL_TYPES } from '../../../helpers/constants/MODAL_TYPES';
11
+ import { useChatSettingState } from '../../../hooks/useChatSettingState';
12
+ import { chatTextStyle } from '../../../helpers/typography';
13
+ import { useT } from '../../../i18n/useT';
16
14
 
17
15
  interface UserSettingsModalProps {
18
16
  handleCloseModal: any;
@@ -21,65 +19,84 @@ interface UserSettingsModalProps {
21
19
  const UserSettingsModal: React.FC<UserSettingsModalProps> = ({
22
20
  handleCloseModal,
23
21
  }) => {
22
+ const t = useT();
23
+ const dispatch = useDispatch();
24
+ const { config } = useChatSettingState();
25
+
24
26
  const options = useMemo(
25
27
  () => [
26
- { value: 'Manage Data', key: MODAL_TYPES.MANAGE_DATA },
27
- { value: 'Visiblility', key: MODAL_TYPES.VISIBILITY },
28
- // { value: 'Profile Shares', key: MODAL_TYPES.PROFILE_SHARES },
29
- // { value: 'Document Shares', key: MODAL_TYPES.DOCUMENT_SHARES },
30
- // { value: 'Blocked Users', key: MODAL_TYPES.BLOCKED_USERS },
31
- // { value: 'Referrals', key: MODAL_TYPES.REFERRALS },
28
+ { label: t('settings.manageData.title'), key: MODAL_TYPES.MANAGE_DATA },
29
+ { label: t('settings.visibility.title'), key: MODAL_TYPES.VISIBILITY },
32
30
  ],
33
- []
31
+ [t]
34
32
  );
35
33
 
36
- const dispatch = useDispatch();
37
-
38
- const handleClick = useCallback((key: string) => {
39
- dispatch(setActiveModal(key as any));
40
- }, []);
34
+ const handleClick = useCallback(
35
+ (key: string) => {
36
+ dispatch(setActiveModal(key as any));
37
+ },
38
+ [dispatch]
39
+ );
41
40
 
42
41
  return (
43
- <ModalContainerFullScreen>
42
+ <ModalContainerFullScreen style={styles.screen}>
44
43
  <ModalHeaderComponent
45
44
  handleCloseModal={handleCloseModal}
46
- headerTitle={'Settings'}
45
+ headerTitle={t('settings.menu.title')}
46
+ titleStyle={chatTextStyle(config?.typography?.profile?.screenTitle)}
47
47
  />
48
- <CenterContainer>
49
- <BorderedContainer
50
- style={{
51
- padding: 16,
52
- display: 'flex',
53
- flexDirection: 'column',
54
- gap: 8,
55
- }}
56
- >
57
- {options.map((option: { value: string; key: string }, index) => (
58
- <>
59
- <Button
60
- variant="default"
61
- style={{
62
- minHeight: 40,
63
- display: 'flex',
64
- flexDirection: 'column',
65
- gap: 2,
66
- width: '100%',
67
- justifyContent: 'center',
68
- borderRadius: 0,
69
- alignItems: 'flex-start',
70
- }}
71
- onPress={() => handleClick(option.key)}
72
- >
73
- <Label style={{ textAlign: 'center' }}>{option.value}</Label>
74
- {[2, 3, 4].includes(index) && <LabelData>0</LabelData>}
75
- </Button>
76
- {index < 5 && <Viewider />}
77
- </>
78
- ))}
79
- </BorderedContainer>
80
- </CenterContainer>
48
+ {/* One card per entry, rather than a single bordered block with
49
+ * hairline dividers — the rows are separate destinations, and the
50
+ * design gives each its own surface. */}
51
+ <View style={styles.body}>
52
+ {options.map((option) => (
53
+ <TouchableOpacity
54
+ key={option.key}
55
+ testID={`settings-row-${option.key}`}
56
+ activeOpacity={0.7}
57
+ style={styles.card}
58
+ onPress={() => handleClick(option.key)}
59
+ >
60
+ <Text style={styles.label}>{option.label}</Text>
61
+ <ArowDownIcon color="#8C8C8C" width={20} height={20} style={styles.chevron} />
62
+ </TouchableOpacity>
63
+ ))}
64
+ </View>
81
65
  </ModalContainerFullScreen>
82
66
  );
83
67
  };
84
68
 
69
+ const styles = StyleSheet.create({
70
+ screen: {
71
+ backgroundColor: '#E8EDF2',
72
+ },
73
+ body: {
74
+ width: '100%',
75
+ padding: 12,
76
+ gap: 12,
77
+ },
78
+ card: {
79
+ flexDirection: 'row',
80
+ alignItems: 'center',
81
+ justifyContent: 'space-between',
82
+ backgroundColor: '#FFFFFF',
83
+ borderRadius: 20,
84
+ paddingHorizontal: 20,
85
+ paddingVertical: 22,
86
+ shadowColor: '#101828',
87
+ shadowOffset: { width: 0, height: 4 },
88
+ shadowOpacity: 0.06,
89
+ shadowRadius: 12,
90
+ elevation: 3,
91
+ },
92
+ label: {
93
+ fontSize: 17,
94
+ fontWeight: '500',
95
+ color: '#141414',
96
+ },
97
+ chevron: {
98
+ transform: [{ rotate: '-90deg' }],
99
+ },
100
+ });
101
+
85
102
  export default UserSettingsModal;
@@ -86,8 +86,15 @@ export const HeaderContainer = styled.View`
86
86
  * button and 8px below — properly sized and properly centered. */
87
87
  padding: 8px 16px;
88
88
  background-color: #fff;
89
- border-bottom-width: 1px;
90
- border-bottom-color: #f0f0f0;
89
+ /* Same card treatment as the room-list header: rounded bottom corners
90
+ * and a soft drop shadow instead of a hairline rule. */
91
+ border-bottom-left-radius: 20px;
92
+ border-bottom-right-radius: 20px;
93
+ shadow-color: #101828;
94
+ shadow-offset: 0px 4px;
95
+ shadow-opacity: 0.06;
96
+ shadow-radius: 12px;
97
+ elevation: 4;
91
98
  z-index: 1;
92
99
  flex-direction: row;
93
100
  justify-content: space-between;
@@ -2,6 +2,8 @@ import React, { useCallback, useMemo } from 'react';
2
2
  import { useSelector } from 'react-redux';
3
3
  import { RootState } from '../../roomStore';
4
4
  import { IMessage } from '../../types/types';
5
+ import { useFileToken } from '../../hooks/useFileToken';
6
+ import { appendFileToken } from '../../helpers/secureFileUrl';
5
7
  import { IConfig, IRoom } from '../../types/types';
6
8
  import { ProfileImagePlaceholder } from '../MainComponents/ProfileImagePlaceholder';
7
9
  import {
@@ -29,6 +31,8 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
29
31
  isDriver,
30
32
  config,
31
33
  }) => {
34
+ // Room icons can live on the membership-gated secure-files host.
35
+ const fileToken = useFileToken();
32
36
  const displayName = String(chat?.title || chat?.name || '').trim();
33
37
 
34
38
  // usersSet is the canonical name store — the same one Message.tsx
@@ -130,7 +134,13 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
130
134
 
131
135
  return (
132
136
  <ChatItem key={index}>
133
- <ProfileImagePlaceholder name={displayName} icon={chat?.icon} active={false} />
137
+ <View pointerEvents="none">
138
+ <ProfileImagePlaceholder
139
+ name={displayName}
140
+ icon={appendFileToken(chat?.icon, fileToken)}
141
+ active={false}
142
+ />
143
+ </View>
134
144
  <View
135
145
  style={{
136
146
  flexDirection: 'column',
@@ -140,7 +150,9 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
140
150
  paddingVertical: 8,
141
151
  paddingRight: 8,
142
152
  borderBottomWidth: 1,
143
- borderBottomColor: '#F0F0F0',
153
+ // Reads against the list's #E8EDF2 ground; #F0F0F0 was lighter
154
+ // than the ground itself, so the row separators vanished.
155
+ borderBottomColor: '#C6CFDA',
144
156
  }}
145
157
  >
146
158
  <View
@@ -251,8 +263,11 @@ const ChatRoomItem: React.FC<ChatRoomItemProps> = ({
251
263
  ) : null}
252
264
  </View>
253
265
  {isDriver && (
266
+ // Darker than the list's own ground (#E8EDF2), otherwise the
267
+ // separator disappears into it — white and the old #0052CD0D
268
+ // hairline both did.
254
269
  <View
255
- style={{ height: 1, backgroundColor: '#0052CD0D', marginTop: 8 }}
270
+ style={{ height: 1, backgroundColor: '#C6CFDA', marginTop: 8 }}
256
271
  />
257
272
  )}
258
273
  </View>
@@ -8,9 +8,19 @@ import {
8
8
  } from './StyledRoomComponents';
9
9
  import { FileIcon } from '../../../assets/icons';
10
10
  import { Image, View } from 'react-native';
11
+ import { useFileToken } from '../../../hooks/useFileToken';
12
+ import {
13
+ appendFileToken,
14
+ isSecureFileUrl,
15
+ requestFileTokenRecovery,
16
+ } from '../../../helpers/secureFileUrl';
17
+ import { getDisplayFileName } from '../../../helpers/getDisplayFileName';
11
18
 
12
19
  interface LastMessageFileProps
13
- extends Pick<LastMessage, 'user' | 'originalName' | 'locationPreview'> {}
20
+ extends Pick<
21
+ LastMessage,
22
+ 'user' | 'originalName' | 'fileName' | 'mimetype' | 'locationPreview'
23
+ > {}
14
24
 
15
25
  const fallbackImage =
16
26
  'https://as2.ftcdn.net/v2/jpg/02/51/95/53/1000_F_251955356_FAQH0U1y1TZw3ZcdPGybwUkH90a3VAhb.jpg';
@@ -18,9 +28,18 @@ const fallbackImage =
18
28
  const LastMessageFile: FC<LastMessageFileProps> = ({
19
29
  user,
20
30
  originalName,
31
+ fileName,
32
+ mimetype,
21
33
  locationPreview,
22
34
  }) => {
23
35
  const [imgSrc, setImgSrc] = useState(locationPreview);
36
+ const fileToken = useFileToken();
37
+ // Bug #40: prefer the sender's original name over the stored hash
38
+ // name; only fall back to the generic "file" label when neither is
39
+ // present at all (avoids a synthetic "media_<timestamp>.bin" here).
40
+ const displayName = originalName || fileName
41
+ ? getDisplayFileName({ originalName, fileName, mimetype })
42
+ : 'file';
24
43
 
25
44
  return (
26
45
  <LastRoomMessageContainer>
@@ -34,18 +53,23 @@ const LastMessageFile: FC<LastMessageFileProps> = ({
34
53
  >
35
54
  {imgSrc ? (
36
55
  <Image
37
- source={{ uri: imgSrc }}
56
+ source={{ uri: appendFileToken(imgSrc, fileToken) }}
38
57
  style={{
39
58
  borderRadius: 16,
40
59
  width: 20,
41
60
  height: 20,
42
61
  }}
43
- onError={() => setImgSrc(fallbackImage)}
62
+ onError={() => {
63
+ if (isSecureFileUrl(imgSrc)) {
64
+ requestFileTokenRecovery();
65
+ }
66
+ setImgSrc(fallbackImage);
67
+ }}
44
68
  />
45
69
  ) : (
46
70
  <FileIcon style={{ width: '20px', height: '20px' }} />
47
71
  )}
48
- <LastRoomMessageText>{originalName || 'file'}</LastRoomMessageText>
72
+ <LastRoomMessageText>{displayName}</LastRoomMessageText>
49
73
  </View>
50
74
  </LastRoomMessageContainer>
51
75
  );
@@ -1,4 +1,6 @@
1
1
  import React, { FC } from 'react';
2
+ import { useFileToken } from '../../../hooks/useFileToken';
3
+ import { appendFileToken } from '../../../helpers/secureFileUrl';
2
4
  import styled from 'styled-components/native';
3
5
  import { LastMessage } from '../../../types/types';
4
6
  import {
@@ -9,6 +11,7 @@ import {
9
11
  ShadeWrapper,
10
12
  } from './StyledRoomComponents';
11
13
  import { View } from 'react-native';
14
+ import { getDisplayFileName } from '../../../helpers/getDisplayFileName';
12
15
 
13
16
  const PhotoContainer = styled.View`
14
17
  position: relative;
@@ -23,13 +26,25 @@ const PhotoContainer = styled.View`
23
26
  `;
24
27
 
25
28
  interface LastMessagePhotoProps
26
- extends Pick<LastMessage, 'user' | 'originalName' | 'locationPreview'> {}
29
+ extends Pick<
30
+ LastMessage,
31
+ 'user' | 'originalName' | 'fileName' | 'mimetype' | 'locationPreview'
32
+ > {}
27
33
 
28
34
  const LastMessagePhoto: FC<LastMessagePhotoProps> = ({
29
35
  user,
30
36
  locationPreview,
31
37
  originalName,
38
+ fileName,
39
+ mimetype,
32
40
  }) => {
41
+ const fileToken = useFileToken();
42
+ // Bug #40: prefer the sender's original name over the stored hash
43
+ // name; only fall back to the generic "file" label when neither is
44
+ // present at all (avoids a synthetic "media_<timestamp>.bin" here).
45
+ const displayName = originalName || fileName
46
+ ? getDisplayFileName({ originalName, fileName, mimetype })
47
+ : 'file';
33
48
  return (
34
49
  <LastRoomMessageContainer>
35
50
  <LastRoomMessageName>{user?.name || ''}:</LastRoomMessageName>
@@ -42,10 +57,10 @@ const LastMessagePhoto: FC<LastMessagePhotoProps> = ({
42
57
  >
43
58
  <PhotoContainer>
44
59
  <ShadeWrapper>
45
- <LastMessageImg src={locationPreview} />
60
+ <LastMessageImg src={appendFileToken(locationPreview, fileToken)} />
46
61
  </ShadeWrapper>
47
62
  </PhotoContainer>
48
- <LastRoomMessageText>{originalName || 'file'}</LastRoomMessageText>
63
+ <LastRoomMessageText>{displayName}</LastRoomMessageText>
49
64
  </View>
50
65
  </LastRoomMessageContainer>
51
66
  );
@@ -1,4 +1,6 @@
1
1
  import React, { FC } from 'react';
2
+ import { useFileToken } from '../../../hooks/useFileToken';
3
+ import { appendFileToken } from '../../../helpers/secureFileUrl';
2
4
  import styled from 'styled-components/native';
3
5
  import { LastMessage } from '../../../types/types';
4
6
  import {
@@ -8,6 +10,7 @@ import {
8
10
  ShadeWrapper,
9
11
  } from './StyledRoomComponents';
10
12
  import { Text, View } from 'react-native';
13
+ import { getDisplayFileName } from '../../../helpers/getDisplayFileName';
11
14
 
12
15
  const VideoContainer = styled.View`
13
16
  position: relative;
@@ -38,13 +41,25 @@ const PlayButton = styled.View`
38
41
  `;
39
42
 
40
43
  interface LastMessageVideoProps
41
- extends Pick<LastMessage, 'user' | 'location' | 'originalName'> {}
44
+ extends Pick<
45
+ LastMessage,
46
+ 'user' | 'location' | 'originalName' | 'fileName' | 'mimetype'
47
+ > {}
42
48
 
43
49
  const LastMessageVideo: FC<LastMessageVideoProps> = ({
44
50
  user,
45
51
  location,
46
52
  originalName,
53
+ fileName,
54
+ mimetype,
47
55
  }) => {
56
+ const fileToken = useFileToken();
57
+ // Bug #40: prefer the sender's original name over the stored hash
58
+ // name; only fall back to the generic "file" label when neither is
59
+ // present at all (avoids a synthetic "media_<timestamp>.bin" here).
60
+ const displayName = originalName || fileName
61
+ ? getDisplayFileName({ originalName, fileName, mimetype })
62
+ : 'file';
48
63
  return (
49
64
  <LastRoomMessageContainer>
50
65
  <LastRoomMessageName>{user?.name || ''}:</LastRoomMessageName>
@@ -57,11 +72,11 @@ const LastMessageVideo: FC<LastMessageVideoProps> = ({
57
72
  >
58
73
  <VideoContainer>
59
74
  <ShadeWrapper>
60
- <Thumbnail src={location} />
75
+ <Thumbnail src={appendFileToken(location, fileToken)} />
61
76
  </ShadeWrapper>
62
77
  <PlayButton><Text>▶</Text></PlayButton>
63
78
  </VideoContainer>
64
- <LastRoomMessageText>{originalName || 'file'}</LastRoomMessageText>
79
+ <LastRoomMessageText>{displayName}</LastRoomMessageText>
65
80
  </View>
66
81
  </LastRoomMessageContainer>
67
82
  );
@@ -345,9 +345,14 @@ export const VideoCallSession: FC<VideoCallSessionProps> = ({
345
345
  if (!runtime) {return;}
346
346
  try {
347
347
  if (Platform.OS === 'android') {
348
- await runtime.AudioSession.setAndroidAudioConfiguration?.({
349
- preferredOutputList: next ? ['speaker'] : ['earpiece'],
350
- });
348
+ // NB: not `setAndroidAudioConfiguration` — that method has never
349
+ // existed on AudioSession (the old `?.` call silently no-oped, so
350
+ // the speaker icon toggled while audio stayed on the earpiece).
351
+ // `selectAudioOutput` routes directly; on Android its device ids
352
+ // are the literal strings 'speaker' / 'earpiece'.
353
+ await runtime.AudioSession.selectAudioOutput(
354
+ next ? 'speaker' : 'earpiece'
355
+ );
351
356
  } else {
352
357
  await runtime.AudioSession.setAppleAudioConfiguration?.({
353
358
  audioCategory: 'playAndRecord',
@@ -1,4 +1,5 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
+ import { withFileToken } from '../../helpers/secureFileUrl';
2
3
  import {
3
4
  View,
4
5
  TouchableOpacity,
@@ -425,7 +426,7 @@ const AudioMessage = ({
425
426
  const partInfo = await FileSystem.getInfoAsync(part);
426
427
  if (!partInfo.exists) {
427
428
  const download = await withTimeout(
428
- FileSystem.downloadAsync(src, part),
429
+ FileSystem.downloadAsync(withFileToken(src), part),
429
430
  12000,
430
431
  'audio_download_timeout'
431
432
  );
@@ -1,4 +1,9 @@
1
1
  import React, { useEffect, useState } from 'react';
2
+ import {
3
+ isSecureFileUrl,
4
+ requestFileTokenRecovery,
5
+ } from '../../helpers/secureFileUrl';
6
+ import { pushLog } from '../../utils/devLogger';
2
7
  import { Container } from './StyledInputComponents/MediaComponents';
3
8
  import { useDispatch } from 'react-redux';
4
9
  import {
@@ -14,19 +19,43 @@ import {
14
19
  } from '../../helpers/mediaDimensions';
15
20
 
16
21
  interface CustomMessageImageProps {
22
+ /** Full-size file. Opened in the preview modal, NOT rendered inline. */
17
23
  fileURL: string;
18
24
  fileName: string;
25
+ /**
26
+ * The sender's original file name (bug #40) - kept alongside `fileName`
27
+ * so the preview modal's save/share/download logic can prefer it over
28
+ * the server's stored/hashed name.
29
+ */
30
+ originalName?: string;
19
31
  mimetype: string;
32
+ /**
33
+ * Server-generated thumbnail — what the bubble actually renders, same
34
+ * as the web client. The full-size original can be many megabytes and,
35
+ * for secure uploads, is served from a different (membership-gated)
36
+ * route; rendering it inline is what left the bubbles blank.
37
+ */
38
+ locationPreview?: string;
20
39
  }
21
40
 
41
+ /** Keep the personal file token out of the logs. */
42
+ const maskToken = (url?: string) =>
43
+ (url || '').replace(/([?&]ft=)[^&]*/i, '$1<redacted>');
44
+
22
45
  const FALLBACK_IMAGE =
23
46
  'https://as2.ftcdn.net/v2/jpg/02/51/95/53/1000_F_251955356_FAQH0U1y1TZw3ZcdPGybwUkH90a3VAhb.jpg';
24
47
 
25
48
  const CustomMessageImage: React.FC<CustomMessageImageProps> = ({
26
49
  fileURL,
27
50
  fileName,
51
+ originalName,
28
52
  mimetype,
53
+ locationPreview,
29
54
  }) => {
55
+ // Preview first, original only as a fallback — mirrors the web client,
56
+ // where the <img> src is the preview and `fileURL` is reserved for the
57
+ // modal.
58
+ const displayURL = locationPreview || fileURL;
30
59
  const [loading, setLoading] = useState(true);
31
60
  // Start with a neutral box; swap to the real aspect ratio once the
32
61
  // image's natural dimensions are known so it's shown scaled, not cropped.
@@ -35,28 +64,34 @@ const CustomMessageImage: React.FC<CustomMessageImageProps> = ({
35
64
  const dispatch = useDispatch();
36
65
 
37
66
  useEffect(() => {
38
- if (!fileURL) {
67
+ if (!displayURL) {
39
68
  return;
40
69
  }
41
70
  let active = true;
42
71
  Image.getSize(
43
- fileURL,
72
+ displayURL,
44
73
  (w, h) => {
45
74
  if (active) {
46
75
  setDims(fitMediaDimensions(w, h));
47
76
  }
48
77
  },
49
- () => {
50
- /* keep the default box if the size probe fails */
78
+ (error) => {
79
+ // Keep the default box — but say WHICH url failed. A blank
80
+ // bubble is otherwise indistinguishable between "bad url",
81
+ // "403 without a token" and "host unreachable".
82
+ pushLog('warn', 'image: getSize failed', {
83
+ url: maskToken(displayURL),
84
+ error: (error as any)?.message || String(error),
85
+ });
51
86
  }
52
87
  );
53
88
  return () => {
54
89
  active = false;
55
90
  };
56
- }, [fileURL]);
91
+ }, [displayURL]);
57
92
 
58
93
  const handleOpen = () => {
59
- dispatch(setActiveFile({ fileName, fileURL, mimetype }));
94
+ dispatch(setActiveFile({ fileName, fileURL, mimetype, originalName }));
60
95
  dispatch(setActiveModal(MODAL_TYPES.FILE_PREVIEW));
61
96
  };
62
97
 
@@ -78,7 +113,7 @@ const CustomMessageImage: React.FC<CustomMessageImageProps> = ({
78
113
  </View>
79
114
  )}
80
115
  <Image
81
- source={{ uri: fileURL || FALLBACK_IMAGE }}
116
+ source={{ uri: displayURL || FALLBACK_IMAGE }}
82
117
  style={{
83
118
  width: dims.width,
84
119
  height: dims.height,
@@ -86,6 +121,17 @@ const CustomMessageImage: React.FC<CustomMessageImageProps> = ({
86
121
  backgroundColor: 'rgba(0, 0, 0, 0)',
87
122
  }}
88
123
  onLoadEnd={() => setLoading(false)}
124
+ onError={(event) => {
125
+ setLoading(false);
126
+ pushLog('warn', 'image: load failed', {
127
+ url: maskToken(displayURL),
128
+ usingPreview: !!locationPreview,
129
+ error: (event as any)?.nativeEvent?.error,
130
+ });
131
+ if (isSecureFileUrl(displayURL)) {
132
+ requestFileTokenRecovery();
133
+ }
134
+ }}
89
135
  // The box already matches the natural aspect ratio, so 'cover'
90
136
  // fills it edge-to-edge with no actual cropping or letterboxing.
91
137
  resizeMode="cover"