@ethora/chat-component-rn 26.5.7 → 26.5.10

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 (371) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/README.md +67 -10
  3. package/index.js +24 -0
  4. package/lib/commonjs/assets/icons.js +5 -1
  5. package/lib/commonjs/assets/icons.js.map +1 -1
  6. package/lib/commonjs/components/ContextMenu/ContextMenuComponents.js +11 -5
  7. package/lib/commonjs/components/ContextMenu/ContextMenuComponents.js.map +1 -1
  8. package/lib/commonjs/components/MainComponents/ChatRoom.js +64 -38
  9. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  10. package/lib/commonjs/components/MainComponents/ChatWrapper.js +57 -13
  11. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  12. package/lib/commonjs/components/MainComponents/MediaMessage.js +4 -2
  13. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  14. package/lib/commonjs/components/MainComponents/MessageContainer.js +2 -2
  15. package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
  16. package/lib/commonjs/components/MainComponents/MessageList.js +165 -28
  17. package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
  18. package/lib/commonjs/components/MainComponents/ReduxWrapper.js +17 -8
  19. package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
  20. package/lib/commonjs/components/MainComponents/SystemMessage.js +34 -22
  21. package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
  22. package/lib/commonjs/components/MessageBubble/Message.js +84 -39
  23. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  24. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +82 -22
  25. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  26. package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +16 -4
  27. package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
  28. package/lib/commonjs/components/Modals/FilePreviewModal/DocumentViewer.js +104 -0
  29. package/lib/commonjs/components/Modals/FilePreviewModal/DocumentViewer.js.map +1 -0
  30. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +140 -24
  31. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  32. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +29 -1
  33. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  34. package/lib/commonjs/components/Modals/Modal/Modal.js +5 -1
  35. package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
  36. package/lib/commonjs/components/Modals/ModalWrapper/ModalWrapper.js +77 -47
  37. package/lib/commonjs/components/Modals/ModalWrapper/ModalWrapper.js.map +1 -1
  38. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +3 -3
  39. package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  40. package/lib/commonjs/components/Modals/styledModalComponents.js +4 -9
  41. package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
  42. package/lib/commonjs/components/styled/MediaFilePreview.js +47 -28
  43. package/lib/commonjs/components/styled/MediaFilePreview.js.map +1 -1
  44. package/lib/commonjs/components/styled/MessageImage.js +49 -9
  45. package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
  46. package/lib/commonjs/components/styled/NewMessageLabel.js +8 -6
  47. package/lib/commonjs/components/styled/NewMessageLabel.js.map +1 -1
  48. package/lib/commonjs/components/styled/SendInput.js +49 -27
  49. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  50. package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js +14 -4
  51. package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
  52. package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js +7 -2
  53. package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
  54. package/lib/commonjs/components/styled/UnsupportedType.js +5 -1
  55. package/lib/commonjs/components/styled/UnsupportedType.js.map +1 -1
  56. package/lib/commonjs/components/styled/VideoMessage.js +60 -14
  57. package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
  58. package/lib/commonjs/context/MessageNotificationContext.js +7 -7
  59. package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
  60. package/lib/commonjs/context/xmppProvider.js +244 -32
  61. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  62. package/lib/commonjs/helpers/chatAutoEnterer.js +2 -7
  63. package/lib/commonjs/helpers/chatAutoEnterer.js.map +1 -1
  64. package/lib/commonjs/helpers/historyPreloadScheduler.js +4 -1
  65. package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
  66. package/lib/commonjs/helpers/insertMessageWithDelimiter.js +15 -5
  67. package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
  68. package/lib/commonjs/helpers/keyboardLayout.js +18 -0
  69. package/lib/commonjs/helpers/keyboardLayout.js.map +1 -0
  70. package/lib/commonjs/helpers/mediaDimensions.js +51 -0
  71. package/lib/commonjs/helpers/mediaDimensions.js.map +1 -0
  72. package/lib/commonjs/helpers/normalizeRoomJid.js +20 -0
  73. package/lib/commonjs/helpers/normalizeRoomJid.js.map +1 -0
  74. package/lib/commonjs/hooks/useChatRoomFocus.js +87 -0
  75. package/lib/commonjs/hooks/useChatRoomFocus.js.map +1 -0
  76. package/lib/commonjs/hooks/useHeapSender.js +1 -1
  77. package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
  78. package/lib/commonjs/hooks/useLogout.js +3 -3
  79. package/lib/commonjs/hooks/useLogout.js.map +1 -1
  80. package/lib/commonjs/hooks/usePushNotifications.js +6 -2
  81. package/lib/commonjs/hooks/usePushNotifications.js.map +1 -1
  82. package/lib/commonjs/hooks/useRoomState.js +2 -0
  83. package/lib/commonjs/hooks/useRoomState.js.map +1 -1
  84. package/lib/commonjs/hooks/useSendMessage.js +201 -10
  85. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  86. package/lib/commonjs/hooks/useUnreadMessagesCounter.js +12 -14
  87. package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
  88. package/lib/commonjs/main.js +7 -0
  89. package/lib/commonjs/main.js.map +1 -1
  90. package/lib/commonjs/networking/api-requests/auth.api.js +67 -0
  91. package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
  92. package/lib/commonjs/networking/apiClient.js +2 -1
  93. package/lib/commonjs/networking/apiClient.js.map +1 -1
  94. package/lib/commonjs/networking/outboundQueue.js +92 -0
  95. package/lib/commonjs/networking/outboundQueue.js.map +1 -0
  96. package/lib/commonjs/networking/xmpp/createTimeoutPromise.xmpp.js +4 -1
  97. package/lib/commonjs/networking/xmpp/createTimeoutPromise.xmpp.js.map +1 -1
  98. package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js +7 -8
  99. package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
  100. package/lib/commonjs/networking/xmpp/getRoomsPaged.xmpp.js +26 -3
  101. package/lib/commonjs/networking/xmpp/getRoomsPaged.xmpp.js.map +1 -1
  102. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +26 -8
  103. package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  104. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +2 -1
  105. package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  106. package/lib/commonjs/networking/xmppClient.js +294 -35
  107. package/lib/commonjs/networking/xmppClient.js.map +1 -1
  108. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +22 -6
  109. package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  110. package/lib/commonjs/roomStore/roomsSlice.js +157 -23
  111. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  112. package/lib/commonjs/utils/installPromiseRejectionTracker.js +83 -0
  113. package/lib/commonjs/utils/installPromiseRejectionTracker.js.map +1 -0
  114. package/lib/commonjs/utils/resendMessage.js +1 -1
  115. package/lib/commonjs/utils/resendMessage.js.map +1 -1
  116. package/lib/module/assets/icons.js +5 -1
  117. package/lib/module/assets/icons.js.map +1 -1
  118. package/lib/module/components/ContextMenu/ContextMenuComponents.js +11 -5
  119. package/lib/module/components/ContextMenu/ContextMenuComponents.js.map +1 -1
  120. package/lib/module/components/MainComponents/ChatRoom.js +65 -39
  121. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  122. package/lib/module/components/MainComponents/ChatWrapper.js +57 -13
  123. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  124. package/lib/module/components/MainComponents/MediaMessage.js +4 -2
  125. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  126. package/lib/module/components/MainComponents/MessageContainer.js +2 -2
  127. package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
  128. package/lib/module/components/MainComponents/MessageList.js +166 -29
  129. package/lib/module/components/MainComponents/MessageList.js.map +1 -1
  130. package/lib/module/components/MainComponents/ReduxWrapper.js +18 -8
  131. package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
  132. package/lib/module/components/MainComponents/SystemMessage.js +33 -21
  133. package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
  134. package/lib/module/components/MessageBubble/Message.js +85 -40
  135. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  136. package/lib/module/components/MessageBubble/MessageInteractions.js +84 -24
  137. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  138. package/lib/module/components/Modals/AttachSheet/AttachSheet.js +15 -3
  139. package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
  140. package/lib/module/components/Modals/FilePreviewModal/DocumentViewer.js +99 -0
  141. package/lib/module/components/Modals/FilePreviewModal/DocumentViewer.js.map +1 -0
  142. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +143 -25
  143. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  144. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +31 -3
  145. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  146. package/lib/module/components/Modals/Modal/Modal.js +5 -1
  147. package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
  148. package/lib/module/components/Modals/ModalWrapper/ModalWrapper.js +79 -49
  149. package/lib/module/components/Modals/ModalWrapper/ModalWrapper.js.map +1 -1
  150. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +3 -3
  151. package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
  152. package/lib/module/components/Modals/styledModalComponents.js +4 -9
  153. package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
  154. package/lib/module/components/styled/MediaFilePreview.js +47 -28
  155. package/lib/module/components/styled/MediaFilePreview.js.map +1 -1
  156. package/lib/module/components/styled/MessageImage.js +51 -11
  157. package/lib/module/components/styled/MessageImage.js.map +1 -1
  158. package/lib/module/components/styled/NewMessageLabel.js +8 -6
  159. package/lib/module/components/styled/NewMessageLabel.js.map +1 -1
  160. package/lib/module/components/styled/SendInput.js +50 -28
  161. package/lib/module/components/styled/SendInput.js.map +1 -1
  162. package/lib/module/components/styled/StyledInputComponents/MediaComponents.js +14 -4
  163. package/lib/module/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
  164. package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js +7 -2
  165. package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
  166. package/lib/module/components/styled/UnsupportedType.js +5 -1
  167. package/lib/module/components/styled/UnsupportedType.js.map +1 -1
  168. package/lib/module/components/styled/VideoMessage.js +61 -15
  169. package/lib/module/components/styled/VideoMessage.js.map +1 -1
  170. package/lib/module/context/MessageNotificationContext.js +7 -7
  171. package/lib/module/context/MessageNotificationContext.js.map +1 -1
  172. package/lib/module/context/xmppProvider.js +246 -34
  173. package/lib/module/context/xmppProvider.js.map +1 -1
  174. package/lib/module/helpers/chatAutoEnterer.js +2 -7
  175. package/lib/module/helpers/chatAutoEnterer.js.map +1 -1
  176. package/lib/module/helpers/historyPreloadScheduler.js +4 -1
  177. package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
  178. package/lib/module/helpers/insertMessageWithDelimiter.js +15 -5
  179. package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
  180. package/lib/module/helpers/keyboardLayout.js +12 -0
  181. package/lib/module/helpers/keyboardLayout.js.map +1 -0
  182. package/lib/module/helpers/mediaDimensions.js +46 -0
  183. package/lib/module/helpers/mediaDimensions.js.map +1 -0
  184. package/lib/module/helpers/normalizeRoomJid.js +15 -0
  185. package/lib/module/helpers/normalizeRoomJid.js.map +1 -0
  186. package/lib/module/hooks/useChatRoomFocus.js +82 -0
  187. package/lib/module/hooks/useChatRoomFocus.js.map +1 -0
  188. package/lib/module/hooks/useHeapSender.js +1 -1
  189. package/lib/module/hooks/useHeapSender.js.map +1 -1
  190. package/lib/module/hooks/useLogout.js +3 -3
  191. package/lib/module/hooks/useLogout.js.map +1 -1
  192. package/lib/module/hooks/usePushNotifications.js +6 -2
  193. package/lib/module/hooks/usePushNotifications.js.map +1 -1
  194. package/lib/module/hooks/useRoomState.js +2 -0
  195. package/lib/module/hooks/useRoomState.js.map +1 -1
  196. package/lib/module/hooks/useSendMessage.js +203 -12
  197. package/lib/module/hooks/useSendMessage.js.map +1 -1
  198. package/lib/module/hooks/useUnreadMessagesCounter.js +12 -14
  199. package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
  200. package/lib/module/main.js +1 -0
  201. package/lib/module/main.js.map +1 -1
  202. package/lib/module/networking/api-requests/auth.api.js +67 -1
  203. package/lib/module/networking/api-requests/auth.api.js.map +1 -1
  204. package/lib/module/networking/apiClient.js +2 -1
  205. package/lib/module/networking/apiClient.js.map +1 -1
  206. package/lib/module/networking/outboundQueue.js +84 -0
  207. package/lib/module/networking/outboundQueue.js.map +1 -0
  208. package/lib/module/networking/xmpp/createTimeoutPromise.xmpp.js +4 -1
  209. package/lib/module/networking/xmpp/createTimeoutPromise.xmpp.js.map +1 -1
  210. package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js +7 -8
  211. package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
  212. package/lib/module/networking/xmpp/getRoomsPaged.xmpp.js +26 -3
  213. package/lib/module/networking/xmpp/getRoomsPaged.xmpp.js.map +1 -1
  214. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +26 -8
  215. package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
  216. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +2 -1
  217. package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
  218. package/lib/module/networking/xmppClient.js +294 -35
  219. package/lib/module/networking/xmppClient.js.map +1 -1
  220. package/lib/module/roomStore/Middleware/unreadMidlleware.js +22 -6
  221. package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
  222. package/lib/module/roomStore/roomsSlice.js +154 -22
  223. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  224. package/lib/module/utils/installPromiseRejectionTracker.js +78 -0
  225. package/lib/module/utils/installPromiseRejectionTracker.js.map +1 -0
  226. package/lib/module/utils/resendMessage.js +1 -1
  227. package/lib/module/utils/resendMessage.js.map +1 -1
  228. package/lib/typescript/assets/icons.d.ts +8 -4
  229. package/lib/typescript/assets/icons.d.ts.map +1 -1
  230. package/lib/typescript/components/ContextMenu/ContextMenuComponents.d.ts.map +1 -1
  231. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  232. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  233. package/lib/typescript/components/MainComponents/MediaMessage.d.ts +1 -0
  234. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  235. package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
  236. package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
  237. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts +1 -0
  238. package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
  239. package/lib/typescript/components/MainComponents/SystemMessage.d.ts +0 -7
  240. package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
  241. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  242. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +4 -2
  243. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  244. package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts.map +1 -1
  245. package/lib/typescript/components/Modals/FilePreviewModal/DocumentViewer.d.ts +29 -0
  246. package/lib/typescript/components/Modals/FilePreviewModal/DocumentViewer.d.ts.map +1 -0
  247. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts +0 -1
  248. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  249. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  250. package/lib/typescript/components/Modals/Modal/Modal.d.ts.map +1 -1
  251. package/lib/typescript/components/Modals/ModalWrapper/ModalWrapper.d.ts.map +1 -1
  252. package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
  253. package/lib/typescript/components/Modals/styledModalComponents.d.ts.map +1 -1
  254. package/lib/typescript/components/styled/MediaFilePreview.d.ts.map +1 -1
  255. package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
  256. package/lib/typescript/components/styled/NewMessageLabel.d.ts +1 -5
  257. package/lib/typescript/components/styled/NewMessageLabel.d.ts.map +1 -1
  258. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  259. package/lib/typescript/components/styled/StyledInputComponents/MediaComponents.d.ts +9 -1
  260. package/lib/typescript/components/styled/StyledInputComponents/MediaComponents.d.ts.map +1 -1
  261. package/lib/typescript/components/styled/StyledInputComponents/StyledInputComponents.d.ts.map +1 -1
  262. package/lib/typescript/components/styled/UnsupportedType.d.ts +1 -0
  263. package/lib/typescript/components/styled/UnsupportedType.d.ts.map +1 -1
  264. package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
  265. package/lib/typescript/context/xmppProvider.d.ts +1 -0
  266. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  267. package/lib/typescript/helpers/chatAutoEnterer.d.ts.map +1 -1
  268. package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
  269. package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
  270. package/lib/typescript/helpers/keyboardLayout.d.ts +9 -0
  271. package/lib/typescript/helpers/keyboardLayout.d.ts.map +1 -0
  272. package/lib/typescript/helpers/mediaDimensions.d.ts +9 -0
  273. package/lib/typescript/helpers/mediaDimensions.d.ts.map +1 -0
  274. package/lib/typescript/helpers/normalizeRoomJid.d.ts +2 -0
  275. package/lib/typescript/helpers/normalizeRoomJid.d.ts.map +1 -0
  276. package/lib/typescript/hooks/useChatRoomFocus.d.ts +42 -0
  277. package/lib/typescript/hooks/useChatRoomFocus.d.ts.map +1 -0
  278. package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
  279. package/lib/typescript/hooks/usePushNotifications.d.ts.map +1 -1
  280. package/lib/typescript/hooks/useRoomState.d.ts +1 -0
  281. package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
  282. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  283. package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts.map +1 -1
  284. package/lib/typescript/main.d.ts +1 -0
  285. package/lib/typescript/main.d.ts.map +1 -1
  286. package/lib/typescript/networking/api-requests/auth.api.d.ts +3 -0
  287. package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
  288. package/lib/typescript/networking/apiClient.d.ts.map +1 -1
  289. package/lib/typescript/networking/outboundQueue.d.ts +57 -0
  290. package/lib/typescript/networking/outboundQueue.d.ts.map +1 -0
  291. package/lib/typescript/networking/xmpp/createTimeoutPromise.xmpp.d.ts.map +1 -1
  292. package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts +1 -1
  293. package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts.map +1 -1
  294. package/lib/typescript/networking/xmpp/getRoomsPaged.xmpp.d.ts +1 -1
  295. package/lib/typescript/networking/xmpp/getRoomsPaged.xmpp.d.ts.map +1 -1
  296. package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
  297. package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
  298. package/lib/typescript/networking/xmppClient.d.ts +33 -4
  299. package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
  300. package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
  301. package/lib/typescript/roomStore/roomsSlice.d.ts +8 -1
  302. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  303. package/lib/typescript/types/models/media.model.d.ts +1 -0
  304. package/lib/typescript/types/models/media.model.d.ts.map +1 -1
  305. package/lib/typescript/types/models/xmpp.model.d.ts +1 -1
  306. package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
  307. package/lib/typescript/types/types.d.ts +4 -0
  308. package/lib/typescript/types/types.d.ts.map +1 -1
  309. package/lib/typescript/utils/installPromiseRejectionTracker.d.ts +20 -0
  310. package/lib/typescript/utils/installPromiseRejectionTracker.d.ts.map +1 -0
  311. package/lib/typescript/utils/resendMessage.d.ts.map +1 -1
  312. package/package.json +18 -2
  313. package/src/assets/icons.tsx +23 -14
  314. package/src/components/ContextMenu/ContextMenuComponents.tsx +10 -5
  315. package/src/components/MainComponents/ChatRoom.tsx +81 -66
  316. package/src/components/MainComponents/ChatWrapper.tsx +99 -21
  317. package/src/components/MainComponents/MediaMessage.tsx +3 -0
  318. package/src/components/MainComponents/MessageContainer.tsx +4 -2
  319. package/src/components/MainComponents/MessageList.tsx +175 -28
  320. package/src/components/MainComponents/ReduxWrapper.tsx +19 -9
  321. package/src/components/MainComponents/SystemMessage.tsx +38 -26
  322. package/src/components/MessageBubble/Message.tsx +91 -62
  323. package/src/components/MessageBubble/MessageInteractions.tsx +98 -29
  324. package/src/components/Modals/AttachSheet/AttachSheet.tsx +17 -3
  325. package/src/components/Modals/FilePreviewModal/DocumentViewer.tsx +93 -0
  326. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +152 -25
  327. package/src/components/Modals/FilePreviewModal/PdfView.tsx +32 -4
  328. package/src/components/Modals/Modal/Modal.tsx +4 -1
  329. package/src/components/Modals/ModalWrapper/ModalWrapper.tsx +70 -58
  330. package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +19 -15
  331. package/src/components/Modals/styledModalComponents.tsx +4 -9
  332. package/src/components/styled/MediaFilePreview.tsx +46 -26
  333. package/src/components/styled/MessageImage.tsx +58 -13
  334. package/src/components/styled/NewMessageLabel.tsx +8 -5
  335. package/src/components/styled/SendInput.tsx +64 -29
  336. package/src/components/styled/StyledInputComponents/MediaComponents.tsx +15 -5
  337. package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +7 -2
  338. package/src/components/styled/UnsupportedType.tsx +7 -1
  339. package/src/components/styled/VideoMessage.tsx +59 -11
  340. package/src/context/MessageNotificationContext.tsx +8 -8
  341. package/src/context/xmppProvider.tsx +247 -30
  342. package/src/helpers/chatAutoEnterer.ts +2 -8
  343. package/src/helpers/historyPreloadScheduler.ts +4 -1
  344. package/src/helpers/insertMessageWithDelimiter.ts +22 -15
  345. package/src/helpers/keyboardLayout.ts +18 -0
  346. package/src/helpers/mediaDimensions.ts +47 -0
  347. package/src/helpers/normalizeRoomJid.ts +6 -0
  348. package/src/hooks/useChatRoomFocus.ts +95 -0
  349. package/src/hooks/useHeapSender.tsx +2 -1
  350. package/src/hooks/useLogout.tsx +3 -3
  351. package/src/hooks/usePushNotifications.ts +21 -8
  352. package/src/hooks/useRoomState.tsx +4 -0
  353. package/src/hooks/useSendMessage.tsx +258 -13
  354. package/src/hooks/useUnreadMessagesCounter.ts +13 -16
  355. package/src/main.ts +1 -0
  356. package/src/networking/api-requests/auth.api.ts +55 -1
  357. package/src/networking/apiClient.ts +2 -1
  358. package/src/networking/outboundQueue.ts +98 -0
  359. package/src/networking/xmpp/createTimeoutPromise.xmpp.ts +5 -1
  360. package/src/networking/xmpp/flushLastViewedToPrivateStore.ts +11 -13
  361. package/src/networking/xmpp/getRoomsPaged.xmpp.ts +27 -3
  362. package/src/networking/xmpp/presenceInRoom.xmpp.ts +24 -9
  363. package/src/networking/xmpp/sendTextMessage.xmpp.ts +2 -1
  364. package/src/networking/xmppClient.ts +317 -43
  365. package/src/roomStore/Middleware/unreadMidlleware.tsx +23 -5
  366. package/src/roomStore/roomsSlice.ts +177 -27
  367. package/src/types/models/media.model.ts +3 -0
  368. package/src/types/models/xmpp.model.ts +2 -1
  369. package/src/types/types.ts +15 -0
  370. package/src/utils/installPromiseRejectionTracker.ts +91 -0
  371. package/src/utils/resendMessage.ts +2 -1
