stream-chat-react-native-core 9.0.2-beta.1 → 9.1.0-beta.1

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 (280) hide show
  1. package/lib/commonjs/components/Attachment/Attachment.js +38 -10
  2. package/lib/commonjs/components/Attachment/Attachment.js.map +1 -1
  3. package/lib/commonjs/components/Attachment/AttachmentFileUploadProgressIndicator.js +97 -0
  4. package/lib/commonjs/components/Attachment/AttachmentFileUploadProgressIndicator.js.map +1 -0
  5. package/lib/commonjs/components/Attachment/AttachmentUploadIndicator.js +97 -0
  6. package/lib/commonjs/components/Attachment/AttachmentUploadIndicator.js.map +1 -0
  7. package/lib/commonjs/components/Attachment/CircularProgressIndicator.js +141 -0
  8. package/lib/commonjs/components/Attachment/CircularProgressIndicator.js.map +1 -0
  9. package/lib/commonjs/components/Attachment/FileAttachment.js +18 -4
  10. package/lib/commonjs/components/Attachment/FileAttachment.js.map +1 -1
  11. package/lib/commonjs/components/Attachment/Gallery.js +7 -1
  12. package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
  13. package/lib/commonjs/components/Attachment/MediaUploadProgressOverlay.js +59 -0
  14. package/lib/commonjs/components/Attachment/MediaUploadProgressOverlay.js.map +1 -0
  15. package/lib/commonjs/components/Attachment/VideoThumbnail.js +18 -8
  16. package/lib/commonjs/components/Attachment/VideoThumbnail.js.map +1 -1
  17. package/lib/commonjs/components/Attachment/utils/buildGallery/buildThumbnail.js +2 -0
  18. package/lib/commonjs/components/Attachment/utils/buildGallery/buildThumbnail.js.map +1 -1
  19. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js +6 -2
  20. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js.map +1 -1
  21. package/lib/commonjs/components/Channel/Channel.js +94 -92
  22. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  23. package/lib/commonjs/components/Chat/Chat.js +10 -1
  24. package/lib/commonjs/components/Chat/Chat.js.map +1 -1
  25. package/lib/commonjs/components/Indicators/EmptyStateIndicator.js +1 -1
  26. package/lib/commonjs/components/Indicators/EmptyStateIndicator.js.map +1 -1
  27. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentUploadProgressIndicator.js +50 -57
  28. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentUploadProgressIndicator.js.map +1 -1
  29. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AudioAttachmentUploadPreview.js +10 -6
  30. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AudioAttachmentUploadPreview.js.map +1 -1
  31. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/FileAttachmentUploadPreview.js +12 -6
  32. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/FileAttachmentUploadPreview.js.map +1 -1
  33. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/ImageAttachmentUploadPreview.js +13 -7
  34. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/ImageAttachmentUploadPreview.js.map +1 -1
  35. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/VideoAttachmentUploadPreview.js +6 -2
  36. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/VideoAttachmentUploadPreview.js.map +1 -1
  37. package/lib/commonjs/components/Poll/CreatePollContent.js +3 -3
  38. package/lib/commonjs/components/Poll/CreatePollContent.js.map +1 -1
  39. package/lib/commonjs/components/index.js +33 -0
  40. package/lib/commonjs/components/index.js.map +1 -1
  41. package/lib/commonjs/contexts/componentsContext/defaultComponents.js +6 -0
  42. package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
  43. package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageInputContext.js +3 -1
  44. package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageInputContext.js.map +1 -1
  45. package/lib/commonjs/contexts/messageInputContext/hooks/useMessageComposerHasSendableData.js +4 -1
  46. package/lib/commonjs/contexts/messageInputContext/hooks/useMessageComposerHasSendableData.js.map +1 -1
  47. package/lib/commonjs/contexts/themeContext/utils/theme.js +5 -0
  48. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  49. package/lib/commonjs/hooks/index.js +11 -0
  50. package/lib/commonjs/hooks/index.js.map +1 -1
  51. package/lib/commonjs/hooks/usePendingAttachmentUpload.js +106 -0
  52. package/lib/commonjs/hooks/usePendingAttachmentUpload.js.map +1 -0
  53. package/lib/commonjs/i18n/en.json +8 -0
  54. package/lib/commonjs/i18n/es.json +8 -0
  55. package/lib/commonjs/i18n/fr.json +8 -0
  56. package/lib/commonjs/i18n/he.json +8 -0
  57. package/lib/commonjs/i18n/hi.json +8 -0
  58. package/lib/commonjs/i18n/it.json +8 -0
  59. package/lib/commonjs/i18n/ja.json +8 -0
  60. package/lib/commonjs/i18n/ko.json +8 -0
  61. package/lib/commonjs/i18n/nl.json +8 -0
  62. package/lib/commonjs/i18n/pt-br.json +8 -0
  63. package/lib/commonjs/i18n/ru.json +8 -0
  64. package/lib/commonjs/i18n/tr.json +8 -0
  65. package/lib/commonjs/index.js +12 -0
  66. package/lib/commonjs/index.js.map +1 -1
  67. package/lib/commonjs/middlewares/attachments.js +2 -0
  68. package/lib/commonjs/middlewares/attachments.js.map +1 -1
  69. package/lib/commonjs/native.js +8 -1
  70. package/lib/commonjs/native.js.map +1 -1
  71. package/lib/commonjs/nativeMultipartUpload.js +237 -0
  72. package/lib/commonjs/nativeMultipartUpload.js.map +1 -0
  73. package/lib/commonjs/types/types.js.map +1 -1
  74. package/lib/commonjs/utils/installNativeMultipartAdapter.js +223 -0
  75. package/lib/commonjs/utils/installNativeMultipartAdapter.js.map +1 -0
  76. package/lib/commonjs/utils/utils.js +2 -2
  77. package/lib/commonjs/utils/utils.js.map +1 -1
  78. package/lib/commonjs/version.json +1 -1
  79. package/lib/module/components/Attachment/Attachment.js +38 -10
  80. package/lib/module/components/Attachment/Attachment.js.map +1 -1
  81. package/lib/module/components/Attachment/AttachmentFileUploadProgressIndicator.js +97 -0
  82. package/lib/module/components/Attachment/AttachmentFileUploadProgressIndicator.js.map +1 -0
  83. package/lib/module/components/Attachment/AttachmentUploadIndicator.js +97 -0
  84. package/lib/module/components/Attachment/AttachmentUploadIndicator.js.map +1 -0
  85. package/lib/module/components/Attachment/CircularProgressIndicator.js +141 -0
  86. package/lib/module/components/Attachment/CircularProgressIndicator.js.map +1 -0
  87. package/lib/module/components/Attachment/FileAttachment.js +18 -4
  88. package/lib/module/components/Attachment/FileAttachment.js.map +1 -1
  89. package/lib/module/components/Attachment/Gallery.js +7 -1
  90. package/lib/module/components/Attachment/Gallery.js.map +1 -1
  91. package/lib/module/components/Attachment/MediaUploadProgressOverlay.js +59 -0
  92. package/lib/module/components/Attachment/MediaUploadProgressOverlay.js.map +1 -0
  93. package/lib/module/components/Attachment/VideoThumbnail.js +18 -8
  94. package/lib/module/components/Attachment/VideoThumbnail.js.map +1 -1
  95. package/lib/module/components/Attachment/utils/buildGallery/buildThumbnail.js +2 -0
  96. package/lib/module/components/Attachment/utils/buildGallery/buildThumbnail.js.map +1 -1
  97. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js +6 -2
  98. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js.map +1 -1
  99. package/lib/module/components/Channel/Channel.js +94 -92
  100. package/lib/module/components/Channel/Channel.js.map +1 -1
  101. package/lib/module/components/Chat/Chat.js +10 -1
  102. package/lib/module/components/Chat/Chat.js.map +1 -1
  103. package/lib/module/components/Indicators/EmptyStateIndicator.js +1 -1
  104. package/lib/module/components/Indicators/EmptyStateIndicator.js.map +1 -1
  105. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentUploadProgressIndicator.js +50 -57
  106. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentUploadProgressIndicator.js.map +1 -1
  107. package/lib/module/components/MessageInput/components/AttachmentPreview/AudioAttachmentUploadPreview.js +10 -6
  108. package/lib/module/components/MessageInput/components/AttachmentPreview/AudioAttachmentUploadPreview.js.map +1 -1
  109. package/lib/module/components/MessageInput/components/AttachmentPreview/FileAttachmentUploadPreview.js +12 -6
  110. package/lib/module/components/MessageInput/components/AttachmentPreview/FileAttachmentUploadPreview.js.map +1 -1
  111. package/lib/module/components/MessageInput/components/AttachmentPreview/ImageAttachmentUploadPreview.js +13 -7
  112. package/lib/module/components/MessageInput/components/AttachmentPreview/ImageAttachmentUploadPreview.js.map +1 -1
  113. package/lib/module/components/MessageInput/components/AttachmentPreview/VideoAttachmentUploadPreview.js +6 -2
  114. package/lib/module/components/MessageInput/components/AttachmentPreview/VideoAttachmentUploadPreview.js.map +1 -1
  115. package/lib/module/components/Poll/CreatePollContent.js +3 -3
  116. package/lib/module/components/Poll/CreatePollContent.js.map +1 -1
  117. package/lib/module/components/index.js +33 -0
  118. package/lib/module/components/index.js.map +1 -1
  119. package/lib/module/contexts/componentsContext/defaultComponents.js +6 -0
  120. package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
  121. package/lib/module/contexts/messageInputContext/hooks/useCreateMessageInputContext.js +3 -1
  122. package/lib/module/contexts/messageInputContext/hooks/useCreateMessageInputContext.js.map +1 -1
  123. package/lib/module/contexts/messageInputContext/hooks/useMessageComposerHasSendableData.js +4 -1
  124. package/lib/module/contexts/messageInputContext/hooks/useMessageComposerHasSendableData.js.map +1 -1
  125. package/lib/module/contexts/themeContext/utils/theme.js +5 -0
  126. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  127. package/lib/module/hooks/index.js +11 -0
  128. package/lib/module/hooks/index.js.map +1 -1
  129. package/lib/module/hooks/usePendingAttachmentUpload.js +106 -0
  130. package/lib/module/hooks/usePendingAttachmentUpload.js.map +1 -0
  131. package/lib/module/i18n/en.json +8 -0
  132. package/lib/module/i18n/es.json +8 -0
  133. package/lib/module/i18n/fr.json +8 -0
  134. package/lib/module/i18n/he.json +8 -0
  135. package/lib/module/i18n/hi.json +8 -0
  136. package/lib/module/i18n/it.json +8 -0
  137. package/lib/module/i18n/ja.json +8 -0
  138. package/lib/module/i18n/ko.json +8 -0
  139. package/lib/module/i18n/nl.json +8 -0
  140. package/lib/module/i18n/pt-br.json +8 -0
  141. package/lib/module/i18n/ru.json +8 -0
  142. package/lib/module/i18n/tr.json +8 -0
  143. package/lib/module/index.js +12 -0
  144. package/lib/module/index.js.map +1 -1
  145. package/lib/module/middlewares/attachments.js +2 -0
  146. package/lib/module/middlewares/attachments.js.map +1 -1
  147. package/lib/module/native.js +8 -1
  148. package/lib/module/native.js.map +1 -1
  149. package/lib/module/nativeMultipartUpload.js +237 -0
  150. package/lib/module/nativeMultipartUpload.js.map +1 -0
  151. package/lib/module/types/types.js.map +1 -1
  152. package/lib/module/utils/installNativeMultipartAdapter.js +223 -0
  153. package/lib/module/utils/installNativeMultipartAdapter.js.map +1 -0
  154. package/lib/module/utils/utils.js +2 -2
  155. package/lib/module/utils/utils.js.map +1 -1
  156. package/lib/module/version.json +1 -1
  157. package/lib/typescript/components/Attachment/Attachment.d.ts.map +1 -1
  158. package/lib/typescript/components/Attachment/AttachmentFileUploadProgressIndicator.d.ts +14 -0
  159. package/lib/typescript/components/Attachment/AttachmentFileUploadProgressIndicator.d.ts.map +1 -0
  160. package/lib/typescript/components/Attachment/AttachmentUploadIndicator.d.ts +18 -0
  161. package/lib/typescript/components/Attachment/AttachmentUploadIndicator.d.ts.map +1 -0
  162. package/lib/typescript/components/Attachment/CircularProgressIndicator.d.ts +18 -0
  163. package/lib/typescript/components/Attachment/CircularProgressIndicator.d.ts.map +1 -0
  164. package/lib/typescript/components/Attachment/FileAttachment.d.ts.map +1 -1
  165. package/lib/typescript/components/Attachment/Gallery.d.ts.map +1 -1
  166. package/lib/typescript/components/Attachment/MediaUploadProgressOverlay.d.ts +12 -0
  167. package/lib/typescript/components/Attachment/MediaUploadProgressOverlay.d.ts.map +1 -0
  168. package/lib/typescript/components/Attachment/VideoThumbnail.d.ts +4 -0
  169. package/lib/typescript/components/Attachment/VideoThumbnail.d.ts.map +1 -1
  170. package/lib/typescript/components/Attachment/utils/buildGallery/buildThumbnail.d.ts.map +1 -1
  171. package/lib/typescript/components/Attachment/utils/buildGallery/types.d.ts +2 -0
  172. package/lib/typescript/components/Attachment/utils/buildGallery/types.d.ts.map +1 -1
  173. package/lib/typescript/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.d.ts.map +1 -1
  174. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  175. package/lib/typescript/components/Chat/Chat.d.ts +10 -0
  176. package/lib/typescript/components/Chat/Chat.d.ts.map +1 -1
  177. package/lib/typescript/components/Indicators/EmptyStateIndicator.d.ts.map +1 -1
  178. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AttachmentUploadProgressIndicator.d.ts +7 -2
  179. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AttachmentUploadProgressIndicator.d.ts.map +1 -1
  180. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AudioAttachmentUploadPreview.d.ts.map +1 -1
  181. package/lib/typescript/components/MessageInput/components/AttachmentPreview/FileAttachmentUploadPreview.d.ts.map +1 -1
  182. package/lib/typescript/components/MessageInput/components/AttachmentPreview/ImageAttachmentUploadPreview.d.ts.map +1 -1
  183. package/lib/typescript/components/MessageInput/components/AttachmentPreview/VideoAttachmentUploadPreview.d.ts.map +1 -1
  184. package/lib/typescript/components/Poll/CreatePollContent.d.ts.map +1 -1
  185. package/lib/typescript/components/index.d.ts +3 -0
  186. package/lib/typescript/components/index.d.ts.map +1 -1
  187. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +5 -2
  188. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
  189. package/lib/typescript/contexts/messageInputContext/hooks/useCreateMessageInputContext.d.ts +1 -1
  190. package/lib/typescript/contexts/messageInputContext/hooks/useCreateMessageInputContext.d.ts.map +1 -1
  191. package/lib/typescript/contexts/messageInputContext/hooks/useMessageComposerHasSendableData.d.ts.map +1 -1
  192. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +5 -0
  193. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
  194. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +5 -0
  195. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  196. package/lib/typescript/hooks/index.d.ts +1 -0
  197. package/lib/typescript/hooks/index.d.ts.map +1 -1
  198. package/lib/typescript/hooks/usePendingAttachmentUpload.d.ts +14 -0
  199. package/lib/typescript/hooks/usePendingAttachmentUpload.d.ts.map +1 -0
  200. package/lib/typescript/i18n/en.json +8 -0
  201. package/lib/typescript/i18n/es.json +8 -0
  202. package/lib/typescript/i18n/fr.json +8 -0
  203. package/lib/typescript/i18n/he.json +8 -0
  204. package/lib/typescript/i18n/hi.json +8 -0
  205. package/lib/typescript/i18n/it.json +8 -0
  206. package/lib/typescript/i18n/ja.json +8 -0
  207. package/lib/typescript/i18n/ko.json +8 -0
  208. package/lib/typescript/i18n/nl.json +8 -0
  209. package/lib/typescript/i18n/pt-br.json +8 -0
  210. package/lib/typescript/i18n/ru.json +8 -0
  211. package/lib/typescript/i18n/tr.json +8 -0
  212. package/lib/typescript/index.d.ts +1 -0
  213. package/lib/typescript/index.d.ts.map +1 -1
  214. package/lib/typescript/middlewares/attachments.d.ts.map +1 -1
  215. package/lib/typescript/native.d.ts +5 -2
  216. package/lib/typescript/native.d.ts.map +1 -1
  217. package/lib/typescript/nativeMultipartUpload.d.ts +98 -0
  218. package/lib/typescript/nativeMultipartUpload.d.ts.map +1 -0
  219. package/lib/typescript/types/types.d.ts +2 -0
  220. package/lib/typescript/types/types.d.ts.map +1 -1
  221. package/lib/typescript/utils/i18n/Streami18n.d.ts +8 -0
  222. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  223. package/lib/typescript/utils/installNativeMultipartAdapter.d.ts +8 -0
  224. package/lib/typescript/utils/installNativeMultipartAdapter.d.ts.map +1 -0
  225. package/lib/typescript/utils/utils.d.ts +1 -1
  226. package/lib/typescript/utils/utils.d.ts.map +1 -1
  227. package/package.json +2 -2
  228. package/src/__tests__/nativeMultipartUpload.test.ts +267 -0
  229. package/src/components/Attachment/Attachment.tsx +54 -5
  230. package/src/components/Attachment/AttachmentFileUploadProgressIndicator.tsx +108 -0
  231. package/src/components/Attachment/AttachmentUploadIndicator.tsx +112 -0
  232. package/src/components/Attachment/CircularProgressIndicator.tsx +161 -0
  233. package/src/components/Attachment/FileAttachment.tsx +22 -6
  234. package/src/components/Attachment/Gallery.tsx +9 -1
  235. package/src/components/Attachment/MediaUploadProgressOverlay.tsx +77 -0
  236. package/src/components/Attachment/VideoThumbnail.tsx +17 -9
  237. package/src/components/Attachment/__tests__/Attachment.test.tsx +63 -16
  238. package/src/components/Attachment/utils/buildGallery/buildThumbnail.ts +3 -0
  239. package/src/components/Attachment/utils/buildGallery/types.ts +2 -0
  240. package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.tsx +4 -2
  241. package/src/components/Channel/Channel.tsx +65 -61
  242. package/src/components/Chat/Chat.tsx +20 -0
  243. package/src/components/Indicators/EmptyStateIndicator.tsx +3 -1
  244. package/src/components/MessageInput/__tests__/AttachmentUploadPreviewList.test.tsx +51 -6
  245. package/src/components/MessageInput/__tests__/AudioAttachmentUploadPreview.test.tsx +31 -1
  246. package/src/components/MessageInput/components/AttachmentPreview/AttachmentUploadProgressIndicator.tsx +38 -47
  247. package/src/components/MessageInput/components/AttachmentPreview/AudioAttachmentUploadPreview.tsx +11 -5
  248. package/src/components/MessageInput/components/AttachmentPreview/FileAttachmentUploadPreview.tsx +20 -5
  249. package/src/components/MessageInput/components/AttachmentPreview/ImageAttachmentUploadPreview.tsx +20 -9
  250. package/src/components/MessageInput/components/AttachmentPreview/VideoAttachmentUploadPreview.tsx +7 -1
  251. package/src/components/Poll/CreatePollContent.tsx +5 -3
  252. package/src/components/index.ts +3 -0
  253. package/src/contexts/componentsContext/defaultComponents.ts +6 -0
  254. package/src/contexts/messageInputContext/hooks/useCreateMessageInputContext.ts +3 -1
  255. package/src/contexts/messageInputContext/hooks/useMessageComposerHasSendableData.ts +5 -1
  256. package/src/contexts/themeContext/utils/theme.ts +10 -0
  257. package/src/hooks/__tests__/usePendingAttachmentUpload.test.tsx +106 -0
  258. package/src/hooks/index.ts +1 -0
  259. package/src/hooks/usePendingAttachmentUpload.ts +131 -0
  260. package/src/i18n/en.json +8 -0
  261. package/src/i18n/es.json +8 -0
  262. package/src/i18n/fr.json +8 -0
  263. package/src/i18n/he.json +8 -0
  264. package/src/i18n/hi.json +8 -0
  265. package/src/i18n/it.json +8 -0
  266. package/src/i18n/ja.json +8 -0
  267. package/src/i18n/ko.json +8 -0
  268. package/src/i18n/nl.json +8 -0
  269. package/src/i18n/pt-br.json +8 -0
  270. package/src/i18n/ru.json +8 -0
  271. package/src/i18n/tr.json +8 -0
  272. package/src/index.ts +1 -0
  273. package/src/middlewares/attachments.ts +2 -0
  274. package/src/native.ts +28 -0
  275. package/src/nativeMultipartUpload.ts +384 -0
  276. package/src/types/types.ts +2 -0
  277. package/src/utils/__tests__/installNativeMultipartAdapter.test.ts +437 -0
  278. package/src/utils/installNativeMultipartAdapter.ts +302 -0
  279. package/src/utils/utils.ts +3 -3
  280. package/src/version.json +1 -1
