@ethora/chat-component-rn 26.10.5 → 26.10.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +15 -0
  3. package/app.plugin.js +2 -0
  4. package/lib/commonjs/assets/icons.js +2 -2
  5. package/lib/commonjs/assets/icons.js.map +1 -1
  6. package/lib/commonjs/components/MainComponents/AlbumGrid.js +152 -0
  7. package/lib/commonjs/components/MainComponents/AlbumGrid.js.map +1 -0
  8. package/lib/commonjs/components/MainComponents/ChatRoom.js +2 -2
  9. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  10. package/lib/commonjs/components/MainComponents/MediaMessage.js +199 -123
  11. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  12. package/lib/commonjs/components/MainComponents/MediaUploadOverlay.js +109 -0
  13. package/lib/commonjs/components/MainComponents/MediaUploadOverlay.js.map +1 -0
  14. package/lib/commonjs/components/MessageBubble/MediaCaption.js +51 -0
  15. package/lib/commonjs/components/MessageBubble/MediaCaption.js.map +1 -0
  16. package/lib/commonjs/components/MessageBubble/Message.js +40 -1
  17. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  18. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +2 -1
  19. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  20. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +75 -0
  21. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  22. package/lib/commonjs/components/RoomComponents/LastMessageItem.js +20 -4
  23. package/lib/commonjs/components/RoomComponents/LastMessageItem.js.map +1 -1
  24. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +3 -2
  25. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  26. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js +3 -2
  27. package/lib/commonjs/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  28. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js +3 -2
  29. package/lib/commonjs/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  30. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js +3 -2
  31. package/lib/commonjs/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  32. package/lib/commonjs/components/Thread/ThreadWrapper.js +3 -2
  33. package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
  34. package/lib/commonjs/components/styled/MediaFilePreview.js +60 -47
  35. package/lib/commonjs/components/styled/MediaFilePreview.js.map +1 -1
  36. package/lib/commonjs/components/styled/MessageImage.js +16 -6
  37. package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
  38. package/lib/commonjs/components/styled/SendInput.js +99 -68
  39. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  40. package/lib/commonjs/components/styled/VideoMessage.js +24 -10
  41. package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
  42. package/lib/commonjs/context/xmppProvider.js +46 -0
  43. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  44. package/lib/commonjs/e2ee/fileEnvelope.js +6 -0
  45. package/lib/commonjs/e2ee/fileEnvelope.js.map +1 -1
  46. package/lib/commonjs/e2ee/sealedBody.js +32 -2
  47. package/lib/commonjs/e2ee/sealedBody.js.map +1 -1
  48. package/lib/commonjs/helpers/albumLayout.js +150 -0
  49. package/lib/commonjs/helpers/albumLayout.js.map +1 -0
  50. package/lib/commonjs/helpers/attachments.js +255 -0
  51. package/lib/commonjs/helpers/attachments.js.map +1 -0
  52. package/lib/commonjs/helpers/caption.js +214 -0
  53. package/lib/commonjs/helpers/caption.js.map +1 -0
  54. package/lib/commonjs/helpers/createMainMessageForThread.js +5 -1
  55. package/lib/commonjs/helpers/createMainMessageForThread.js.map +1 -1
  56. package/lib/commonjs/helpers/createMessageFromXml.js +19 -5
  57. package/lib/commonjs/helpers/createMessageFromXml.js.map +1 -1
  58. package/lib/commonjs/helpers/fileKind.js +40 -0
  59. package/lib/commonjs/helpers/fileKind.js.map +1 -0
  60. package/lib/commonjs/helpers/getDataFromXml.js +6 -1
  61. package/lib/commonjs/helpers/getDataFromXml.js.map +1 -1
  62. package/lib/commonjs/helpers/mapWithConcurrency.js +41 -0
  63. package/lib/commonjs/helpers/mapWithConcurrency.js.map +1 -0
  64. package/lib/commonjs/helpers/mediaLimits.js +33 -0
  65. package/lib/commonjs/helpers/mediaLimits.js.map +1 -0
  66. package/lib/commonjs/helpers/mediaSendRetry.js +64 -0
  67. package/lib/commonjs/helpers/mediaSendRetry.js.map +1 -0
  68. package/lib/commonjs/helpers/mediaWireData.js +62 -0
  69. package/lib/commonjs/helpers/mediaWireData.js.map +1 -0
  70. package/lib/commonjs/helpers/mentionSpans.js +19 -0
  71. package/lib/commonjs/helpers/mentionSpans.js.map +1 -0
  72. package/lib/commonjs/helpers/mimeToExtension.js +45 -0
  73. package/lib/commonjs/helpers/mimeToExtension.js.map +1 -1
  74. package/lib/commonjs/helpers/readReceipts.js +173 -0
  75. package/lib/commonjs/helpers/readReceipts.js.map +1 -0
  76. package/lib/commonjs/helpers/repairFilenameEncoding.js +79 -0
  77. package/lib/commonjs/helpers/repairFilenameEncoding.js.map +1 -0
  78. package/lib/commonjs/helpers/safeJson.js +18 -0
  79. package/lib/commonjs/helpers/safeJson.js.map +1 -0
  80. package/lib/commonjs/hooks/useSendMessage.js +384 -193
  81. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  82. package/lib/commonjs/i18n/strings.js +96 -0
  83. package/lib/commonjs/i18n/strings.js.map +1 -1
  84. package/lib/commonjs/networking/api-requests/auth.api.js +62 -3
  85. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  86. package/lib/commonjs/networking/stanzaHandlers.js +100 -3
  87. package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
  88. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +4 -2
  89. package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  90. package/lib/commonjs/networking/xmpp/sendDisplayedMarker.xmpp.js +28 -0
  91. package/lib/commonjs/networking/xmpp/sendDisplayedMarker.xmpp.js.map +1 -0
  92. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js +53 -2
  93. package/lib/commonjs/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  94. package/lib/commonjs/networking/xmpp/sendReceivedReceipt.xmpp.js +28 -0
  95. package/lib/commonjs/networking/xmpp/sendReceivedReceipt.xmpp.js.map +1 -0
  96. package/lib/commonjs/networking/xmppClient.js +64 -0
  97. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  98. package/lib/commonjs/roomStore/persistence.js +78 -5
  99. package/lib/commonjs/roomStore/persistence.js.map +1 -1
  100. package/lib/commonjs/roomStore/roomHeapSlice.js +4 -0
  101. package/lib/commonjs/roomStore/roomHeapSlice.js.map +1 -1
  102. package/lib/commonjs/roomStore/roomsSlice.js +114 -1
  103. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  104. package/lib/commonjs/types/models/attachment.model.js +2 -0
  105. package/lib/commonjs/types/models/attachment.model.js.map +1 -0
  106. package/lib/commonjs/version.js +1 -1
  107. package/lib/module/assets/icons.js +1 -1
  108. package/lib/module/assets/icons.js.map +1 -1
  109. package/lib/module/components/MainComponents/AlbumGrid.js +146 -0
  110. package/lib/module/components/MainComponents/AlbumGrid.js.map +1 -0
  111. package/lib/module/components/MainComponents/ChatRoom.js +2 -2
  112. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  113. package/lib/module/components/MainComponents/MediaMessage.js +200 -124
  114. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  115. package/lib/module/components/MainComponents/MediaUploadOverlay.js +104 -0
  116. package/lib/module/components/MainComponents/MediaUploadOverlay.js.map +1 -0
  117. package/lib/module/components/MessageBubble/MediaCaption.js +46 -0
  118. package/lib/module/components/MessageBubble/MediaCaption.js.map +1 -0
  119. package/lib/module/components/MessageBubble/Message.js +44 -5
  120. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  121. package/lib/module/components/MessageBubble/MessageInteractions.js +2 -1
  122. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  123. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +75 -0
  124. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  125. package/lib/module/components/RoomComponents/LastMessageItem.js +20 -4
  126. package/lib/module/components/RoomComponents/LastMessageItem.js.map +1 -1
  127. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +3 -2
  128. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  129. package/lib/module/components/RoomComponents/styled/LastMessageFile.js +3 -2
  130. package/lib/module/components/RoomComponents/styled/LastMessageFile.js.map +1 -1
  131. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js +3 -2
  132. package/lib/module/components/RoomComponents/styled/LastMessagePhoto.js.map +1 -1
  133. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js +3 -2
  134. package/lib/module/components/RoomComponents/styled/LastMessageVideo.js.map +1 -1
  135. package/lib/module/components/Thread/ThreadWrapper.js +3 -2
  136. package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
  137. package/lib/module/components/styled/MediaFilePreview.js +61 -48
  138. package/lib/module/components/styled/MediaFilePreview.js.map +1 -1
  139. package/lib/module/components/styled/MessageImage.js +16 -6
  140. package/lib/module/components/styled/MessageImage.js.map +1 -1
  141. package/lib/module/components/styled/SendInput.js +99 -68
  142. package/lib/module/components/styled/SendInput.js.map +1 -1
  143. package/lib/module/components/styled/VideoMessage.js +24 -10
  144. package/lib/module/components/styled/VideoMessage.js.map +1 -1
  145. package/lib/module/context/xmppProvider.js +46 -0
  146. package/lib/module/context/xmppProvider.js.map +1 -1
  147. package/lib/module/e2ee/fileEnvelope.js +1 -1
  148. package/lib/module/e2ee/fileEnvelope.js.map +1 -1
  149. package/lib/module/e2ee/sealedBody.js +32 -2
  150. package/lib/module/e2ee/sealedBody.js.map +1 -1
  151. package/lib/module/helpers/albumLayout.js +143 -0
  152. package/lib/module/helpers/albumLayout.js.map +1 -0
  153. package/lib/module/helpers/attachments.js +245 -0
  154. package/lib/module/helpers/attachments.js.map +1 -0
  155. package/lib/module/helpers/caption.js +207 -0
  156. package/lib/module/helpers/caption.js.map +1 -0
  157. package/lib/module/helpers/createMainMessageForThread.js +5 -1
  158. package/lib/module/helpers/createMainMessageForThread.js.map +1 -1
  159. package/lib/module/helpers/createMessageFromXml.js +20 -6
  160. package/lib/module/helpers/createMessageFromXml.js.map +1 -1
  161. package/lib/module/helpers/fileKind.js +34 -0
  162. package/lib/module/helpers/fileKind.js.map +1 -0
  163. package/lib/module/helpers/getDataFromXml.js +6 -1
  164. package/lib/module/helpers/getDataFromXml.js.map +1 -1
  165. package/lib/module/helpers/mapWithConcurrency.js +37 -0
  166. package/lib/module/helpers/mapWithConcurrency.js.map +1 -0
  167. package/lib/module/helpers/mediaLimits.js +27 -0
  168. package/lib/module/helpers/mediaLimits.js.map +1 -0
  169. package/lib/module/helpers/mediaSendRetry.js +55 -0
  170. package/lib/module/helpers/mediaSendRetry.js.map +1 -0
  171. package/lib/module/helpers/mediaWireData.js +58 -0
  172. package/lib/module/helpers/mediaWireData.js.map +1 -0
  173. package/lib/module/helpers/mentionSpans.js +14 -0
  174. package/lib/module/helpers/mentionSpans.js.map +1 -0
  175. package/lib/module/helpers/mimeToExtension.js +43 -0
  176. package/lib/module/helpers/mimeToExtension.js.map +1 -1
  177. package/lib/module/helpers/readReceipts.js +160 -0
  178. package/lib/module/helpers/readReceipts.js.map +1 -0
  179. package/lib/module/helpers/repairFilenameEncoding.js +74 -0
  180. package/lib/module/helpers/repairFilenameEncoding.js.map +1 -0
  181. package/lib/module/helpers/safeJson.js +13 -0
  182. package/lib/module/helpers/safeJson.js.map +1 -0
  183. package/lib/module/hooks/useSendMessage.js +387 -195
  184. package/lib/module/hooks/useSendMessage.js.map +1 -1
  185. package/lib/module/i18n/strings.js +96 -0
  186. package/lib/module/i18n/strings.js.map +1 -1
  187. package/lib/module/networking/api-requests/auth.api.js +62 -3
  188. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  189. package/lib/module/networking/stanzaHandlers.js +97 -4
  190. package/lib/module/networking/stanzaHandlers.js.map +1 -1
  191. package/lib/module/networking/xmpp/handleStanzas.xmpp.js +5 -3
  192. package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
  193. package/lib/module/networking/xmpp/sendDisplayedMarker.xmpp.js +25 -0
  194. package/lib/module/networking/xmpp/sendDisplayedMarker.xmpp.js.map +1 -0
  195. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js +53 -2
  196. package/lib/module/networking/xmpp/sendMediaMessage.xmpp.js.map +1 -1
  197. package/lib/module/networking/xmpp/sendReceivedReceipt.xmpp.js +25 -0
  198. package/lib/module/networking/xmpp/sendReceivedReceipt.xmpp.js.map +1 -0
  199. package/lib/module/networking/xmppClient.js +64 -0
  200. package/lib/module/networking/xmppClient.js.map +1 -1
  201. package/lib/module/roomStore/persistence.js +78 -5
  202. package/lib/module/roomStore/persistence.js.map +1 -1
  203. package/lib/module/roomStore/roomHeapSlice.js +4 -0
  204. package/lib/module/roomStore/roomHeapSlice.js.map +1 -1
  205. package/lib/module/roomStore/roomsSlice.js +109 -0
  206. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  207. package/lib/module/types/models/attachment.model.js +2 -0
  208. package/lib/module/types/models/attachment.model.js.map +1 -0
  209. package/lib/module/version.js +1 -1
  210. package/lib/typescript/assets/icons.d.ts +6 -1
  211. package/lib/typescript/assets/icons.d.ts.map +1 -1
  212. package/lib/typescript/components/MainComponents/AlbumGrid.d.ts +21 -0
  213. package/lib/typescript/components/MainComponents/AlbumGrid.d.ts.map +1 -0
  214. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  215. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  216. package/lib/typescript/components/MainComponents/MediaUploadOverlay.d.ts +17 -0
  217. package/lib/typescript/components/MainComponents/MediaUploadOverlay.d.ts.map +1 -0
  218. package/lib/typescript/components/MessageBubble/MediaCaption.d.ts +12 -0
  219. package/lib/typescript/components/MessageBubble/MediaCaption.d.ts.map +1 -0
  220. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  221. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  222. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  223. package/lib/typescript/components/RoomComponents/LastMessageItem.d.ts.map +1 -1
  224. package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts +2 -0
  225. package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts.map +1 -1
  226. package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts +2 -0
  227. package/lib/typescript/components/RoomComponents/styled/LastMessageFile.d.ts.map +1 -1
  228. package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts +2 -0
  229. package/lib/typescript/components/RoomComponents/styled/LastMessagePhoto.d.ts.map +1 -1
  230. package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts +2 -0
  231. package/lib/typescript/components/RoomComponents/styled/LastMessageVideo.d.ts.map +1 -1
  232. package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
  233. package/lib/typescript/components/styled/MediaFilePreview.d.ts.map +1 -1
  234. package/lib/typescript/components/styled/MessageImage.d.ts +10 -0
  235. package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
  236. package/lib/typescript/components/styled/SendInput.d.ts +7 -1
  237. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  238. package/lib/typescript/components/styled/VideoMessage.d.ts +7 -0
  239. package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
  240. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  241. package/lib/typescript/e2ee/fileEnvelope.d.ts +1 -1
  242. package/lib/typescript/e2ee/fileEnvelope.d.ts.map +1 -1
  243. package/lib/typescript/e2ee/sealedBody.d.ts +16 -0
  244. package/lib/typescript/e2ee/sealedBody.d.ts.map +1 -1
  245. package/lib/typescript/helpers/albumLayout.d.ts +66 -0
  246. package/lib/typescript/helpers/albumLayout.d.ts.map +1 -0
  247. package/lib/typescript/helpers/attachments.d.ts +55 -0
  248. package/lib/typescript/helpers/attachments.d.ts.map +1 -0
  249. package/lib/typescript/helpers/caption.d.ts +64 -0
  250. package/lib/typescript/helpers/caption.d.ts.map +1 -0
  251. package/lib/typescript/helpers/createMainMessageForThread.d.ts.map +1 -1
  252. package/lib/typescript/helpers/createMessageFromXml.d.ts.map +1 -1
  253. package/lib/typescript/helpers/fileKind.d.ts +20 -0
  254. package/lib/typescript/helpers/fileKind.d.ts.map +1 -0
  255. package/lib/typescript/helpers/getDataFromXml.d.ts.map +1 -1
  256. package/lib/typescript/helpers/mapWithConcurrency.d.ts +9 -0
  257. package/lib/typescript/helpers/mapWithConcurrency.d.ts.map +1 -0
  258. package/lib/typescript/helpers/mediaLimits.d.ts +13 -0
  259. package/lib/typescript/helpers/mediaLimits.d.ts.map +1 -0
  260. package/lib/typescript/helpers/mediaSendRetry.d.ts +26 -0
  261. package/lib/typescript/helpers/mediaSendRetry.d.ts.map +1 -0
  262. package/lib/typescript/helpers/mediaWireData.d.ts +16 -0
  263. package/lib/typescript/helpers/mediaWireData.d.ts.map +1 -0
  264. package/lib/typescript/helpers/mentionSpans.d.ts +8 -0
  265. package/lib/typescript/helpers/mentionSpans.d.ts.map +1 -0
  266. package/lib/typescript/helpers/mimeToExtension.d.ts +7 -0
  267. package/lib/typescript/helpers/mimeToExtension.d.ts.map +1 -1
  268. package/lib/typescript/helpers/readReceipts.d.ts +82 -0
  269. package/lib/typescript/helpers/readReceipts.d.ts.map +1 -0
  270. package/lib/typescript/helpers/repairFilenameEncoding.d.ts +12 -0
  271. package/lib/typescript/helpers/repairFilenameEncoding.d.ts.map +1 -0
  272. package/lib/typescript/helpers/safeJson.d.ts +2 -0
  273. package/lib/typescript/helpers/safeJson.d.ts.map +1 -0
  274. package/lib/typescript/hooks/useSendMessage.d.ts +2 -1
  275. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  276. package/lib/typescript/i18n/strings.d.ts.map +1 -1
  277. package/lib/typescript/networking/api-requests/auth.api.d.ts +2 -0
  278. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  279. package/lib/typescript/networking/stanzaHandlers.d.ts +7 -3
  280. package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
  281. package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
  282. package/lib/typescript/networking/xmpp/sendDisplayedMarker.xmpp.d.ts +3 -0
  283. package/lib/typescript/networking/xmpp/sendDisplayedMarker.xmpp.d.ts.map +1 -0
  284. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts +12 -0
  285. package/lib/typescript/networking/xmpp/sendMediaMessage.xmpp.d.ts.map +1 -1
  286. package/lib/typescript/networking/xmpp/sendReceivedReceipt.xmpp.d.ts +3 -0
  287. package/lib/typescript/networking/xmpp/sendReceivedReceipt.xmpp.d.ts.map +1 -0
  288. package/lib/typescript/networking/xmppClient.d.ts +15 -0
  289. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  290. package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
  291. package/lib/typescript/roomStore/roomHeapSlice.d.ts +22 -1
  292. package/lib/typescript/roomStore/roomHeapSlice.d.ts.map +1 -1
  293. package/lib/typescript/roomStore/roomsSlice.d.ts +67 -3
  294. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  295. package/lib/typescript/types/models/attachment.model.d.ts +52 -0
  296. package/lib/typescript/types/models/attachment.model.d.ts.map +1 -0
  297. package/lib/typescript/types/models/message.model.d.ts +26 -0
  298. package/lib/typescript/types/models/message.model.d.ts.map +1 -1
  299. package/lib/typescript/types/models/modal.model.d.ts +7 -0
  300. package/lib/typescript/types/models/modal.model.d.ts.map +1 -1
  301. package/lib/typescript/types/models/room.model.d.ts +2 -0
  302. package/lib/typescript/types/models/room.model.d.ts.map +1 -1
  303. package/lib/typescript/types/types.d.ts +29 -1
  304. package/lib/typescript/types/types.d.ts.map +1 -1
  305. package/lib/typescript/version.d.ts +1 -1
  306. package/package.json +4 -1
  307. package/plugins/notification-service/Info.plist +31 -0
  308. package/plugins/notification-service/NotificationService.swift +82 -0
  309. package/plugins/withNotificationServiceExtension.js +137 -0
  310. package/src/assets/icons.tsx +20 -2
  311. package/src/components/MainComponents/AlbumGrid.tsx +183 -0
  312. package/src/components/MainComponents/ChatRoom.tsx +4 -2
  313. package/src/components/MainComponents/MediaMessage.tsx +246 -130
  314. package/src/components/MainComponents/MediaUploadOverlay.tsx +102 -0
  315. package/src/components/MessageBubble/MediaCaption.tsx +45 -0
  316. package/src/components/MessageBubble/Message.tsx +71 -3
  317. package/src/components/MessageBubble/MessageInteractions.tsx +2 -1
  318. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +64 -0
  319. package/src/components/RoomComponents/LastMessageItem.tsx +15 -4
  320. package/src/components/RoomComponents/styled/LastAudioMessage.tsx +6 -3
  321. package/src/components/RoomComponents/styled/LastMessageFile.tsx +6 -2
  322. package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +6 -2
  323. package/src/components/RoomComponents/styled/LastMessageVideo.tsx +6 -2
  324. package/src/components/Thread/ThreadWrapper.tsx +5 -9
  325. package/src/components/styled/MediaFilePreview.tsx +49 -34
  326. package/src/components/styled/MessageImage.tsx +21 -5
  327. package/src/components/styled/SendInput.tsx +101 -87
  328. package/src/components/styled/VideoMessage.tsx +34 -9
  329. package/src/context/xmppProvider.tsx +32 -0
  330. package/src/e2ee/fileEnvelope.ts +1 -1
  331. package/src/e2ee/sealedBody.ts +44 -5
  332. package/src/helpers/albumLayout.ts +207 -0
  333. package/src/helpers/attachments.ts +316 -0
  334. package/src/helpers/caption.ts +283 -0
  335. package/src/helpers/createMainMessageForThread.ts +6 -1
  336. package/src/helpers/createMessageFromXml.ts +21 -5
  337. package/src/helpers/fileKind.ts +38 -0
  338. package/src/helpers/getDataFromXml.ts +5 -1
  339. package/src/helpers/mapWithConcurrency.ts +32 -0
  340. package/src/helpers/mediaLimits.ts +27 -0
  341. package/src/helpers/mediaSendRetry.ts +59 -0
  342. package/src/helpers/mediaWireData.ts +57 -0
  343. package/src/helpers/mentionSpans.ts +17 -0
  344. package/src/helpers/mimeToExtension.ts +51 -0
  345. package/src/helpers/readReceipts.ts +219 -0
  346. package/src/helpers/repairFilenameEncoding.ts +82 -0
  347. package/src/helpers/safeJson.ts +11 -0
  348. package/src/hooks/useSendMessage.tsx +448 -249
  349. package/src/i18n/strings.ts +96 -0
  350. package/src/networking/api-requests/auth.api.ts +60 -3
  351. package/src/networking/stanzaHandlers.ts +91 -2
  352. package/src/networking/xmpp/handleStanzas.xmpp.ts +6 -2
  353. package/src/networking/xmpp/sendDisplayedMarker.xmpp.ts +31 -0
  354. package/src/networking/xmpp/sendMediaMessage.xmpp.ts +60 -3
  355. package/src/networking/xmpp/sendReceivedReceipt.xmpp.ts +31 -0
  356. package/src/networking/xmppClient.ts +48 -0
  357. package/src/roomStore/persistence.ts +94 -3
  358. package/src/roomStore/roomHeapSlice.ts +23 -1
  359. package/src/roomStore/roomsSlice.ts +112 -1
  360. package/src/types/models/attachment.model.ts +51 -0
  361. package/src/types/models/message.model.ts +29 -0
  362. package/src/types/models/modal.model.ts +7 -0
  363. package/src/types/models/room.model.ts +2 -0
  364. package/src/types/types.ts +35 -1
  365. package/src/version.ts +1 -1
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { transformArrayToObject } from './transformTranslatations';
4
4
  import { normalizeXmppUsername } from './xmppUsername';