@@ -1,4 +1,4 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import styled from 'styled-components/native';
3
3
  import {
4
4
  CenterContainer,
@@ -11,19 +11,94 @@ import Button from '../../styled/Button';
11
11
  import { RootState } from '../../../roomStore';
12
12
  import { FullScreenImage } from '../../styled/StyledInputComponents/MediaComponents';
13
13
  import { setActiveFile } from '../../../roomStore/chatSettingsSlice';
14
- import { Alert, Text, View, Platform } from 'react-native';
15
- import { Video, ResizeMode } from 'expo-av';
14
+ import {
15
+ Alert,
16
+ Text,
17
+ View,
18
+ Platform,
19
+ TouchableOpacity,
20
+ StyleSheet,
21
+ } from 'react-native';
22
+ import { useVideoPlayer, VideoView } from 'expo-video';
23
+ import { PlayIcon } from '../../../assets/icons';
16
24
  import * as FileSystem from 'expo-file-system/legacy';
17
25
  import * as MediaLibrary from 'expo-media-library';
18
26
  import { useToast } from '../../../context/ToastContext';
19
27
  import PdfViewer from './PdfView';
28
+ import DocumentViewer from './DocumentViewer';
29
+ import AudioMessage from '../../styled/AudioMessage';
20
30
  import { ensureFilenameHasExtension } from '../../../helpers/mimeToExtension';
21
31
 
22
- export const FullScreenVideo = styled.View`
23
- width: 100%;
24
- height: 100%;
25
- object-fit: contain;
26
- `;
32
+ // MIME types Google's gview embed renders reliably. Everything else
33
+ // falls through to the info-card so the user can still download.
34
+ const GVIEW_PREVIEWABLE = new Set<string>([
35
+ 'application/msword',
36
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
37
+ 'application/vnd.ms-excel',
38
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
39
+ 'application/vnd.ms-powerpoint',
40
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
41
+ 'text/plain',
42
+ 'text/csv',
43
+ 'application/rtf',
44
+ ]);
45
+ const isGviewPreviewable = (mime: string | undefined | null) => {
46
+ if (!mime) {return false;}
47
+ return GVIEW_PREVIEWABLE.has(mime.toLowerCase().split(';')[0]!.trim());
48
+ };
49
+
50
+ // Full-screen video preview on expo-video (expo-av <Video> is deprecated
51
+ // and rendered blank on Android). `contentFit: contain` fits the clip to
52
+ // the area with the surrounding letterbox painted as the view's own
53
+ // (transparent → theme) background, NOT black. `textureView` so the play
54
+ // overlay composites on top and nothing is clipped on Android.
55
+ const ModalVideo: React.FC<{ uri: string }> = ({ uri }) => {
56
+ const [showPlay, setShowPlay] = useState(true);
57
+
58
+ const player = useVideoPlayer(uri, (p) => {
59
+ p.muted = false;
60
+ });
61
+
62
+ useEffect(() => {
63
+ const sub = player.addListener('playingChange', ({ isPlaying }) => {
64
+ if (isPlaying) {setShowPlay(false);}
65
+ });
66
+ return () => sub.remove();
67
+ }, [player]);
68
+
69
+ const handlePlay = () => {
70
+ setShowPlay(false);
71
+ player.play();
72
+ };
73
+
74
+ return (
75
+ <View style={{ flex: 1, width: '100%' }}>
76
+ <VideoView
77
+ player={player}
78
+ style={{ flex: 1, backgroundColor: 'transparent' }}
79
+ contentFit="contain"
80
+ nativeControls
81
+ surfaceType="textureView"
82
+ allowsFullscreen
83
+ />
84
+ {/* Play affordance shown immediately on open; tapping starts
85
+ playback and the native controls take over. */}
86
+ {showPlay && (
87
+ <TouchableOpacity
88
+ activeOpacity={0.8}
89
+ onPress={handlePlay}
90
+ style={StyleSheet.absoluteFillObject}
91
+ >
92
+ <View style={styles.playOverlay}>
93
+ <View style={styles.playButton}>
94
+ <PlayIcon width={28} height={28} />
95
+ </View>
96
+ </View>
97
+ </TouchableOpacity>
98
+ )}
99
+ </View>
100
+ );
101
+ };
27
102
 
28
103
  interface FilePreviewModalProps {
29
104
  handleCloseModal: any;
@@ -39,7 +114,7 @@ const FilePreviewModal: React.FC<FilePreviewModalProps> = ({
39
114
  (state: RootState) => state.chatSettingStore
40
115
  );
41
116
 
42
- if (!activeFile) {return;}
117
+ if (!activeFile) {return null;}
43
118
 
44
119
  const requestStoragePermission = async () => {
45
120
  try {
@@ -143,30 +218,47 @@ const FilePreviewModal: React.FC<FilePreviewModalProps> = ({
143
218
  handleCloseModal?.();
144
219
  };
145
220
 
146
- const getMediaComponent = useMemo(() => {
221
+ // NOTE: plain computed value, NOT useMemo. It sits AFTER the
222
+ // `if (!activeFile) return` guard above, so as a hook it would run
223
+ // conditionally (skipped when activeFile is null) — changing the hook
224
+ // count between renders and throwing "rendered more hooks than during
225
+ // the previous render", which crashed the modal the instant you tapped
226
+ // a video/image to open it. Recomputing this on each render is cheap.
227
+ const getMediaComponent: React.ReactNode = (() => {
147
228
  switch (true) {
148
229
  case activeFile.mimetype.startsWith('image/'):
149
230
  return (
150
231
  <FullScreenImage
151
- src={
152
- activeFile.fileURL ||
153
- 'https://as2.ftcdn.net/v2/jpg/02/51/95/53/1000_F_251955356_FAQH0U1y1TZw3ZcdPGybwUkH90a3VAhb.jpg'
154
- }
155
- alt={activeFile.fileName}
232
+ source={{
233
+ uri:
234
+ activeFile.fileURL ||
235
+ 'https://as2.ftcdn.net/v2/jpg/02/51/95/53/1000_F_251955356_FAQH0U1y1TZw3ZcdPGybwUkH90a3VAhb.jpg',
236
+ }}
237
+ resizeMode="contain"
238
+ accessibilityLabel={activeFile.fileName}
156
239
  />
157
240
  );
158
241
  case activeFile.mimetype.startsWith('video/'):
242
+ return <ModalVideo uri={activeFile.fileURL} />;
243
+ case activeFile.mimetype.startsWith('audio/'):
159
244
  return (
160
- <Video
245
+ <View
161
246
  style={{
162
247
  width: '100%',
163
- height: '100%',
248
+ padding: 20,
249
+ gap: 12,
250
+ backgroundColor: '#FFF8ED',
251
+ borderRadius: 16,
164
252
  }}
165
- source={{ uri: activeFile.fileURL }}
166
- useNativeControls
167
- resizeMode={ResizeMode.CONTAIN}
168
- shouldPlay={false}
169
- />
253
+ >
254
+ <Text style={{ fontSize: 16, fontWeight: '600' }}>
255
+ {ensureFilenameHasExtension(
256
+ activeFile.fileName,
257
+ activeFile.mimetype
258
+ )}
259
+ </Text>
260
+ <AudioMessage src={activeFile.fileURL} />
261
+ </View>
170
262
  );
171
263
  case activeFile.mimetype === 'application/pdf':
172
264
  return <PdfViewer pdfUrl={activeFile.fileURL} />;
@@ -175,6 +267,20 @@ const FilePreviewModal: React.FC<FilePreviewModalProps> = ({
175
267
  activeFile.fileName,
176
268
  activeFile.mimetype
177
269
  );
270
+ // Office docs (.docx / .xlsx / .pptx / .doc / .xls / .ppt /
271
+ // .txt / .csv / .rtf) → render inline via Google's gview embed
272
+ // — fixes the "blank preview" complaint for docs (bug #9).
273
+ if (isGviewPreviewable(activeFile.mimetype)) {
274
+ return (
275
+ <DocumentViewer
276
+ url={activeFile.fileURL}
277
+ fileName={displayName}
278
+ />
279
+ );
280
+ }
281
+ // True last-resort fallback for genuinely unrenderable types
282
+ // (binary blobs, exotic MIMEs). Friendly info card with the
283
+ // filename so the user can still download.
178
284
  return (
179
285
  <View
180
286
  style={{
@@ -198,7 +304,7 @@ const FilePreviewModal: React.FC<FilePreviewModalProps> = ({
198
304
  );
199
305
  }
200
306
  }
201
- }, [activeFile]);
307
+ })();
202
308
 
203
309
  return (
204
310
  <ModalContainerFullScreen>
@@ -217,10 +323,15 @@ const FilePreviewModal: React.FC<FilePreviewModalProps> = ({
217
323
  <CenterContainer
218
324
  style={{
219
325
  display: 'flex',
220
- height: '100%',
326
+ flex: 1,
221
327
  justifyContent: 'center',
222
- overflow: 'hidden',
328
+ // NOTE: do NOT set overflow:'hidden' here — on Android it clips
329
+ // hardware-accelerated children (expo-av Video TextureView and
330
+ // react-native-webview) to nothing, so video/PDF/doc previews
331
+ // render blank while plain <Image> survives.
332
+ overflow: 'visible',
223
333
  padding: 16,
334
+ paddingBottom: 48,
224
335
  }}
225
336
  >
226
337
  {getMediaComponent}
@@ -230,4 +341,20 @@ const FilePreviewModal: React.FC<FilePreviewModalProps> = ({
230
341
  );
231
342
  };
232
343
 
344
+ const styles = StyleSheet.create({
345
+ playOverlay: {
346
+ ...StyleSheet.absoluteFillObject,
347
+ justifyContent: 'center',
348
+ alignItems: 'center',
349
+ },
350
+ playButton: {
351
+ width: 64,
352
+ height: 64,
353
+ borderRadius: 32,
354
+ backgroundColor: 'rgba(0, 0, 0, 0.55)',
355
+ justifyContent: 'center',
356
+ alignItems: 'center',
357
+ },
358
+ });
359
+
233
360
  export default FilePreviewModal;
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { ActivityIndicator, StyleSheet, Text, View } from 'react-native';
2
+ import { ActivityIndicator, Platform, StyleSheet, Text, View } from 'react-native';
3
3
  import { WebView } from 'react-native-webview';
4
4
  import * as FileSystem from 'expo-file-system/legacy';
5
5
 
@@ -10,13 +10,20 @@ interface PdfViewerProps {
10
10
  const PdfViewer: React.FC<PdfViewerProps> = ({ pdfUrl }) => {
11
11
  const [localUri, setLocalUri] = useState<string | null>(null);
12
12
  const [error, setError] = useState<string | null>(null);
13
+ // Android's WebView has NO native PDF renderer, so a file:// (or direct)
14
+ // PDF loads blank. Route it through Google's gview embed using the
15
+ // (public) remote URL — same approach as DocumentViewer for office docs.
16
+ // iOS WKWebView renders PDFs natively, so we download + show the file.
17
+ const isAndroid = Platform.OS === 'android';
13
18
 
14
19
  useEffect(() => {
20
+ if (isAndroid) {
21
+ return;
22
+ }
15
23
  let cancelled = false;
16
24
  const run = async () => {
17
25
  try {
18
- const target =
19
- FileSystem.cacheDirectory + `pdf-${Date.now()}.pdf`;
26
+ const target = FileSystem.cacheDirectory + `pdf-${Date.now()}.pdf`;
20
27
  const result = await FileSystem.downloadAsync(pdfUrl, target);
21
28
  if (cancelled) {return;}
22
29
  setLocalUri(result.uri);
@@ -30,7 +37,28 @@ const PdfViewer: React.FC<PdfViewerProps> = ({ pdfUrl }) => {
30
37
  return () => {
31
38
  cancelled = true;
32
39
  };
33
- }, [pdfUrl]);
40
+ }, [pdfUrl, isAndroid]);
41
+
42
+ if (isAndroid) {
43
+ const gviewUrl = `https://docs.google.com/gview?embedded=true&url=${encodeURIComponent(
44
+ pdfUrl
45
+ )}`;
46
+ return (
47
+ <View style={styles.container}>
48
+ <WebView
49
+ source={{ uri: gviewUrl }}
50
+ style={styles.webview}
51
+ originWhitelist={['*']}
52
+ startInLoadingState
53
+ renderLoading={() => (
54
+ <View style={styles.center}>
55
+ <ActivityIndicator size="large" />
56
+ </View>
57
+ )}
58
+ />
59
+ </View>
60
+ );
61
+ }
34
62
 
35
63
  if (error) {
36
64
  return (
@@ -39,7 +39,10 @@ const Modal: React.FC<ModalProps> = ({ children, modal, setOpenModal }) => {
39
39
  };
40
40
  return (
41
41
  modal && (
42
- <ModalBackground id="modal-background" style={{ position: 'absolute' }}>
42
+ <ModalBackground
43
+ id="modal-background"
44
+ style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}
45
+ >
43
46
  {renderModalContent()}
44
47
  {children}
45
48
  </ModalBackground>
@@ -9,7 +9,7 @@ import {
9
9
  } from '../styledModalComponents';
10
10
  import { TextareaInput } from '../../styled/StyledInputComponents/StyledInputComponents';
11
11
  import Button from '../../styled/Button';
12
- import { Modal, Text, TextInput } from 'react-native';
12
+ import { Modal, Text, TextInput, View, StyleSheet } from 'react-native';
13
13
 
14
14
  interface ModalWrapperProps {
15
15
  iconTitle?: any;
@@ -53,6 +53,47 @@ export const ModalWrapper: FC<ModalWrapperProps> = ({
53
53
  // }
54
54
  // };
55
55
 
56
+ const inner = (
57
+ <>
58
+ <CloseButton onPress={handleCloseModal}>
59
+ <Text style={{ fontSize: 24 }}>&times;</Text>
60
+ </CloseButton>
61
+ {IconTitle ? <IconTitle /> : <ModalTitle>{title}</ModalTitle>}
62
+ {description && <ModalDescription>{description}</ModalDescription>}
63
+ {isTextarea && (
64
+ <GroupContainer
65
+ style={{ flexDirection: 'column', position: 'relative' }}
66
+ />
67
+ )}
68
+ {!buttonText && <GroupContainer />}
69
+ <GroupContainer>
70
+ <Button
71
+ onPress={handleCloseModal}
72
+ text={'Cancel'}
73
+ style={{ width: '100%' }}
74
+ unstyled
75
+ variant="outlined"
76
+ />
77
+ {buttonText && (
78
+ <Button
79
+ onPress={handleClick}
80
+ text={buttonText}
81
+ // White label on the filled (e.g. red Delete) button. Button
82
+ // applies an inline `color: color || 'black'` that overrides
83
+ // the filled-variant white, so pass it explicitly.
84
+ color="#FFFFFF"
85
+ style={{
86
+ width: '100%',
87
+ backgroundColor: backgroundColorButton,
88
+ }}
89
+ unstyled
90
+ variant="filled"
91
+ />
92
+ )}
93
+ </GroupContainer>
94
+ </>
95
+ );
96
+
56
97
  return (
57
98
  <Modal
58
99
  transparent
@@ -61,64 +102,35 @@ export const ModalWrapper: FC<ModalWrapperProps> = ({
61
102
  onRequestClose={handleCloseModal}
62
103
  >
63
104
  <ModalBackground>
64
- <ModalContainer
65
- style={
66
- compact
67
- ? {
68
- flex: 0,
69
- width: '85%',
70
- maxWidth: 360,
71
- height: 'auto',
72
- padding: 24,
73
- borderRadius: 16,
74
- gap: 16,
75
- }
76
- : { maxWidth: 640 }
77
- }
78
- >
79
- <CloseButton onPress={handleCloseModal}>
80
- <Text style={{ fontSize: 24 }}>&times;</Text>
81
- </CloseButton>
82
- {IconTitle ? <IconTitle /> : <ModalTitle>{title}</ModalTitle>}
83
- {description && <ModalDescription>{description}</ModalDescription>}
84
- {isTextarea && (
85
- <GroupContainer
86
- style={{ flexDirection: 'column', position: 'relative' }}
87
- >
88
- {/* <TextareaInput
89
- ref={textareaRef}
90
- onInput={handleInput}
91
- id="additionalDetails"
92
- value={textarea}
93
- onChangeText={(text) => setTextarea(text)}
94
- placeholder="Additional Details"
95
- /> */}
96
- </GroupContainer>
97
- )}
98
- {!buttonText && <GroupContainer />}
99
- <GroupContainer>
100
- <Button
101
- onPress={handleCloseModal}
102
- text={'Cancel'}
103
- style={{ width: '100%' }}
104
- unstyled
105
- variant="outlined"
106
- />
107
- {buttonText && (
108
- <Button
109
- onPress={handleClick}
110
- text={buttonText}
111
- style={{
112
- width: '100%',
113
- backgroundColor: backgroundColorButton,
114
- }}
115
- unstyled
116
- variant="filled"
117
- />
118
- )}
119
- </GroupContainer>
120
- </ModalContainer>
105
+ {compact ? (
106
+ // Dedicated small centered dialog. The base ModalContainer is
107
+ // flex:1 / width:100% / height:100% (full-screen); style-merge
108
+ // overrides proved unreliable, so confirm-style modals render in
109
+ // their own bounded View instead — never full-screen (#14).
110
+ // (Upstream also shrank this modal; this keeps that intent while
111
+ // adding the white filled-button label via `inner` below.)
112
+ <View style={styles.compactDialog}>{inner}</View>
113
+ ) : (
114
+ <ModalContainer style={{ maxWidth: 640 }}>{inner}</ModalContainer>
115
+ )}
121
116
  </ModalBackground>
122
117
  </Modal>
123
118
  );
124
119
  };
120
+
121
+ const styles = StyleSheet.create({
122
+ compactDialog: {
123
+ width: '85%',
124
+ maxWidth: 360,
125
+ alignSelf: 'center',
126
+ backgroundColor: '#fff',
127
+ borderRadius: 16,
128
+ padding: 24,
129
+ gap: 16,
130
+ shadowColor: '#000',
131
+ shadowOffset: { width: 0, height: 4 },
132
+ shadowOpacity: 0.2,
133
+ shadowRadius: 12,
134
+ elevation: 8,
135
+ },
136
+ });
@@ -285,22 +285,26 @@ const UserProfileModal: React.FC<UserProfileModalProps> = ({
285
285
  </LabelData>
286
286
  </BorderedContainer>
287
287
 
288
- {selectedUser && !config?.disableProfilesInteractions && (
288
+ {selectedUser && !config?.disableMemberProfileActions && (
289
289
  <>
290
- <ActionButton
291
- StartIcon={<ChatIcon />}
292
- onPress={handlePrivateMessage}
293
- variant="filled"
294
- >
295
- <Text style={{ color: '#ffffff' }}>Message</Text>
296
- </ActionButton>
297
- <ActionButton
298
- onPress={() => {}}
299
- // onPress={() => handleCopyClick(selectedUser.id)}
300
- variant="filled"
301
- >
302
- <Text style={{ color: '#ffffff' }}>Copy User Id</Text>
303
- </ActionButton>
290
+ {!config?.hideMemberSendMessageAction && (
291
+ <ActionButton
292
+ StartIcon={<ChatIcon />}
293
+ onPress={handlePrivateMessage}
294
+ variant="filled"
295
+ >
296
+ <Text style={{ color: '#ffffff' }}>Message</Text>
297
+ </ActionButton>
298
+ )}
299
+ {!config?.hideMemberCopyIdAction && (
300
+ <ActionButton
301
+ onPress={() => {}}
302
+ // onPress={() => handleCopyClick(selectedUser.id)}
303
+ variant="filled"
304
+ >
305
+ <Text style={{ color: '#ffffff' }}>Copy User Id</Text>
306
+ </ActionButton>
307
+ )}
304
308
  </>
305
309
  )}
306
310
 
@@ -21,17 +21,12 @@ export const CloseButton = styled.TouchableOpacity`
21
21
  font-size: 20px;
22
22
  cursor: pointer;
23
23
  color: #888;
24
-
25
- &:hover {
26
- color: #555;
27
- background-color: #dddddd;
28
- }
29
24
  `;
30
25
 
31
26
  export const ModalContainer = styled.View`
32
- flex: 1;
33
- width: 100%;
34
- height: 100%;
27
+ // flex: 1;
28
+ // width: 100%;
29
+ // height: 100%;
35
30
  background: white;
36
31
  padding: 32px 64px;
37
32
  box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2);
@@ -57,7 +52,7 @@ export const ModalDescription = styled.Text`
57
52
 
58
53
  export const GroupContainer = styled.View`
59
54
  display: flex;
60
- gap: 32px;
55
+ gap: 16px;
61
56
  width: 100%;
62
57
  padding: 0;
63
58
  `;
@@ -7,13 +7,56 @@ import { FileIcon } from '../../assets/icons';
7
7
  import { RemoveButton, RemoveButtonText } from './StyledComponents';
8
8
  import { FC, useState } from 'react';
9
9
  import { MediaFile } from '../../types/types';
10
- import { Video, ResizeMode } from 'expo-av';
10
+ import { useVideoPlayer, VideoView } from 'expo-video';
11
11
 
12
12
  interface MediaFilePreviewProps {
13
13
  filePreviews: MediaFile[];
14
14
  handleRemoveImage: (index: number) => void;
15
15
  }
16
16
 
17
+ const VideoThumb: FC<{ uri: string; onPress: () => void }> = ({
18
+ uri,
19
+ onPress,
20
+ }) => {
21
+ const player = useVideoPlayer(uri, (p) => {
22
+ p.muted = true;
23
+ });
24
+ return (
25
+ <TouchableOpacity
26
+ activeOpacity={0.8}
27
+ onPress={onPress}
28
+ style={styles.videoThumb}
29
+ >
30
+ <VideoView
31
+ player={player}
32
+ style={StyleSheet.absoluteFill}
33
+ contentFit="cover"
34
+ nativeControls={false}
35
+ surfaceType="textureView"
36
+ pointerEvents="none"
37
+ />
38
+ <View style={styles.playOverlay}>
39
+ <Text style={styles.playIcon}>▶</Text>
40
+ </View>
41
+ </TouchableOpacity>
42
+ );
43
+ };
44
+
45
+ const FullscreenPreviewVideo: FC<{ uri: string }> = ({ uri }) => {
46
+ const player = useVideoPlayer(uri, (p) => {
47
+ p.play();
48
+ });
49
+ return (
50
+ <VideoView
51
+ player={player}
52
+ style={styles.fullVideo}
53
+ contentFit="contain"
54
+ nativeControls
55
+ surfaceType="textureView"
56
+ />
57
+ );
58
+ };
59
+
17
60
  export const MediaFilePreview: FC<MediaFilePreviewProps> = ({
18
61
  filePreviews,
19
62
  handleRemoveImage,
@@ -30,22 +73,7 @@ export const MediaFilePreview: FC<MediaFilePreviewProps> = ({
30
73
  {isImage ? (
31
74
  <MediaImage source={{ uri: file.uri }} />
32
75
  ) : isVideo ? (
33
- <TouchableOpacity
34
- activeOpacity={0.8}
35
- onPress={() => setPreviewUri(file.uri)}
36
- style={styles.videoThumb}
37
- >
38
- <Video
39
- source={{ uri: file.uri }}
40
- style={StyleSheet.absoluteFill}
41
- resizeMode={ResizeMode.COVER}
42
- shouldPlay={false}
43
- isMuted
44
- />
45
- <View style={styles.playOverlay}>
46
- <Text style={styles.playIcon}>▶</Text>
47
- </View>
48
- </TouchableOpacity>
76
+ <VideoThumb uri={file.uri} onPress={() => setPreviewUri(file.uri)} />
49
77
  ) : (
50
78
  <View style={{ width: 70, height: 70, borderRadius: 8 }}>
51
79
  <FileIcon width={70} height={70} />
@@ -66,15 +94,7 @@ export const MediaFilePreview: FC<MediaFilePreviewProps> = ({
66
94
  >
67
95
  <Text style={styles.closeText}>✕</Text>
68
96
  </TouchableOpacity>
69
- {previewUri && (
70
- <Video
71
- source={{ uri: previewUri }}
72
- style={styles.fullVideo}
73
- resizeMode={ResizeMode.CONTAIN}
74
- useNativeControls
75
- shouldPlay
76
- />
77
- )}
97
+ {previewUri && <FullscreenPreviewVideo uri={previewUri} />}
78
98
  </SafeAreaView>
79
99
  </Modal>
80
100
  </MediaContainer>