package/src/i18n/ru.json CHANGED
@@ -5,7 +5,9 @@
5
5
  "1 Reply": "1 Ответ",
6
6
  "1 Thread Reply": "1 тема Ответить",
7
7
  "Add a comment": "Добавить комментарий",
8
+ "Add a comment to the poll": "Добавить комментарий к опросу",
8
9
  "Add an option": "Добавить вариант",
10
+ "Add more": "Добавить ещё",
9
11
  "Allow access to your Gallery": "Разрешить доступ к вашей галерее",
10
12
  "Allow camera access in device settings": "Разрешите доступ к камере в настройках устройства.",
11
13
  "Also send to channel": "Также отправить на канал",
@@ -42,15 +44,18 @@
42
44
  "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Ошибка при отметке сообщения как непрочитанного. Невозможно отметить непрочитанные сообщения старше новейших 100 сообщений канала.",
43
45
  "Error while loading, please reload/refresh": "Ошибка загрузки, пожалуйста перезагрузите или обновите",
44
46
  "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Файл слишком большой: {{ size }}, максимальный размер загрузки составляет {{ limit }}",
47
+ "File too large": "Файл слишком большой",
45
48
  "File type not supported": "Тип файла не поддерживается",
46
49
  "Flag": "Пометить",
47
50
  "Flag Message": "Пометить сообщение",