5
+ import { normalizeMediaDataAttrs } from './mediaWireData';
5
6
  const getLocalpartFromJid = jid => {
6
7
  const value = String(jid || '').trim();
7
8
  if (!value) {
@@ -74,7 +75,11 @@ export const getDataFromXml = async stanza => {
74
75
  id: userWallet,
75
76
  photoURL
76
77
  };
77
- const dataAttrs = data?.attrs || {};
78
+
79
+ // `attachments` and `caption` ride on <data> as strings; decode them here
80
+ // so every consumer sees the typed values (sealed captions are lifted from
81
+ // the encrypted body later, see createMessageFromXml).
82
+ const dataAttrs = normalizeMediaDataAttrs(data?.attrs || {});
78
83
  return {
79
84
  data: dataAttrs,
80
85
  id,
@@ -1 +1 @@
1
- {"version":3,"names":["transformArrayToObject","normalizeXmppUsername","getLocalpartFromJid","jid","value","String","trim","undefined","split","safeJsonParse","fallback","JSON","parse","normalizeTranslations","Array","isArray","filter","item","translatedText","language","languageName","extractTimestamp","str","stanza","console","log","toString","timestamp","slice","getDataFromXml","fullData","getChild","xmppId","attrs","id","xmppFrom","from","roomJid","userWalletFromResource","Date","now","body","getText","deleted","translationPayload","translations","translates","langSource","source","numericPart","exec","date","toISOString","data","photoURL","photo","rawUserWallet","senderJID","userWallet","user","dataAttrs"],"sourceRoot":"../../../src","sources":["helpers/getDataFromXml.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["transformArrayToObject","normalizeXmppUsername","normalizeMediaDataAttrs","getLocalpartFromJid","jid","value","String","trim","undefined","split","safeJsonParse","fallback","JSON","parse","normalizeTranslations","Array","isArray","filter","item","translatedText","language","languageName","extractTimestamp","str","stanza","console","log","toString","timestamp","slice","getDataFromXml","fullData","getChild","xmppId","attrs","id","xmppFrom","from","roomJid","userWalletFromResource","Date","now","body","getText","deleted","translationPayload","translations","translates","langSource","source","numericPart","exec","date","toISOString","data","photoURL","photo","rawUserWallet","senderJID","userWallet","user","dataAttrs"],"sourceRoot":"../../../src","sources":["helpers/getDataFromXml.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Runs `worker` over `items` with at most `limit` calls in flight, and
5
+ * resolves with the results in INPUT order, whatever order the calls finish
6
+ * in. Workers that throw are reported as rejected entries instead of
7
+ * aborting the rest of the batch, so one failed upload never stops its
8
+ * siblings.
9
+ */
10
+ export async function mapWithConcurrency(items, limit, worker) {
11
+ const results = new Array(items.length);
12
+ const width = Math.max(1, Math.min(Math.floor(limit) || 1, items.length));
13
+ let next = 0;
14
+ const lane = async () => {
15
+ while (next < items.length) {
16
+ const index = next;
17
+ next += 1;
18
+ try {
19
+ const value = await worker(items[index], index);
20
+ results[index] = {
21
+ status: 'fulfilled',
22
+ value
23
+ };
24
+ } catch (reason) {
25
+ results[index] = {
26
+ status: 'rejected',
27
+ reason
28
+ };
29
+ }
30
+ }
31
+ };
32
+ await Promise.all(Array.from({
33
+ length: width
34
+ }, () => lane()));
35
+ return results;
36
+ }
37
+ //# sourceMappingURL=mapWithConcurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["mapWithConcurrency","items","limit","worker","results","Array","length","width","Math","max","min","floor","next","lane","index","value","status","reason","Promise","all","from"],"sourceRoot":"../../../src","sources":["helpers/mapWithConcurrency.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeA,kBAAkBA,CACtCC,KAAmB,EACnBC,KAAa,EACbC,MAA8C,EACV;EACpC,MAAMC,OAAkC,GAAG,IAAIC,KAAK,CAACJ,KAAK,CAACK,MAAM,CAAC;EAClE,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAACF,IAAI,CAACG,KAAK,CAACT,KAAK,CAAC,IAAI,CAAC,EAAED,KAAK,CAACK,MAAM,CAAC,CAAC;EACzE,IAAIM,IAAI,GAAG,CAAC;EAEZ,MAAMC,IAAI,GAAG,MAAAA,CAAA,KAA2B;IACtC,OAAOD,IAAI,GAAGX,KAAK,CAACK,MAAM,EAAE;MAC1B,MAAMQ,KAAK,GAAGF,IAAI;MAClBA,IAAI,IAAI,CAAC;MACT,IAAI;QACF,MAAMG,KAAK,GAAG,MAAMZ,MAAM,CAACF,KAAK,CAACa,KAAK,CAAC,EAAGA,KAAK,CAAC;QAChDV,OAAO,CAACU,KAAK,CAAC,GAAG;UAAEE,MAAM,EAAE,WAAW;UAAED;QAAM,CAAC;MACjD,CAAC,CAAC,OAAOE,MAAM,EAAE;QACfb,OAAO,CAACU,KAAK,CAAC,GAAG;UAAEE,MAAM,EAAE,UAAU;UAAEC;QAAO,CAAC;MACjD;IACF;EACF,CAAC;EAED,MAAMC,OAAO,CAACC,GAAG,CAACd,KAAK,CAACe,IAAI,CAAC;IAAEd,MAAM,EAAEC;EAAM,CAAC,EAAE,MAAMM,IAAI,CAAC,CAAC,CAAC,CAAC;EAC9D,OAAOT,OAAO;AAChB","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ /** Hard client-side cap on a single upload. Mirrors the backend's body limit. */
4
+ export const MAX_MEDIA_BYTES = 50 * 1024 * 1024;
5
+
6
+ /** The most files one message may carry (also the parser-side ceiling). */
7
+ export const MAX_MEDIA_FILES = 10;
8
+
9
+ /** Files per message the host allows: `attachments.maxFiles`, clamped to 1-10. */
10
+ export const mediaFileCap = config => {
11
+ const configured = Number(config?.attachments?.maxFiles);
12
+ if (!Number.isFinite(configured)) {
13
+ return MAX_MEDIA_FILES;
14
+ }
15
+ return Math.min(MAX_MEDIA_FILES, Math.max(1, Math.floor(configured)));
16
+ };
17
+
18
+ /**
19
+ * Bytes allowed per file: the 50 MB upload cap, lowered by
20
+ * `attachments.maxSizeMB` when the host sets a smaller one.
21
+ */
22
+ export const mediaSizeLimit = (config, override) => {
23
+ const base = typeof override === 'number' && override > 0 ? Math.min(override, MAX_MEDIA_BYTES) : MAX_MEDIA_BYTES;
24
+ const mb = Number(config?.attachments?.maxSizeMB);
25
+ return Number.isFinite(mb) && mb > 0 ? Math.min(base, mb * 1024 * 1024) : base;
26
+ };
27
+ //# sourceMappingURL=mediaLimits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MAX_MEDIA_BYTES","MAX_MEDIA_FILES","mediaFileCap","config","configured","Number","attachments","maxFiles","isFinite","Math","min","max","floor","mediaSizeLimit","override","base","mb","maxSizeMB"],"sourceRoot":"../../../src","sources":["helpers/mediaLimits.ts"],"mappings":";;AAEA;AACA,OAAO,MAAMA,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;;AAE/C;AACA,OAAO,MAAMC,eAAe,GAAG,EAAE;;AAEjC;AACA,OAAO,MAAMC,YAAY,GAAIC,MAA4C,IAAa;EACpF,MAAMC,UAAU,GAAGC,MAAM,CAACF,MAAM,EAAEG,WAAW,EAAEC,QAAQ,CAAC;EACxD,IAAI,CAACF,MAAM,CAACG,QAAQ,CAACJ,UAAU,CAAC,EAAE;IAAC,OAAOH,eAAe;EAAC;EAC1D,OAAOQ,IAAI,CAACC,GAAG,CAACT,eAAe,EAAEQ,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEF,IAAI,CAACG,KAAK,CAACR,UAAU,CAAC,CAAC,CAAC;AACvE,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMS,cAAc,GAAGA,CAC5BV,MAA4C,EAC5CW,QAAiB,KACN;EACX,MAAMC,IAAI,GAAG,OAAOD,QAAQ,KAAK,QAAQ,IAAIA,QAAQ,GAAG,CAAC,GAAGL,IAAI,CAACC,GAAG,CAACI,QAAQ,EAAEd,eAAe,CAAC,GAAGA,eAAe;EACjH,MAAMgB,EAAE,GAAGX,MAAM,CAACF,MAAM,EAAEG,WAAW,EAAEW,SAAS,CAAC;EACjD,OAAOZ,MAAM,CAACG,QAAQ,CAACQ,EAAE,CAAC,IAAIA,EAAE,GAAG,CAAC,GAAGP,IAAI,CAACC,GAAG,CAACK,IAAI,EAAEC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,GAAGD,IAAI;AAChF,CAAC","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Retry hooks for media messages whose uploads did not all land.
5
+ *
6
+ * The send closure lives inside useSendMessage, but the bubble that shows
7
+ * "Retry" on a tile is somewhere else in the tree and has no access to it.
8
+ * The send registers its retry runner under the message id while the
9
+ * message is unsent, and the bubble looks it up here. The runner is removed
10
+ * as soon as the message is delivered.
11
+ */
12
+
13
+ const runners = new Map();
14
+ export const registerMediaRetry = (messageId, runner) => {
15
+ runners.set(messageId, runner);
16
+ };
17
+ export const unregisterMediaRetry = messageId => {
18
+ runners.delete(messageId);
19
+ };
20
+ export const hasMediaRetry = messageId => runners.has(messageId);
21
+
22
+ /**
23
+ * Re-runs the uploads still missing for `messageId` (only `index` / `indices`
24
+ * when given), then sends the message once every file is in. Resolves to
25
+ * false when nothing is registered or the attempt did not deliver.
26
+ */
27
+ export const retryMediaSend = async (messageId, index) => {
28
+ const runner = runners.get(messageId);
29
+ if (!runner) {
30
+ return false;
31
+ }
32
+ const indices = index === undefined ? undefined : Array.isArray(index) ? index : [index];
33
+ return runner(indices);
34
+ };
35
+ const pendingRetryIndices = new Map();
36
+
37
+ /**
38
+ * Asks for one file of `messageId` to be retried. Requests made in the same
39
+ * tick are merged into one run: the runner takes a single run at a time, so
40
+ * a separate call per tile would drop every retry after the first.
41
+ */
42
+ export const requestMediaRetry = (messageId, index) => {
43
+ const batch = pendingRetryIndices.get(messageId);
44
+ if (batch) {
45
+ batch.add(index);
46
+ return;
47
+ }
48
+ const next = new Set([index]);
49
+ pendingRetryIndices.set(messageId, next);
50
+ queueMicrotask(() => {
51
+ pendingRetryIndices.delete(messageId);
52
+ retryMediaSend(messageId, [...next]).catch(() => false);
53
+ });
54
+ };
55
+ //# sourceMappingURL=mediaSendRetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["runners","Map","registerMediaRetry","messageId","runner","set","unregisterMediaRetry","delete","hasMediaRetry","has","retryMediaSend","index","get","indices","undefined","Array","isArray","pendingRetryIndices","requestMediaRetry","batch","add","next","Set","queueMicrotask","catch"],"sourceRoot":"../../../src","sources":["helpers/mediaSendRetry.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,MAAMA,OAAO,GAAG,IAAIC,GAAG,CAA2B,CAAC;AAEnD,OAAO,MAAMC,kBAAkB,GAAGA,CAACC,SAAiB,EAAEC,MAAwB,KAAW;EACvFJ,OAAO,CAACK,GAAG,CAACF,SAAS,EAAEC,MAAM,CAAC;AAChC,CAAC;AAED,OAAO,MAAME,oBAAoB,GAAIH,SAAiB,IAAW;EAC/DH,OAAO,CAACO,MAAM,CAACJ,SAAS,CAAC;AAC3B,CAAC;AAED,OAAO,MAAMK,aAAa,GAAIL,SAAiB,IAAcH,OAAO,CAACS,GAAG,CAACN,SAAS,CAAC;;AAEnF;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMO,cAAc,GAAG,MAAAA,CAC5BP,SAAiB,EACjBQ,KAAyB,KACJ;EACrB,MAAMP,MAAM,GAAGJ,OAAO,CAACY,GAAG,CAACT,SAAS,CAAC;EACrC,IAAI,CAACC,MAAM,EAAE;IAAC,OAAO,KAAK;EAAC;EAC3B,MAAMS,OAAO,GAAGF,KAAK,KAAKG,SAAS,GAAGA,SAAS,GAAGC,KAAK,CAACC,OAAO,CAACL,KAAK,CAAC,GAAGA,KAAK,GAAG,CAACA,KAAK,CAAC;EACxF,OAAOP,MAAM,CAACS,OAAO,CAAC;AACxB,CAAC;AAED,MAAMI,mBAAmB,GAAG,IAAIhB,GAAG,CAAsB,CAAC;;AAE1D;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMiB,iBAAiB,GAAGA,CAACf,SAAiB,EAAEQ,KAAa,KAAW;EAC3E,MAAMQ,KAAK,GAAGF,mBAAmB,CAACL,GAAG,CAACT,SAAS,CAAC;EAChD,IAAIgB,KAAK,EAAE;IACTA,KAAK,CAACC,GAAG,CAACT,KAAK,CAAC;IAChB;EACF;EACA,MAAMU,IAAI,GAAG,IAAIC,GAAG,CAAS,CAACX,KAAK,CAAC,CAAC;EACrCM,mBAAmB,CAACZ,GAAG,CAACF,SAAS,EAAEkB,IAAI,CAAC;EACxCE,cAAc,CAAC,MAAM;IACnBN,mBAAmB,CAACV,MAAM,CAACJ,SAAS,CAAC;IACrCO,cAAc,CAACP,SAAS,EAAE,CAAC,GAAGkB,IAAI,CAAC,CAAC,CAACG,KAAK,CAAC,MAAM,KAAK,CAAC;EACzD,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ import { parseAttachments } from './attachments';
4
+ import { getMessageCaption, normalizeCaptionMentions } from './caption';
5
+
6
+ /**
7
+ * Normalises the media parts of a message's flat `<data>` attributes:
8
+ *
9
+ * - `attachments` (a JSON string on the wire) becomes the typed array, or is
10
+ * dropped when it decodes to nothing so the flat legacy fields win;
11
+ * - `caption` is kept only when it holds text, with `captionMentions` (JSON
12
+ * on the wire) checked against it;
13
+ * - in a sealed message (`clientEncrypted`) the caption attributes are
14
+ * always dropped: the only caption such a message may show is the one
15
+ * inside its encrypted body, which the caller lifts afterwards.
16
+ *
17
+ * Safe to apply twice, so the wrapped and the positional parsers can both
18
+ * call it.
19
+ */
20
+ export const normalizeMediaDataAttrs = attrs => {
21
+ const out = {
22
+ ...attrs
23
+ };
24
+ if ('attachments' in out) {
25
+ const attachments = parseAttachments(out.attachments);
26
+ if (attachments.length > 0) {
27
+ out.attachments = attachments;
28
+ } else {
29
+ delete out.attachments;
30
+ }
31
+ }
32
+ if (out.clientEncrypted === 'true') {
33
+ delete out.caption;
34
+ delete out.captionMentions;
35
+ return out;
36
+ }
37
+ if ('caption' in out) {
38
+ const caption = getMessageCaption({
39
+ caption: out.caption
40
+ });
41
+ if (caption) {
42
+ out.caption = caption;
43
+ const spans = normalizeCaptionMentions(out.captionMentions, caption);
44
+ if (spans) {
45
+ out.captionMentions = spans;
46
+ } else {
47
+ delete out.captionMentions;
48
+ }
49
+ } else {
50
+ delete out.caption;
51
+ delete out.captionMentions;
52
+ }
53
+ } else if ('captionMentions' in out) {
54
+ delete out.captionMentions;
55
+ }
56
+ return out;
57
+ };
58
+ //# sourceMappingURL=mediaWireData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["parseAttachments","getMessageCaption","normalizeCaptionMentions","normalizeMediaDataAttrs","attrs","out","attachments","length","clientEncrypted","caption","captionMentions","spans"],"sourceRoot":"../../../src","sources":["helpers/mediaWireData.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,eAAe;AAChD,SAASC,iBAAiB,EAAEC,wBAAwB,QAAQ,WAAW;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,uBAAuB,GAClCC,KAA0B,IACF;EACxB,MAAMC,GAAwB,GAAG;IAAE,GAAGD;EAAM,CAAC;EAE7C,IAAI,aAAa,IAAIC,GAAG,EAAE;IACxB,MAAMC,WAAW,GAAGN,gBAAgB,CAACK,GAAG,CAACC,WAAW,CAAC;IACrD,IAAIA,WAAW,CAACC,MAAM,GAAG,CAAC,EAAE;MAC1BF,GAAG,CAACC,WAAW,GAAGA,WAAW;IAC/B,CAAC,MAAM;MACL,OAAOD,GAAG,CAACC,WAAW;IACxB;EACF;EAEA,IAAID,GAAG,CAACG,eAAe,KAAK,MAAM,EAAE;IAClC,OAAOH,GAAG,CAACI,OAAO;IAClB,OAAOJ,GAAG,CAACK,eAAe;IAC1B,OAAOL,GAAG;EACZ;EAEA,IAAI,SAAS,IAAIA,GAAG,EAAE;IACpB,MAAMI,OAAO,GAAGR,iBAAiB,CAAC;MAAEQ,OAAO,EAAEJ,GAAG,CAACI;IAAQ,CAAC,CAAC;IAC3D,IAAIA,OAAO,EAAE;MACXJ,GAAG,CAACI,OAAO,GAAGA,OAAO;MACrB,MAAME,KAAK,GAAGT,wBAAwB,CAACG,GAAG,CAACK,eAAe,EAAED,OAAO,CAAC;MACpE,IAAIE,KAAK,EAAE;QACTN,GAAG,CAACK,eAAe,GAAGC,KAAK;MAC7B,CAAC,MAAM;QACL,OAAON,GAAG,CAACK,eAAe;MAC5B;IACF,CAAC,MAAM;MACL,OAAOL,GAAG,CAACI,OAAO;MAClB,OAAOJ,GAAG,CAACK,eAAe;IAC5B;EACF,CAAC,MAAM,IAAI,iBAAiB,IAAIL,GAAG,EAAE;IACnC,OAAOA,GAAG,CAACK,eAAe;EAC5B;EAEA,OAAOL,GAAG;AACZ,CAAC","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Keeps only the spans that still read "@Name" at their offset in `text`.
5
+ * RN does not render mentions; a caption's spans are stored (and checked) so
6
+ * they survive a round trip to a client that does.
7
+ */
8
+ export const validateMentionSpans = (text, spans) => spans.filter(span => {
9
+ if (span.offset < 0 || span.offset + span.length > text.length) {
10
+ return false;
11
+ }
12
+ return text.slice(span.offset, span.offset + span.length) === `@${span.name}`;
13
+ });
14
+ //# sourceMappingURL=mentionSpans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["validateMentionSpans","text","spans","filter","span","offset","length","slice","name"],"sourceRoot":"../../../src","sources":["helpers/mentionSpans.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,GAAGA,CAClCC,IAAY,EACZC,KAAqB,KAErBA,KAAK,CAACC,MAAM,CAAEC,IAAI,IAAK;EACrB,IAAIA,IAAI,CAACC,MAAM,GAAG,CAAC,IAAID,IAAI,CAACC,MAAM,GAAGD,IAAI,CAACE,MAAM,GAAGL,IAAI,CAACK,MAAM,EAAE;IAC9D,OAAO,KAAK;EACd;EACA,OAAOL,IAAI,CAACM,KAAK,CAACH,IAAI,CAACC,MAAM,EAAED,IAAI,CAACC,MAAM,GAAGD,IAAI,CAACE,MAAM,CAAC,KAAK,IAAIF,IAAI,CAACI,IAAI,EAAE;AAC/E,CAAC,CAAC","ignoreList":[]}
@@ -59,6 +59,49 @@ const MIME_TO_EXT = {
59
59
  };
60
60
  const VALID_EXT_RE = /\.[a-z0-9]{1,8}$/i;
61
61
 
62
+ // Extensions that stand for a picture, video, audio or PDF a bubble can
63
+ // show, read back from the table above (first entry per extension wins).
64
+ // `.webm` and `.svg` are left out on purpose: a recorded voice note is often
65
+ // a `.webm` and must stay generic (audio), and SVG is not a bubble picture.
66
+ const INFERRABLE_EXT_TO_MIME = {};
67
+ for (const [mime, ext] of Object.entries(MIME_TO_EXT)) {
68
+ const inferrable = mime === 'application/pdf' || mime.startsWith('image/') || mime.startsWith('video/') || mime.startsWith('audio/');
69
+ const bare = ext.slice(1);
70
+ if (inferrable && bare !== 'webm' && bare !== 'svg' && !INFERRABLE_EXT_TO_MIME[bare]) {
71
+ INFERRABLE_EXT_TO_MIME[bare] = mime;
72
+ }
73
+ }
74
+ // Spellings the table above has no entry for.
75
+ Object.assign(INFERRABLE_EXT_TO_MIME, {
76
+ jpeg: 'image/jpeg',
77
+ jpe: 'image/jpeg',
78
+ tif: 'image/tiff',
79
+ avif: 'image/avif',
80
+ avi: 'video/x-msvideo',
81
+ oga: 'audio/ogg',
82
+ opus: 'audio/ogg',
83
+ amr: 'audio/amr'
84
+ });
85
+
86
+ /** A mimetype that says nothing: empty, or the storage's "could not sniff". */
87
+ export function isGenericMime(mime) {
88
+ const normalized = (mime || '').toLowerCase().split(';')[0].trim();
89
+ return !normalized || normalized === 'application/octet-stream' || normalized === 'binary/octet-stream';
90
+ }
91
+
92
+ /**
93
+ * The mimetype a file name's extension stands for, for the pictures, videos,
94
+ * audio and PDFs a bubble can show. Undefined for anything else.
95
+ */
96
+ export function inferMimeFromName(name) {
97
+ const base = String(name || '').split(/[?#]/)[0];
98
+ const dot = base.lastIndexOf('.');
99
+ if (dot < 1) {
100
+ return undefined;
101
+ }
102
+ return INFERRABLE_EXT_TO_MIME[base.slice(dot + 1).toLowerCase()];
103
+ }
104
+
62
105
  // Audio file extensions we recognise across the SDK. Used for the
63
106
  // "looks like audio even when the mimetype is application/octet-stream"
64
107
  // heuristic in MediaMessage / FilePreviewModal. Voice-message senders
@@ -1 +1 @@
1
- {"version":3,"names":["MIME_TO_EXT","VALID_EXT_RE","AUDIO_EXTENSIONS","IOS_AUDIO_PLAYBACK_EXTENSIONS","IOS_AUDIO_UNSUPPORTED_EXTENSIONS","AUDIO_EXT_RE","RegExp","map","e","replace","join","IOS_AUDIO_PLAYBACK_EXT_RE","AUDIO_NAME_HINT_RE","isLikelyAudio","mime","fileName","url","opts","m","toLowerCase","startsWith","durationNum","duration","Number","isFinite","waveForm","trim","length","name","originalName","urlLast","filenameFromUrl","test","urlPath","noQuery","split","decodeURIComponent","getExtensionForMime","normalized","last","pop","getLowerExtension","value","match","shouldCacheAudioForIosPlayback","src","urlName","candidates","hasIosPlayableName","some","getIosAudioPlaybackCacheExtension","candidate","ext","isUnsupportedAudioForIosPlayback","includes","ensureFilenameHasExtension","base","Date","now"],"sourceRoot":"../../../src","sources":["helpers/mimeToExtension.ts"],"mappings":";;AAAA;AACA;AACA;;AAEA,MAAMA,WAAmC,GAAG;EAC1C;EACA,YAAY,EAAE,MAAM;EACpB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,MAAM;EACnB,YAAY,EAAE,OAAO;EACrB,YAAY,EAAE,OAAO;EACrB,YAAY,EAAE,OAAO;EACrB,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,MAAM;EACvB,YAAY,EAAE,OAAO;EAErB;EACA,WAAW,EAAE,MAAM;EACnB,iBAAiB,EAAE,MAAM;EACzB,aAAa,EAAE,MAAM;EACrB,YAAY,EAAE,OAAO;EACrB,YAAY,EAAE,MAAM;EACpB,kBAAkB,EAAE,MAAM;EAC1B,YAAY,EAAE,OAAO;EAErB;EACA,YAAY,EAAE,MAAM;EACpB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,MAAM;EACnB,aAAa,EAAE,MAAM;EACrB,WAAW,EAAE,MAAM;EACnB,aAAa,EAAE,MAAM;EACrB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,MAAM;EACnB,YAAY,EAAE,OAAO;EACrB,YAAY,EAAE,OAAO;EAErB;EACA,iBAAiB,EAAE,MAAM;EACzB,oBAAoB,EAAE,MAAM;EAC5B,yEAAyE,EACvE,OAAO;EACT,0BAA0B,EAAE,MAAM;EAClC,mEAAmE,EAAE,OAAO;EAC5E,+BAA+B,EAAE,MAAM;EACvC,2EAA2E,EACzE,OAAO;EACT,YAAY,EAAE,MAAM;EACpB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,OAAO;EACpB,kBAAkB,EAAE,OAAO;EAC3B,iBAAiB,EAAE,MAAM;EACzB,UAAU,EAAE,MAAM;EAClB,iBAAiB,EAAE,MAAM;EAEzB;EACA,iBAAiB,EAAE,MAAM;EACzB,8BAA8B,EAAE,MAAM;EACtC,6BAA6B,EAAE,KAAK;EACpC,kBAAkB,EAAE,KAAK;EACzB,mBAAmB,EAAE;AACvB,CAAC;AAED,MAAMC,YAAY,GAAG,mBAAmB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,gBAAgB,GAAG,CACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAC1C;AACV,MAAMC,6BAA6B,GAAG,CACpC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC9C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAChC;AACV,MAAMC,gCAAgC,GAAG,CACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CACzB;AACV,MAAMC,YAAY,GAAG,IAAIC,MAAM,CAC7B,IAAIJ,gBAAgB,CAACK,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,IAAI,EACpE,GACF,CAAC;AACD,MAAMC,yBAAyB,GAAG,IAAIL,MAAM,CAC1C,IAAIH,6BAA6B,CAACI,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,IAAI,EACjF,GACF,CAAC;AACD;AACA;AACA;AACA,MAAME,kBAAkB,GACtB,qGAAqG;;AAEvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAC3BC,IAA+B,EAC/BC,QAAwB,EACxBC,GAAmB,EACnBC,IAIC,EACQ;EACT,MAAMC,CAAC,GAAG,CAACJ,IAAI,IAAI,EAAE,EAAEK,WAAW,CAAC,CAAC;EACpC,IAAID,CAAC,CAACE,UAAU,CAAC,QAAQ,CAAC,EAAE;IAAC,OAAO,IAAI;EAAC;EACzC,MAAMC,WAAW,GACf,OAAOJ,IAAI,EAAEK,QAAQ,KAAK,QAAQ,GAC9BC,MAAM,CAACN,IAAI,CAACK,QAAQ,CAAC,GACrBL,IAAI,EAAEK,QAAQ,IAAI,CAAC;EACzB,IAAIC,MAAM,CAACC,QAAQ,CAACH,WAAW,CAAC,IAAIA,WAAW,GAAG,CAAC,EAAE;IAAC,OAAO,IAAI;EAAC;EAClE,IAAI,OAAOJ,IAAI,EAAEQ,QAAQ,KAAK,QAAQ,IAAIR,IAAI,CAACQ,QAAQ,CAACC,IAAI,CAAC,CAAC,CAACC,MAAM,GAAG,CAAC,EAAE;IACzE,OAAO,IAAI;EACb;EACA;EACA;EACA;EACA,MAAMC,IAAI,GAAG,CAACb,QAAQ,IAAI,EAAE,EAAEI,WAAW,CAAC,CAAC;EAC3C,MAAMU,YAAY,GAAG,CAACZ,IAAI,EAAEY,YAAY,IAAI,EAAE,EAAEV,WAAW,CAAC,CAAC;EAC7D,MAAMW,OAAO,GAAGC,eAAe,CAACf,GAAG,CAAC,CAACG,WAAW,CAAC,CAAC;EAClD,IACEd,YAAY,CAAC2B,IAAI,CAACJ,IAAI,CAAC,IACvBvB,YAAY,CAAC2B,IAAI,CAACH,YAAY,CAAC,IAC/BxB,YAAY,CAAC2B,IAAI,CAACF,OAAO,CAAC,EAC1B;IACA,OAAO,IAAI;EACb;EACA;EACA;EACA;EACA;EACA,MAAMG,OAAO,GAAG,CAAC,MAAM;IACrB,IAAI,CAACjB,GAAG,EAAE;MAAC,OAAO,EAAE;IAAC;IACrB,IAAI;MACF,MAAMkB,OAAO,GAAGlB,GAAG,CAACmB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAEA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE;MACjD,OAAOC,kBAAkB,CAACF,OAAO,CAAC,CAACf,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC,MAAM;MACN,OAAO,EAAE;IACX;EACF,CAAC,EAAE,CAAC;EACJ,IACEP,kBAAkB,CAACoB,IAAI,CAACJ,IAAI,CAAC,IAC7BhB,kBAAkB,CAACoB,IAAI,CAACH,YAAY,CAAC,IACrCjB,kBAAkB,CAACoB,IAAI,CAACF,OAAO,CAAC,IAChClB,kBAAkB,CAACoB,IAAI,CAACC,OAAO,CAAC,EAChC;IACA,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,mBAAmBA,CAACvB,IAA+B,EAAU;EAC3E,IAAI,CAACA,IAAI,EAAE;IAAC,OAAO,MAAM;EAAC;EAC1B,MAAMwB,UAAU,GAAGxB,IAAI,CAACK,WAAW,CAAC,CAAC,CAACgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAET,IAAI,CAAC,CAAC;EAC3D,OAAO1B,WAAW,CAACsC,UAAU,CAAC,IAAI,MAAM;AAC1C;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASP,eAAeA,CAACf,GAA8B,EAAU;EACtE,IAAI,CAACA,GAAG,EAAE;IAAC,OAAO,EAAE;EAAC;EACrB,IAAI;IACF;IACA;IACA,MAAMkB,OAAO,GAAGlB,GAAG,CAACmB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAEA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE;IACjD,MAAMI,IAAI,GAAGL,OAAO,CAACC,KAAK,CAAC,GAAG,CAAC,CAACK,GAAG,CAAC,CAAC,IAAI,EAAE;IAC3C,OAAOJ,kBAAkB,CAACG,IAAI,CAAC;EACjC,CAAC,CAAC,MAAM;IACN,OAAO,EAAE;EACX;AACF;AAEA,MAAME,iBAAiB,GAAIC,KAAgC,IAAK;EAC9D,IAAI,CAACA,KAAK,EAAE;IAAC,OAAO,EAAE;EAAC;EACvB,MAAMC,KAAK,GAAGD,KAAK,CAACvB,WAAW,CAAC,CAAC,CAACwB,KAAK,CAAC1C,YAAY,CAAC;EACrD,OAAO0C,KAAK,GAAGA,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;AAC9B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,8BAA8BA,CAAC3B,IAO9C,EAAW;EACV,MAAM4B,GAAG,GAAG5B,IAAI,CAAC4B,GAAG,IAAI,EAAE;EAC1B,IAAI,CAAC,eAAe,CAACb,IAAI,CAACa,GAAG,CAAC,EAAE;IAAC,OAAO,KAAK;EAAC;EAE9C,MAAM/B,IAAI,GAAG,CAACG,IAAI,CAACH,IAAI,IAAI,EAAE,EAAEK,WAAW,CAAC,CAAC,CAACgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAET,IAAI,CAAC,CAAC;EAClE,MAAMoB,OAAO,GAAGf,eAAe,CAACc,GAAG,CAAC;EACpC,MAAME,UAAU,GAAG,CAACD,OAAO,EAAE7B,IAAI,CAACF,QAAQ,IAAI,EAAE,EAAEE,IAAI,CAACY,YAAY,IAAI,EAAE,CAAC;EAC1E,MAAMmB,kBAAkB,GAAGD,UAAU,CAACE,IAAI,CAAEP,KAAK,IAC/C/B,yBAAyB,CAACqB,IAAI,CAACU,KAAK,CACtC,CAAC;EACD,IAAIM,kBAAkB,IAAIlC,IAAI,CAACM,UAAU,CAAC,QAAQ,CAAC,EAAE;IAAC,OAAO,KAAK;EAAC;EAEnE,OAAOP,aAAa,CAACC,IAAI,EAAEG,IAAI,CAACF,QAAQ,EAAE8B,GAAG,EAAE;IAC7CvB,QAAQ,EAAEL,IAAI,CAACK,QAAQ;IACvBG,QAAQ,EAAER,IAAI,CAACQ,QAAQ;IACvBI,YAAY,EAAEZ,IAAI,CAACY;EACrB,CAAC,CAAC;AACJ;AAEA,OAAO,SAASqB,iCAAiCA,CAACjC,IAKjD,EAAU;EACT,MAAM8B,UAAU,GAAG,CACjB9B,IAAI,CAACF,QAAQ,EACbE,IAAI,CAACY,YAAY,EACjBE,eAAe,CAACd,IAAI,CAACD,GAAG,CAAC,EACzBqB,mBAAmB,CAACpB,IAAI,CAACH,IAAI,CAAC,CAC/B;EACD,KAAK,MAAMqC,SAAS,IAAIJ,UAAU,EAAE;IAClC,MAAMK,GAAG,GAAGX,iBAAiB,CAACU,SAAS,CAAC;IACxC,IAAIC,GAAG,IAAIzC,yBAAyB,CAACqB,IAAI,CAACoB,GAAG,CAAC,EAAE;MAC9C,OAAOA,GAAG,KAAK,MAAM,GAAG,MAAM,GAAGA,GAAG;IACtC;EACF;EACA,OAAO,MAAM;AACf;AAEA,OAAO,SAASC,gCAAgCA,CAACpC,IAKhD,EAAW;EACV,MAAMH,IAAI,GAAG,CAACG,IAAI,CAACH,IAAI,IAAI,EAAE,EAAEK,WAAW,CAAC,CAAC,CAACgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAET,IAAI,CAAC,CAAC;EAClE,IAAIZ,IAAI,KAAK,YAAY,IAAIA,IAAI,KAAK,WAAW,EAAE;IACjD,OAAO,IAAI;EACb;EACA,MAAMiC,UAAU,GAAG,CACjB9B,IAAI,CAACF,QAAQ,EACbE,IAAI,CAACY,YAAY,EACjBE,eAAe,CAACd,IAAI,CAACD,GAAG,CAAC,CAC1B;EACD,OAAO+B,UAAU,CAACE,IAAI,CAAEE,SAAS,IAAK;IACpC,MAAMC,GAAG,GAAGX,iBAAiB,CAACU,SAAS,CAAC;IACxC,OAAO/C,gCAAgC,CAACkD,QAAQ,CAC9CF,GACF,CAAC;EACH,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,0BAA0BA,CACxCxC,QAAmC,EACnCD,IAA+B,EACvB;EACR,MAAM0C,IAAI,GACPzC,QAAQ,IAAIA,QAAQ,CAACW,IAAI,CAAC,CAAC,IAAK,SAAS+B,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;EACxD,IAAIzD,YAAY,CAAC+B,IAAI,CAACwB,IAAI,CAAC,EAAE;IAAC,OAAOA,IAAI;EAAC;EAC1C,OAAO,GAAGA,IAAI,GAAGnB,mBAAmB,CAACvB,IAAI,CAAC,EAAE;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"names":["MIME_TO_EXT","VALID_EXT_RE","INFERRABLE_EXT_TO_MIME","mime","ext","Object","entries","inferrable","startsWith","bare","slice","assign","jpeg","jpe","tif","avif","avi","oga","opus","amr","isGenericMime","normalized","toLowerCase","split","trim","inferMimeFromName","name","base","String","dot","lastIndexOf","undefined","AUDIO_EXTENSIONS","IOS_AUDIO_PLAYBACK_EXTENSIONS","IOS_AUDIO_UNSUPPORTED_EXTENSIONS","AUDIO_EXT_RE","RegExp","map","e","replace","join","IOS_AUDIO_PLAYBACK_EXT_RE","AUDIO_NAME_HINT_RE","isLikelyAudio","fileName","url","opts","m","durationNum","duration","Number","isFinite","waveForm","length","originalName","urlLast","filenameFromUrl","test","urlPath","noQuery","decodeURIComponent","getExtensionForMime","last","pop","getLowerExtension","value","match","shouldCacheAudioForIosPlayback","src","urlName","candidates","hasIosPlayableName","some","getIosAudioPlaybackCacheExtension","candidate","isUnsupportedAudioForIosPlayback","includes","ensureFilenameHasExtension","Date","now"],"sourceRoot":"../../../src","sources":["helpers/mimeToExtension.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+
3
+ import { msgSortableMs } from './msgSortableMs';
4
+ import { isOwnMessage } from './isOwnMessage';
5
+ import { createUserNameFromSetUser } from './createUserNameFromSetUser';
6
+
7
+ // Delivery (XEP-0184) and read (XEP-0333) state for the reader's own messages.
8
+ // Pure helpers: the reducers, the stanza handlers, the flush that sends the
9
+ // read watermark and the bubble all read the same rules from here.
10
+ //
11
+ // Receipts are session-only. receivedBy / lastDisplayedByUser are never
12
+ // written to disk (see persistence.ts), so after a reload every own message
13
+ // falls back to "sent" until the peers acknowledge again.
14
+
15
+ /** Names listed in a "Read by" / "Delivered to" sheet before the rest become "+N". */
16
+ export const RECEIPT_NAME_LIMIT = 5;
17
+ const NO_VIEWERS = [];
18
+
19
+ /** Stanza ids of the receipt and marker frames (never chat messages). */
20
+ export const isReceiptMarkerId = id => {
21
+ const value = String(id ?? '');
22
+ return value.startsWith('message-received') || value.startsWith('message-displayed');
23
+ };
24
+
25
+ // A message the reader can be shown as displayed: not an optimistic send,
26
+ // not the "New messages" divider, not a client-only call-log row.
27
+ const isDisplayableForReceipts = message => {
28
+ if (!message) return false;
29
+ if (message.pending) return false;
30
+ if (message.id === 'delimiter-new') return false;
31
+ if (String(message.id || '').startsWith('calllog-')) return false;
32
+ return true;
33
+ };
34
+
35
+ /**
36
+ * The message id that becomes this reader's read watermark, or null when
37
+ * nothing should be sent: no displayable message, the newest message is the
38
+ * reader's own (nothing to report), or a read boundary (the reader scrolled
39
+ * up) sits before every message. With a boundary the watermark is the newest
40
+ * message at or before it, so a scrolled-up reader never claims messages they
41
+ * did not reach.
42
+ */
43
+ export const getReadWatermarkMessageId = (room, selfXmppUsername, boundaryTs) => {
44
+ if (!selfXmppUsername) return null;
45
+ const messages = (room?.messages || []).filter(isDisplayableForReceipts);
46
+ if (messages.length === 0) return null;
47
+ const newest = messages[messages.length - 1];
48
+ if (isOwnMessage(newest, selfXmppUsername)) return null;
49
+ if (typeof boundaryTs === 'number' && boundaryTs > 0) {
50
+ for (let i = messages.length - 1; i >= 0; i--) {
51
+ if (msgSortableMs(messages[i]) <= boundaryTs) return String(messages[i].id);
52
+ }
53
+ return null;
54
+ }
55
+ return String(newest.id);
56
+ };
57
+
58
+ /** The slice of the redux state the receipt rules read. */
59
+
60
+ // The reader's identity as the message list resolves it (xmppUsername, then
61
+ // walletAddress), so the watermark and the bubble agree on "own".
62
+ export const selfIdentity = state => state.chatSettingStore?.user?.xmppUsername || state.chatSettingStore?.user?.walletAddress || '';
63
+
64
+ /**
65
+ * Watermark to send for `roomJid` right now, or null. Sends only while the
66
+ * room is the one on screen, never while an old-history jump window is open,
67
+ * and never when read markers are switched off (`disableLastRead` or
68
+ * `disableReadReceipts`).
69
+ */
70
+ export const computeReadWatermark = (state, roomJid) => {
71
+ if (!roomJid) return null;
72
+ const config = state.chatSettingStore?.config;
73
+ if (config?.disableLastRead || config?.disableReadReceipts) return null;
74
+ const rooms = state.rooms;
75
+ if (rooms.visibleRoomJID !== roomJid) return null;
76
+ if (rooms.jumpWindow?.roomJID === roomJid) return null;
77
+ return getReadWatermarkMessageId(rooms.rooms?.[roomJid], selfIdentity(state), rooms.readBoundaries?.[roomJid] ?? null);
78
+ };
79
+
80
+ /**
81
+ * Other occupants whose read watermark sits at or after `messageId` in the
82
+ * room's list. Returns the shared empty array when there are none, so the
83
+ * selector result stays shallow-equal between store updates.
84
+ */
85
+ export const viewersAtOrAfter = (room, messageId, selfXmppUsername) => {
86
+ const watermark = room?.lastDisplayedByUser;
87
+ const messages = room?.messages;
88
+ if (!watermark || !messages || messages.length === 0 || !messageId) return NO_VIEWERS;
89
+ const viewers = Object.keys(watermark).filter(xmppUsername => xmppUsername !== selfXmppUsername);
90
+ if (viewers.length === 0) return NO_VIEWERS;
91
+ const indexOf = id => {
92
+ for (let i = messages.length - 1; i >= 0; i--) {
93
+ if (messages[i].id === id) return i;
94
+ }
95
+ return -1;
96
+ };
97
+ const thisIndex = indexOf(messageId);
98
+ if (thisIndex === -1) return NO_VIEWERS;
99
+ const seen = viewers.filter(xmppUsername => {
100
+ const displayedIndex = indexOf(watermark[xmppUsername]);
101
+ return displayedIndex !== -1 && displayedIndex >= thisIndex;
102
+ });
103
+ return seen.length > 0 ? seen : NO_VIEWERS;
104
+ };
105
+
106
+ /** Selector form of viewersAtOrAfter, keyed by room and message. */
107
+ export const selectSeenBy = (state, roomJid, messageId, selfXmppUsername) => viewersAtOrAfter(state.rooms.rooms?.[roomJid], messageId, selfXmppUsername);
108
+
109
+ /**
110
+ * sent / delivered / seen for one of the reader's own messages. "seen" wins
111
+ * over "delivered", which wins over "sent". Only other occupants count.
112
+ */
113
+ export const deliveredToOthers = (message, selfXmppUsername) => Object.keys(message.receivedBy || {}).filter(xmppUsername => xmppUsername !== selfXmppUsername);
114
+ export const statusOf = (seenBy, deliveredTo) => seenBy.length > 0 ? 'seen' : deliveredTo.length > 0 ? 'delivered' : 'sent';
115
+ export const getReceiptStatus = (message, room, selfXmppUsername) => {
116
+ const deliveredTo = deliveredToOthers(message, selfXmppUsername);
117
+ const seenBy = viewersAtOrAfter(room, String(message.id), selfXmppUsername);
118
+ return {
119
+ status: statusOf(seenBy, deliveredTo),
120
+ seenBy,
121
+ deliveredTo
122
+ };
123
+ };
124
+
125
+ /** Display name for a receipt entry: usersSet first, the raw username as the last resort. */
126
+ export const receiptNameFor = (usersSet, xmppUsername) => {
127
+ const name = createUserNameFromSetUser(usersSet || {}, xmppUsername);
128
+ return name && name !== 'Deleted User' ? name : xmppUsername;
129
+ };
130
+ const formatNames = names => {
131
+ const shown = names.slice(0, RECEIPT_NAME_LIMIT);
132
+ const extra = names.length - shown.length;
133
+ return extra > 0 ? `${shown.join(', ')} +${extra}` : shown.join(', ');
134
+ };
135
+
136
+ /**
137
+ * Text for the tick's details sheet. Groups name the readers or recipients
138
+ * (capped, then "+N"); a 1:1 room only says Read / Delivered.
139
+ */
140
+ export const describeReceipt = ({
141
+ status,
142
+ isGroup,
143
+ seenBy,
144
+ deliveredTo,
145
+ nameOf,
146
+ t
147
+ }) => {
148
+ if (status === 'seen') {
149
+ return isGroup ? t('message.receipt.readBy', {
150
+ names: formatNames(seenBy.map(nameOf))
151
+ }) : t('message.receipt.read');
152
+ }
153
+ if (status === 'delivered') {
154
+ return isGroup ? t('message.receipt.deliveredTo', {
155
+ names: formatNames(deliveredTo.map(nameOf))
156
+ }) : t('message.receipt.delivered');
157
+ }
158
+ return t('message.receipt.sent');
159
+ };
160
+ //# sourceMappingURL=readReceipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["msgSortableMs","isOwnMessage","createUserNameFromSetUser","RECEIPT_NAME_LIMIT","NO_VIEWERS","isReceiptMarkerId","id","value","String","startsWith","isDisplayableForReceipts","message","pending","getReadWatermarkMessageId","room","selfXmppUsername","boundaryTs","messages","filter","length","newest","i","selfIdentity","state","chatSettingStore","user","xmppUsername","walletAddress","computeReadWatermark","roomJid","config","disableLastRead","disableReadReceipts","rooms","visibleRoomJID","jumpWindow","roomJID","readBoundaries","viewersAtOrAfter","messageId","watermark","lastDisplayedByUser","viewers","Object","keys","indexOf","thisIndex","seen","displayedIndex","selectSeenBy","deliveredToOthers","receivedBy","statusOf","seenBy","deliveredTo","getReceiptStatus","status","receiptNameFor","usersSet","name","formatNames","names","shown","slice","extra","join","describeReceipt","isGroup","nameOf","t","map"],"sourceRoot":"../../../src","sources":["helpers/readReceipts.ts"],"mappings":";;AACA,SAASA,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,yBAAyB,QAAQ,6BAA6B;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA,OAAO,MAAMC,kBAAkB,GAAG,CAAC;AAEnC,MAAMC,UAAoB,GAAG,EAAE;;AAE/B;AACA,OAAO,MAAMC,iBAAiB,GAAIC,EAAW,IAAc;EACzD,MAAMC,KAAK,GAAGC,MAAM,CAACF,EAAE,IAAI,EAAE,CAAC;EAC9B,OAAOC,KAAK,CAACE,UAAU,CAAC,kBAAkB,CAAC,IAAIF,KAAK,CAACE,UAAU,CAAC,mBAAmB,CAAC;AACtF,CAAC;;AAED;AACA;AACA,MAAMC,wBAAwB,GAAIC,OAAoC,IAAc;EAClF,IAAI,CAACA,OAAO,EAAE,OAAO,KAAK;EAC1B,IAAIA,OAAO,CAACC,OAAO,EAAE,OAAO,KAAK;EACjC,IAAID,OAAO,CAACL,EAAE,KAAK,eAAe,EAAE,OAAO,KAAK;EAChD,IAAIE,MAAM,CAACG,OAAO,CAACL,EAAE,IAAI,EAAE,CAAC,CAACG,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,KAAK;EACjE,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,yBAAyB,GAAGA,CACvCC,IAAgD,EAChDC,gBAAwB,EACxBC,UAA0B,KACR;EAClB,IAAI,CAACD,gBAAgB,EAAE,OAAO,IAAI;EAClC,MAAME,QAAQ,GAAG,CAACH,IAAI,EAAEG,QAAQ,IAAI,EAAE,EAAEC,MAAM,CAACR,wBAAwB,CAAC;EACxE,IAAIO,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;EACtC,MAAMC,MAAM,GAAGH,QAAQ,CAACA,QAAQ,CAACE,MAAM,GAAG,CAAC,CAAC;EAC5C,IAAIlB,YAAY,CAACmB,MAAM,EAAEL,gBAAgB,CAAC,EAAE,OAAO,IAAI;EACvD,IAAI,OAAOC,UAAU,KAAK,QAAQ,IAAIA,UAAU,GAAG,CAAC,EAAE;IACpD,KAAK,IAAIK,CAAC,GAAGJ,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAEE,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;MAC7C,IAAIrB,aAAa,CAACiB,QAAQ,CAACI,CAAC,CAAC,CAAC,IAAIL,UAAU,EAAE,OAAOR,MAAM,CAACS,QAAQ,CAACI,CAAC,CAAC,CAACf,EAAE,CAAC;IAC7E;IACA,OAAO,IAAI;EACb;EACA,OAAOE,MAAM,CAACY,MAAM,CAACd,EAAE,CAAC;AAC1B,CAAC;;AAED;;AAcA;AACA;AACA,OAAO,MAAMgB,YAAY,GAAIC,KAAwB,IACnDA,KAAK,CAACC,gBAAgB,EAAEC,IAAI,EAAEC,YAAY,IAAIH,KAAK,CAACC,gBAAgB,EAAEC,IAAI,EAAEE,aAAa,IAAI,EAAE;;AAEjG;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,GAAGA,CAClCL,KAAwB,EACxBM,OAAe,KACG;EAClB,IAAI,CAACA,OAAO,EAAE,OAAO,IAAI;EACzB,MAAMC,MAAM,GAAGP,KAAK,CAACC,gBAAgB,EAAEM,MAAM;EAC7C,IAAIA,MAAM,EAAEC,eAAe,IAAID,MAAM,EAAEE,mBAAmB,EAAE,OAAO,IAAI;EACvE,MAAMC,KAAK,GAAGV,KAAK,CAACU,KAAK;EACzB,IAAIA,KAAK,CAACC,cAAc,KAAKL,OAAO,EAAE,OAAO,IAAI;EACjD,IAAII,KAAK,CAACE,UAAU,EAAEC,OAAO,KAAKP,OAAO,EAAE,OAAO,IAAI;EACtD,OAAOhB,yBAAyB,CAC9BoB,KAAK,CAACA,KAAK,GAAGJ,OAAO,CAAC,EACtBP,YAAY,CAACC,KAAK,CAAC,EACnBU,KAAK,CAACI,cAAc,GAAGR,OAAO,CAAC,IAAI,IACrC,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMS,gBAAgB,GAAGA,CAC9BxB,IAAwE,EACxEyB,SAAiB,EACjBxB,gBAAwB,KACX;EACb,MAAMyB,SAAS,GAAG1B,IAAI,EAAE2B,mBAAmB;EAC3C,MAAMxB,QAAQ,GAAGH,IAAI,EAAEG,QAAQ;EAC/B,IAAI,CAACuB,SAAS,IAAI,CAACvB,QAAQ,IAAIA,QAAQ,CAACE,MAAM,KAAK,CAAC,IAAI,CAACoB,SAAS,EAAE,OAAOnC,UAAU;EACrF,MAAMsC,OAAO,GAAGC,MAAM,CAACC,IAAI,CAACJ,SAAS,CAAC,CAACtB,MAAM,CAC1CQ,YAAY,IAAKA,YAAY,KAAKX,gBACrC,CAAC;EACD,IAAI2B,OAAO,CAACvB,MAAM,KAAK,CAAC,EAAE,OAAOf,UAAU;EAC3C,MAAMyC,OAAO,GAAIvC,EAAU,IAAa;IACtC,KAAK,IAAIe,CAAC,GAAGJ,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAEE,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;MAC7C,IAAIJ,QAAQ,CAACI,CAAC,CAAC,CAACf,EAAE,KAAKA,EAAE,EAAE,OAAOe,CAAC;IACrC;IACA,OAAO,CAAC,CAAC;EACX,CAAC;EACD,MAAMyB,SAAS,GAAGD,OAAO,CAACN,SAAS,CAAC;EACpC,IAAIO,SAAS,KAAK,CAAC,CAAC,EAAE,OAAO1C,UAAU;EACvC,MAAM2C,IAAI,GAAGL,OAAO,CAACxB,MAAM,CAAEQ,YAAY,IAAK;IAC5C,MAAMsB,cAAc,GAAGH,OAAO,CAACL,SAAS,CAACd,YAAY,CAAC,CAAC;IACvD,OAAOsB,cAAc,KAAK,CAAC,CAAC,IAAIA,cAAc,IAAIF,SAAS;EAC7D,CAAC,CAAC;EACF,OAAOC,IAAI,CAAC5B,MAAM,GAAG,CAAC,GAAG4B,IAAI,GAAG3C,UAAU;AAC5C,CAAC;;AAED;AACA,OAAO,MAAM6C,YAAY,GAAGA,CAC1B1B,KAAkD,EAClDM,OAAe,EACfU,SAAiB,EACjBxB,gBAAwB,KAExBuB,gBAAgB,CAACf,KAAK,CAACU,KAAK,CAACA,KAAK,GAAGJ,OAAO,CAAC,EAAEU,SAAS,EAAExB,gBAAgB,CAAC;;AAE7E;AACA;AACA;AACA;AACA,OAAO,MAAMmC,iBAAiB,GAAGA,CAC/BvC,OAAqC,EACrCI,gBAAwB,KAExB4B,MAAM,CAACC,IAAI,CAACjC,OAAO,CAACwC,UAAU,IAAI,CAAC,CAAC,CAAC,CAACjC,MAAM,CACzCQ,YAAY,IAAKA,YAAY,KAAKX,gBACrC,CAAC;AAEH,OAAO,MAAMqC,QAAQ,GAAGA,CAACC,MAAgB,EAAEC,WAAqB,KAC9DD,MAAM,CAAClC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAGmC,WAAW,CAACnC,MAAM,GAAG,CAAC,GAAG,WAAW,GAAG,MAAM;AAE5E,OAAO,MAAMoC,gBAAgB,GAAGA,CAC9B5C,OAA4C,EAC5CG,IAAwE,EACxEC,gBAAwB,KAC+C;EACvE,MAAMuC,WAAW,GAAGJ,iBAAiB,CAACvC,OAAO,EAAEI,gBAAgB,CAAC;EAChE,MAAMsC,MAAM,GAAGf,gBAAgB,CAACxB,IAAI,EAAEN,MAAM,CAACG,OAAO,CAACL,EAAE,CAAC,EAAES,gBAAgB,CAAC;EAC3E,OAAO;IAAEyC,MAAM,EAAEJ,QAAQ,CAACC,MAAM,EAAEC,WAAW,CAAC;IAAED,MAAM;IAAEC;EAAY,CAAC;AACvE,CAAC;;AAED;AACA,OAAO,MAAMG,cAAc,GAAGA,CAC5BC,QAAyC,EACzChC,YAAoB,KACT;EACX,MAAMiC,IAAI,GAAGzD,yBAAyB,CAACwD,QAAQ,IAAI,CAAC,CAAC,EAAEhC,YAAY,CAAC;EACpE,OAAOiC,IAAI,IAAIA,IAAI,KAAK,cAAc,GAAGA,IAAI,GAAGjC,YAAY;AAC9D,CAAC;AAED,MAAMkC,WAAW,GAAIC,KAAe,IAAa;EAC/C,MAAMC,KAAK,GAAGD,KAAK,CAACE,KAAK,CAAC,CAAC,EAAE5D,kBAAkB,CAAC;EAChD,MAAM6D,KAAK,GAAGH,KAAK,CAAC1C,MAAM,GAAG2C,KAAK,CAAC3C,MAAM;EACzC,OAAO6C,KAAK,GAAG,CAAC,GAAG,GAAGF,KAAK,CAACG,IAAI,CAAC,IAAI,CAAC,KAAKD,KAAK,EAAE,GAAGF,KAAK,CAACG,IAAI,CAAC,IAAI,CAAC;AACvE,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAGA,CAAC;EAC9BV,MAAM;EACNW,OAAO;EACPd,MAAM;EACNC,WAAW;EACXc,MAAM;EACNC;AAQF,CAAC,KAAa;EACZ,IAAIb,MAAM,KAAK,MAAM,EAAE;IACrB,OAAOW,OAAO,GACVE,CAAC,CAAC,wBAAwB,EAAE;MAAER,KAAK,EAAED,WAAW,CAACP,MAAM,CAACiB,GAAG,CAACF,MAAM,CAAC;IAAE,CAAC,CAAC,GACvEC,CAAC,CAAC,sBAAsB,CAAC;EAC/B;EACA,IAAIb,MAAM,KAAK,WAAW,EAAE;IAC1B,OAAOW,OAAO,GACVE,CAAC,CAAC,6BAA6B,EAAE;MAC/BR,KAAK,EAAED,WAAW,CAACN,WAAW,CAACgB,GAAG,CAACF,MAAM,CAAC;IAC5C,CAAC,CAAC,GACFC,CAAC,CAAC,2BAA2B,CAAC;EACpC;EACA,OAAOA,CAAC,CAAC,sBAAsB,CAAC;AAClC,CAAC","ignoreList":[]}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Repairs file names the backend returns as UTF-8 bytes read as Latin-1
5
+ * (the classic multer/busboy `originalname` problem): "Список.pdf" arrives
6
+ * as "СпиÑок.pdf".
7
+ *
8
+ * Pure and conservative: a name is only replaced when every character fits
9
+ * in one byte, the bytes decode as strict UTF-8, the result differs, holds
10
+ * no replacement or control characters and contains at least one letter
11
+ * outside basic Latin. A correct name is returned untouched.
12
+ */
13
+
14
+ const hasMultiByteSignature = value =>
15
+ // UTF-8 lead bytes C2-F4 followed by a continuation byte 80-BF.
16
+ /[Â-ô][\u0080-¿]/.test(value);
17
+ const looksLikePercentEncoded = value => /%[0-9A-Fa-f]{2}/.test(value);
18
+
19
+ // C0 controls, DEL and the C1 range, checked per UTF-16 code unit.
20
+ const hasControlChars = value => {
21
+ for (let i = 0; i < value.length; i += 1) {
22
+ const code = value.charCodeAt(i);
23
+ if (code < 0x20 || code >= 0x7f && code <= 0x9f) return true;
24
+ }
25
+ return false;
26
+ };
27
+
28
+ // Any code unit above ASCII (same as the former [^\u0000-\u007F] test).
29
+ const hasNonAscii = value => /[\u0080-\uFFFF]/.test(value);
30
+ const decodeLatin1AsUtf8 = value => {
31
+ if (typeof TextDecoder === 'undefined') return null;
32
+ const bytes = new Uint8Array(value.length);
33
+ for (let i = 0; i < value.length; i += 1) {
34
+ const code = value.charCodeAt(i);
35
+ if (code > 0xff) return null;
36
+ bytes[i] = code;
37
+ }
38
+ try {
39
+ return new TextDecoder('utf-8', {
40
+ fatal: true
41
+ }).decode(bytes);
42
+ } catch {
43
+ return null;
44
+ }
45
+ };
46
+ const isPlausibleRepair = (original, repaired) => repaired !== original && !repaired.includes('�') && !hasControlChars(repaired) &&
47
+ // Must contain a letter from a non-Latin-1 script or a real accented
48
+ // letter, otherwise the "fix" is just noise.
49
+ hasNonAscii(repaired) && /\p{L}/u.test(repaired);
50
+ const tryPercentDecode = value => {
51
+ if (!looksLikePercentEncoded(value)) return value;
52
+ try {
53
+ const decoded = decodeURIComponent(value);
54
+ return hasControlChars(decoded) || decoded.includes('�') ? value : decoded;
55
+ } catch {
56
+ return value;
57
+ }
58
+ };
59
+ export const repairFilenameEncoding = name => {
60
+ if (typeof name !== 'string' || name === '') return name;
61
+ let current = name;
62
+
63
+ // Percent-encoded names ("%D0%A1...") first; they may also be mojibake
64
+ // after decoding, so run the byte repair on the result.
65
+ const unescaped = tryPercentDecode(current);
66
+ if (unescaped !== current && hasNonAscii(unescaped)) {
67
+ current = unescaped;
68
+ }
69
+ if (!hasMultiByteSignature(current)) return current;
70
+ const repaired = decodeLatin1AsUtf8(current);
71
+ if (repaired !== null && isPlausibleRepair(current, repaired)) return repaired;
72
+ return current;
73
+ };
74
+ //# sourceMappingURL=repairFilenameEncoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["hasMultiByteSignature","value","test","looksLikePercentEncoded","hasControlChars","i","length","code","charCodeAt","hasNonAscii","decodeLatin1AsUtf8","TextDecoder","bytes","Uint8Array","fatal","decode","isPlausibleRepair","original","repaired","includes","tryPercentDecode","decoded","decodeURIComponent","repairFilenameEncoding","name","current","unescaped"],"sourceRoot":"../../../src","sources":["helpers/repairFilenameEncoding.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ export const safeJsonParse = (rawValue, fallback) => {
4
+ if (typeof rawValue !== 'string' || rawValue.trim() === '') {
5
+ return fallback;
6
+ }
7
+ try {
8
+ return JSON.parse(rawValue);
9
+ } catch {
10
+ return fallback;
11
+ }
12
+ };
13
+ //# sourceMappingURL=safeJson.js.map