48
51
  "Flag action failed either due to a network issue or the message is already flagged": "Не удалось отправить жалобу. Возможные причины: проблема с подключением к интернету или ваша жалоба уже была принята.",
49
52
  "Generating...": "Генерирую...",
50
53
  "Giphy": "Giphy",
54
+ "Hide who voted": "Скрыть, кто проголосовал",
51
55
  "Hold to start recording.": "Удерживайте, чтобы начать запись.",
52
56
  "How about sending your first message to a friend?": "Как насчет отправки первого сообщения другу?",
53
57
  "Instant Commands": "Мгновенные Команды",
58
+ "Let others add options": "Разрешить другим добавлять варианты",
54
59
  "Let's start chatting!": "Давайте начнем общаться!",
55
60
  "Links are disabled": "Ссылки отключены",
56
61
  "Live Location": "Трансляция местоположения",
@@ -65,11 +70,13 @@
65
70
  "Message deleted": "Сообщение удалено",
66
71
  "Message flagged": "Сообщение отмечено",
67
72
  "Multiple votes": "Несколько голосов",
73
+ "Network error": "Ошибка сети",
68
74
  "Select more than one option": "Выберите больше одного варианта",
69
75
  "Limit votes per person": "Ограничить количество голосов на человека",
70
76
  "Choose between 2–10 options": "Выберите от 2 до 10 вариантов",
71
77
  "Mute User": "Отключить пользователя",
72
78
  "No chats here yet…": "Здесь пока нет чатов…",
79
+ "No items exist": "Нет элементов",
73
80
  "No threads here yet": "Здесь пока нет потоков",
74
81
  "Not supported": "не поддерживается",
75
82
  "Nothing yet...": "Пока ничего нет...",
@@ -96,6 +103,7 @@
96
103
  "Reply to {{name}}": "Ответить пользователю {{name}}",
97
104
  "Reply to Message": "Ответить на сообщение",
98
105
  "Resend": "Отправить",
106
+ "Retry Upload": "Повторить загрузку",
99
107
  "SEND": "ОТПРАВИТЬ",
100
108
  "Search": "Поиск",
101
109
  "Select More Photos": "Выбрать больше фотографий",
package/src/i18n/tr.json CHANGED
@@ -5,7 +5,9 @@
5
5
  "1 Reply": "1 Cevap",
6
6
  "1 Thread Reply": "1 Konu Yanıtı",
7
7
  "Add a comment": "Yorum ekle",
8
+ "Add a comment to the poll": "Ankete yorum ekle",
8
9
  "Add an option": "Seçenek ekle",
10
+ "Add more": "Daha fazla ekle",
9
11
  "Allow access to your Gallery": "Galerinize erişime izin verin",
10
12
  "Allow camera access in device settings": "Cihaz ayarlarında kamera erişimine izin ver",
11
13
  "Also send to channel": "Kanala da gönder",
@@ -42,15 +44,18 @@
42
44
  "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Okunmamış olarak işaretlenen mesajda hata oluştu. En yeni 100 kanal mesajından daha eski okunmamış mesajları işaretleyemezsiniz.",
43
45
  "Error while loading, please reload/refresh": "Yüklenirken hata oluştu, lütfen tekrar deneyiniz",
44
46
  "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Dosya çok büyük: {{ size }}, maksimum yükleme boyutu {{ limit }}",
47
+ "File too large": "Dosya çok büyük",
45
48
  "File type not supported": "Dosya türü desteklenmiyor",
46
49
  "Flag": "Raporla",
47
50
  "Flag Message": "Mesajı Raporla",
48
51
  "Flag action failed either due to a network issue or the message is already flagged": "Mesajın daha önce raporlanmış olması veya bir ağ bağlantısı sorunu nedeniyle raporlama işlemi başarısız oldu.",
49
52
  "Generating...": "Oluşturuluyor...",
50
53
  "Giphy": "Giphy",
54
+ "Hide who voted": "Kimin oy verdiğini gizle",
51
55
  "Hold to start recording.": "Kayıt yapmak için basılı tutun.",
52
56
  "How about sending your first message to a friend?": "İlk mesajınızı bir arkadaşınıza göndermeye ne dersiniz?",
53
57
  "Instant Commands": "Anlık Komutlar",
58
+ "Let others add options": "Başkalarının seçenek eklemesine izin ver",
54
59
  "Let's start chatting!": "Haydi sohbete başlayalım!",
55
60
  "Links are disabled": "Bağlantılar devre dışı",
56
61
  "Live Location": "Canlı Konum",
@@ -65,11 +70,13 @@
65
70
  "Message deleted": "Mesaj silindi",
66
71
  "Message flagged": "Mesaj işaretlendi",
67
72
  "Multiple votes": "Çoklu oy",
73
+ "Network error": "Ağ hatası",
68
74
  "Select more than one option": "Birden fazla seçenek seçin",
69
75
  "Limit votes per person": "Kişi başına oy sayısını sınırla",
70
76
  "Choose between 2–10 options": "2 ile 10 arasında seçenek seçin",
71
77
  "Mute User": "Kullanıcıyı sessize al",
72
78
  "No chats here yet…": "Henüz burada sohbet yok…",
79
+ "No items exist": "Hiçbir öğe yok",
73
80
  "No threads here yet": "Burada henüz akış yok",
74
81
  "Not supported": "Desteklenmiyor",
75
82
  "Nothing yet...": "Henüz değil...",
@@ -96,6 +103,7 @@
96
103
  "Reply to {{name}}": "{{name}} için yanıtla",
97
104
  "Reply to Message": "Mesajı Yanıtla",
98
105
  "Resend": "Yeniden gönder",
106
+ "Retry Upload": "Yüklemeyi yeniden dene",
99
107
  "SEND": "GÖNDER",
100
108
  "Search": "Ara",
101
109
  "Select More Photos": "Daha Fazla Fotoğraf Seçin",
package/src/index.ts CHANGED
@@ -18,6 +18,7 @@ export * from './utils/i18n/Streami18n';
18
18
  export * from './utils/setupCommandUIMiddlewares';
19
19
  export * from './utils/createGenerateVideoThumbnails';
20
20
  export * from './utils/utils';
21
+ export * from './nativeMultipartUpload';
21
22
 
22
23
  export { default as enTranslations } from './i18n/en.json';
23
24
  export { default as esTranslations } from './i18n/es.json';
@@ -26,6 +26,7 @@ export const localAttachmentToAttachment = (localAttachment: LocalAttachment) =>
26
26
  return {
27
27
  ...attachment,
28
28
  image_url: localMetadata?.previewUri,
29
+ localId: localMetadata?.id,
29
30
  originalFile: localMetadata.file,
30
31
  } as Attachment;
31
32
  } else {
@@ -35,6 +36,7 @@ export const localAttachmentToAttachment = (localAttachment: LocalAttachment) =>
35
36
  return {
36
37
  ...attachment,
37
38
  asset_url: (localMetadata.file as FileReference).uri,
39
+ localId: localMetadata?.id,
38
40
  originalFile: localMetadata.file,
39
41
  } as Attachment;
40
42
  }
package/src/native.ts CHANGED
@@ -7,7 +7,27 @@ import {
7
7
  ViewStyle,
8
8
  } from 'react-native';
9
9
 
10
+ import type { NativeMultipartUpload } from './nativeMultipartUpload';
10
11
  import type { File } from './types/types';
12
+
13
+ export type {
14
+ NativeMultipartAbortSignal,
15
+ NativeMultipartCanceledError,
16
+ NativeMultipartUpload,
17
+ NativeMultipartUploadEventEmitter,
18
+ NativeMultipartUploadHeader,
19
+ NativeMultipartUploadNativeResponse,
20
+ NativeMultipartUploadPart,
21
+ NativeMultipartUploadProgressConfig,
22
+ NativeMultipartUploadProgressEvent,
23
+ NativeMultipartUploadRequest,
24
+ NativeMultipartUploadResult,
25
+ NativeMultipartUploader,
26
+ NativeMultipartUploaderModule,
27
+ NativeMultipartUploaderProgressConfig,
28
+ NativeMultipartUploaderRequest,
29
+ } from './nativeMultipartUpload';
30
+
11
31
  const fail = () => {
12
32
  throw Error(
13
33
  'Native handler was not registered, you should import stream-chat-expo or stream-chat-react-native',
@@ -308,6 +328,7 @@ type Handlers = {
308
328
  getLocalAssetUri?: GetLocalAssetUri;
309
329
  getPhotos?: GetPhotos;
310
330
  iOS14RefreshGallerySelection?: iOS14RefreshGallerySelection;
331
+ multipartUpload?: NativeMultipartUpload;
311
332
  oniOS14GalleryLibrarySelectionChange?: OniOS14LibrarySelectionChange;
312
333
  overrideAudioRecordingConfiguration?: (
313
334
  audioRecordingConfiguration: AudioRecordingConfiguration,
@@ -338,6 +359,7 @@ export const NativeHandlers: Pick<
338
359
  | 'getLocalAssetUri'
339
360
  | 'getPhotos'
340
361
  | 'iOS14RefreshGallerySelection'
362
+ | 'multipartUpload'
341
363
  | 'oniOS14GalleryLibrarySelectionChange'
342
364
  | 'pickDocument'
343
365
  | 'pickImage'
@@ -355,6 +377,7 @@ export const NativeHandlers: Pick<
355
377
  getLocalAssetUri: fail,
356
378
  getPhotos: fail,
357
379
  iOS14RefreshGallerySelection: fail,
380
+ multipartUpload: fail,
358
381
  oniOS14GalleryLibrarySelectionChange: fail,
359
382
  pickDocument: fail,
360
383
  pickImage: fail,
@@ -404,6 +427,10 @@ export const registerNativeHandlers = (handlers: Handlers) => {
404
427
  NativeHandlers.iOS14RefreshGallerySelection = handlers.iOS14RefreshGallerySelection;
405
428
  }
406
429
 
430
+ if (handlers.multipartUpload !== undefined) {
431
+ NativeHandlers.multipartUpload = handlers.multipartUpload;
432
+ }
433
+
407
434
  if (handlers.oniOS14GalleryLibrarySelectionChange !== undefined) {
408
435
  NativeHandlers.oniOS14GalleryLibrarySelectionChange =
409
436
  handlers.oniOS14GalleryLibrarySelectionChange;
@@ -469,3 +496,4 @@ export const isImageMediaLibraryAvailable = () =>
469
496
  !!NativeHandlers.iOS14RefreshGallerySelection &&
470
497
  !!NativeHandlers.oniOS14GalleryLibrarySelectionChange &&
471
498
  !!NativeHandlers.getLocalAssetUri;
499
+ export const isNativeMultipartUploadAvailable = () => NativeHandlers.multipartUpload !== fail;
@@ -0,0 +1,384 @@
1
+ import { NativeEventEmitter } from 'react-native';
2
+
3
+ const STREAM_MULTIPART_UPLOAD_PROGRESS_EVENT = 'streamMultipartUploadProgress';
4
+ const CANCELED_ERROR_CODE = 'ERR_CANCELED';
5
+
6
+ export type NativeMultipartAbortSignal = {
7
+ aborted: boolean;
8
+ addEventListener?: (...args: unknown[]) => unknown;
9
+ onabort?: ((...args: unknown[]) => unknown) | null;
10
+ removeEventListener?: (...args: unknown[]) => unknown;
11
+ };
12
+
13
+ export type NativeMultipartUploadHeader = {
14
+ name: string;
15
+ value: string;
16
+ };
17
+
18
+ export type NativeMultipartUploadPart =
19
+ | {
20
+ fieldName: string;
21
+ kind: 'file';
22
+ fileName: string;
23
+ mimeType?: string;
24
+ uri: string;
25
+ }
26
+ | {
27
+ fieldName: string;
28
+ kind: 'text';
29
+ value: string;
30
+ };
31
+
32
+ export type NativeMultipartUploaderProgressConfig = {
33
+ count?: number;
34
+ intervalMs?: number;
35
+ };
36
+
37
+ export type NativeMultipartUploadProgressConfig = NativeMultipartUploaderProgressConfig & {
38
+ /**
39
+ * Maximum progress percentage reported while the native request body is still being sent.
40
+ * Completion is represented by the upload request resolving and the upload indicator being removed.
41
+ *
42
+ * @default 90
43
+ */
44
+ completionProgressCap?: number;
45
+ };
46
+
47
+ export type NativeMultipartUploadProgressEvent = {
48
+ loaded: number;
49
+ total?: number | null;
50
+ uploadId: string;
51
+ };
52
+
53
+ export type NativeMultipartUploadNativeResponse = {
54
+ body: string;
55
+ headers?: ReadonlyArray<NativeMultipartUploadHeader> | null;
56
+ status: number;
57
+ statusText?: string | null;
58
+ };
59
+
60
+ export type NativeMultipartUploadResult = {
61
+ body: string;
62
+ headers?: Record<string, string>;
63
+ status: number;
64
+ statusText?: string;
65
+ };
66
+
67
+ export type NativeMultipartUploadRequest = {
68
+ headers: Record<string, string>;
69
+ method: string;
70
+ onProgress?: (progress: { loaded: number; total?: number }) => void;
71
+ parts: NativeMultipartUploadPart[];
72
+ progress?: NativeMultipartUploadProgressConfig;
73
+ signal?: NativeMultipartAbortSignal;
74
+ timeoutMs?: number;
75
+ url: string;
76
+ };
77
+
78
+ export type NativeMultipartUploaderRequest = Omit<NativeMultipartUploadRequest, 'progress'> & {
79
+ progress?: NativeMultipartUploaderProgressConfig;
80
+ uploadId: string;
81
+ };
82
+
83
+ export type NativeMultipartUpload = (
84
+ request: NativeMultipartUploadRequest,
85
+ ) => Promise<NativeMultipartUploadResult | undefined> | never;
86
+
87
+ export type NativeMultipartUploader = (
88
+ request: NativeMultipartUploaderRequest,
89
+ ) => Promise<NativeMultipartUploadResult>;
90
+
91
+ export type NativeMultipartUploaderModule = {
92
+ addListener(eventType: string): void;
93
+ cancelUpload(uploadId: string): Promise<void>;
94
+ removeListeners(count: number): void;
95
+ uploadMultipart(
96
+ uploadId: string,
97
+ url: string,
98
+ method: string,
99
+ headers: ReadonlyArray<NativeMultipartUploadHeader>,
100
+ parts: ReadonlyArray<NativeMultipartUploadPart>,
101
+ progress?: NativeMultipartUploaderProgressConfig,
102
+ timeoutMs?: number | null,
103
+ ): Promise<NativeMultipartUploadNativeResponse>;
104
+ };
105
+
106
+ export type NativeMultipartUploadEventEmitter = {
107
+ addListener(
108
+ eventType: string,
109
+ listener: (event: NativeMultipartUploadProgressEvent) => void,
110
+ ): { remove: () => void };
111
+ };
112
+
113
+ export type NativeMultipartCanceledError = Error & {
114
+ __CANCEL__: true;
115
+ code: typeof CANCELED_ERROR_CODE;
116
+ };
117
+
118
+ type CreateNativeMultipartUploaderOptions = {
119
+ eventEmitter?: NativeMultipartUploadEventEmitter;
120
+ };
121
+
122
+ type CreateNativeMultipartUploadOptions = {
123
+ getLocalAssetUri?: ((uri: string) => Promise<string | null | undefined>) | null;
124
+ uploadIdFactory?: () => string;
125
+ uploadMultipart?: NativeMultipartUploader;
126
+ };
127
+
128
+ const createDefaultUploadId = () =>
129
+ `stream-upload-${Date.now()}-${Math.random().toString(16).slice(2)}`;
130
+
131
+ const createCanceledError = (): NativeMultipartCanceledError => {
132
+ const error = new Error('Request aborted') as NativeMultipartCanceledError;
133
+ error.name = 'CanceledError';
134
+ error.code = CANCELED_ERROR_CODE;
135
+ // eslint-disable-next-line no-underscore-dangle -- Axios marks cancellation with this legacy field, and callers still use axios.isCancel.
136
+ error.__CANCEL__ = true;
137
+ return error;
138
+ };
139
+
140
+ const toUploadHeaders = (headers: Record<string, string>): NativeMultipartUploadHeader[] =>
141
+ Object.entries(headers).map(([name, value]) => ({ name, value }));
142
+
143
+ const fromUploadHeaders = (
144
+ headers?: ReadonlyArray<NativeMultipartUploadHeader> | null,
145
+ ): Record<string, string> | undefined => {
146
+ if (!headers?.length) {
147
+ return undefined;
148
+ }
149
+
150
+ return headers.reduce<Record<string, string>>((acc, header) => {
151
+ acc[header.name] = header.value;
152
+ return acc;
153
+ }, {});
154
+ };
155
+
156
+ const addAbortHandler = (signal: NativeMultipartAbortSignal | undefined, onAbort: () => void) => {
157
+ if (!signal) {
158
+ return () => undefined;
159
+ }
160
+
161
+ let handled = false;
162
+ const handleAbort = () => {
163
+ if (handled) {
164
+ return;
165
+ }
166
+
167
+ handled = true;
168
+ onAbort();
169
+ };
170
+
171
+ if (typeof signal.addEventListener === 'function') {
172
+ signal.addEventListener('abort', handleAbort, { once: true });
173
+ return () => {
174
+ signal.removeEventListener?.('abort', handleAbort);
175
+ };
176
+ }
177
+
178
+ const previousOnAbort = signal.onabort;
179
+ const chainedOnAbort = (...args: unknown[]) => {
180
+ previousOnAbort?.(...args);
181
+ handleAbort();
182
+ };
183
+
184
+ signal.onabort = chainedOnAbort;
185
+
186
+ return () => {
187
+ if (signal.onabort === chainedOnAbort) {
188
+ signal.onabort = previousOnAbort ?? null;
189
+ }
190
+ };
191
+ };
192
+
193
+ const getNativeProgressConfig = (
194
+ progress?: NativeMultipartUploadProgressConfig,
195
+ ): NativeMultipartUploaderProgressConfig | undefined => {
196
+ if (!progress) {
197
+ return undefined;
198
+ }
199
+
200
+ const nativeProgressConfig = { ...progress };
201
+ delete nativeProgressConfig.completionProgressCap;
202
+
203
+ return Object.keys(nativeProgressConfig).length ? nativeProgressConfig : undefined;
204
+ };
205
+
206
+ const isPhotoLibraryUri = (uri: string) => {
207
+ const normalizedUri = uri.toLowerCase();
208
+ return normalizedUri.startsWith('ph://') || normalizedUri.startsWith('assets-library://');
209
+ };
210
+
211
+ const sanitizeResolvedFileUri = (uri: string) => {
212
+ const normalizedUri = uri.startsWith('/') ? `file://${uri}` : uri;
213
+
214
+ if (!normalizedUri.startsWith('file://')) {
215
+ return normalizedUri;
216
+ }
217
+
218
+ return normalizedUri.split('#')[0].split('?')[0];
219
+ };
220
+
221
+ const resolvePartUri = async (
222
+ part: NativeMultipartUploadPart,
223
+ getLocalAssetUri: CreateNativeMultipartUploadOptions['getLocalAssetUri'],
224
+ ): Promise<NativeMultipartUploadPart> => {
225
+ if (
226
+ part.kind !== 'file' ||
227
+ typeof getLocalAssetUri !== 'function' ||
228
+ !isPhotoLibraryUri(part.uri)
229
+ ) {
230
+ return part;
231
+ }
232
+
233
+ try {
234
+ const resolvedUri = await getLocalAssetUri(part.uri);
235
+
236
+ return {
237
+ ...part,
238
+ uri: resolvedUri ? sanitizeResolvedFileUri(resolvedUri) : part.uri,
239
+ };
240
+ } catch {
241
+ return part;
242
+ }
243
+ };
244
+
245
+ export const createNativeMultipartUploader = (
246
+ nativeModule: NativeMultipartUploaderModule | null | undefined,
247
+ options: CreateNativeMultipartUploaderOptions = {},
248
+ ): NativeMultipartUploader | undefined => {
249
+ if (!nativeModule) {
250
+ return undefined;
251
+ }
252
+
253
+ const multipartUploadEventEmitter = options.eventEmitter ?? new NativeEventEmitter(nativeModule);
254
+
255
+ return async ({
256
+ headers,
257
+ method,
258
+ onProgress,
259
+ parts,
260
+ progress,
261
+ signal,
262
+ timeoutMs,
263
+ uploadId,
264
+ url,
265
+ }: NativeMultipartUploaderRequest): Promise<NativeMultipartUploadResult> => {
266
+ let progressSubscription:
267
+ | {
268
+ remove: () => void;
269
+ }
270
+ | undefined;
271
+ let uploadStarted = false;
272
+
273
+ const abortUpload = async () => {
274
+ try {
275
+ await nativeModule.cancelUpload(uploadId);
276
+ } catch {
277
+ // Ignore cancellation races for already-finished uploads.
278
+ }
279
+ };
280
+
281
+ const handleAbort = () => {
282
+ if (uploadStarted) {
283
+ abortUpload().catch(() => undefined);
284
+ }
285
+ };
286
+
287
+ if (signal?.aborted) {
288
+ throw createCanceledError();
289
+ }
290
+
291
+ const removeAbortListener = addAbortHandler(signal, handleAbort);
292
+
293
+ if (signal?.aborted) {
294
+ removeAbortListener();
295
+ throw createCanceledError();
296
+ }
297
+
298
+ if (onProgress) {
299
+ progressSubscription = multipartUploadEventEmitter.addListener(
300
+ STREAM_MULTIPART_UPLOAD_PROGRESS_EVENT,
301
+ (event: NativeMultipartUploadProgressEvent) => {
302
+ if (event.uploadId !== uploadId) {
303
+ return;
304
+ }
305
+
306
+ onProgress({
307
+ loaded: event.loaded,
308
+ total: typeof event.total === 'number' ? event.total : undefined,
309
+ });
310
+ },
311
+ );
312
+ }
313
+
314
+ try {
315
+ uploadStarted = true;
316
+ const response = await nativeModule.uploadMultipart(
317
+ uploadId,
318
+ url,
319
+ method,
320
+ toUploadHeaders(headers),
321
+ parts,
322
+ progress ?? {},
323
+ timeoutMs,
324
+ );
325
+
326
+ if (signal?.aborted) {
327
+ throw createCanceledError();
328
+ }
329
+
330
+ return {
331
+ body: response.body,
332
+ headers: fromUploadHeaders(response.headers),
333
+ status: response.status,
334
+ statusText: typeof response.statusText === 'string' ? response.statusText : undefined,
335
+ };
336
+ } catch (error) {
337
+ if (signal?.aborted) {
338
+ throw createCanceledError();
339
+ }
340
+
341
+ throw error;
342
+ } finally {
343
+ progressSubscription?.remove();
344
+ removeAbortListener();
345
+ }
346
+ };
347
+ };
348
+
349
+ export const createNativeMultipartUpload = ({
350
+ getLocalAssetUri,
351
+ uploadIdFactory = createDefaultUploadId,
352
+ uploadMultipart,
353
+ }: CreateNativeMultipartUploadOptions): NativeMultipartUpload | undefined => {
354
+ if (!uploadMultipart) {
355
+ return undefined;
356
+ }
357
+
358
+ return async ({
359
+ headers,
360
+ method,
361
+ onProgress,
362
+ parts,
363
+ progress,
364
+ signal,
365
+ timeoutMs,
366
+ url,
367
+ }: NativeMultipartUploadRequest) => {
368
+ const resolvedParts = await Promise.all(
369
+ parts.map((part) => resolvePartUri(part, getLocalAssetUri)),
370
+ );
371
+
372
+ return uploadMultipart({
373
+ headers,
374
+ method,
375
+ onProgress,
376
+ parts: resolvedParts,
377
+ progress: getNativeProgressConfig(progress),
378
+ signal,
379
+ timeoutMs,
380
+ uploadId: uploadIdFactory(),
381
+ url,
382
+ });
383
+ };
384
+ };
@@ -43,6 +43,8 @@ export type UploadAttachmentPreviewProps<A extends LocalUploadAttachment> = {
43
43
 
44
44
  export interface DefaultAttachmentData {
45
45
  originalFile?: File;
46
+ /** Matches `LocalAttachment.localMetadata.id` / `uploadManager` record id for pending uploads */
47
+ localId?: string;
46
48
  }
47
49
 
48
50
  export interface DefaultUserData {