@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.
- package/CHANGELOG.md +133 -0
- package/README.md +67 -10
- package/index.js +24 -0
- package/lib/commonjs/assets/icons.js +5 -1
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/ContextMenu/ContextMenuComponents.js +11 -5
- package/lib/commonjs/components/ContextMenu/ContextMenuComponents.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +64 -38
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +57 -13
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MediaMessage.js +4 -2
- package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageContainer.js +2 -2
- package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +165 -28
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +17 -8
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/SystemMessage.js +34 -22
- package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/Message.js +84 -39
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +82 -22
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +16 -4
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/DocumentViewer.js +104 -0
- package/lib/commonjs/components/Modals/FilePreviewModal/DocumentViewer.js.map +1 -0
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +140 -24
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +29 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/commonjs/components/Modals/Modal/Modal.js +5 -1
- package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/commonjs/components/Modals/ModalWrapper/ModalWrapper.js +77 -47
- package/lib/commonjs/components/Modals/ModalWrapper/ModalWrapper.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +3 -3
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/styledModalComponents.js +4 -9
- package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/commonjs/components/styled/MediaFilePreview.js +47 -28
- package/lib/commonjs/components/styled/MediaFilePreview.js.map +1 -1
- package/lib/commonjs/components/styled/MessageImage.js +49 -9
- package/lib/commonjs/components/styled/MessageImage.js.map +1 -1
- package/lib/commonjs/components/styled/NewMessageLabel.js +8 -6
- package/lib/commonjs/components/styled/NewMessageLabel.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +49 -27
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js +14 -4
- package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js +7 -2
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/commonjs/components/styled/UnsupportedType.js +5 -1
- package/lib/commonjs/components/styled/UnsupportedType.js.map +1 -1
- package/lib/commonjs/components/styled/VideoMessage.js +60 -14
- package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
- package/lib/commonjs/context/MessageNotificationContext.js +7 -7
- package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +244 -32
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/chatAutoEnterer.js +2 -7
- package/lib/commonjs/helpers/chatAutoEnterer.js.map +1 -1
- package/lib/commonjs/helpers/historyPreloadScheduler.js +4 -1
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +15 -5
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/keyboardLayout.js +18 -0
- package/lib/commonjs/helpers/keyboardLayout.js.map +1 -0
- package/lib/commonjs/helpers/mediaDimensions.js +51 -0
- package/lib/commonjs/helpers/mediaDimensions.js.map +1 -0
- package/lib/commonjs/helpers/normalizeRoomJid.js +20 -0
- package/lib/commonjs/helpers/normalizeRoomJid.js.map +1 -0
- package/lib/commonjs/hooks/useChatRoomFocus.js +87 -0
- package/lib/commonjs/hooks/useChatRoomFocus.js.map +1 -0
- package/lib/commonjs/hooks/useHeapSender.js +1 -1
- package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
- package/lib/commonjs/hooks/useLogout.js +3 -3
- package/lib/commonjs/hooks/useLogout.js.map +1 -1
- package/lib/commonjs/hooks/usePushNotifications.js +6 -2
- package/lib/commonjs/hooks/usePushNotifications.js.map +1 -1
- package/lib/commonjs/hooks/useRoomState.js +2 -0
- package/lib/commonjs/hooks/useRoomState.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +201 -10
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js +12 -14
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/commonjs/main.js +7 -0
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/auth.api.js +67 -0
- package/lib/commonjs/networking/api-requests/auth.api.js.map +1 -1
- package/lib/commonjs/networking/apiClient.js +2 -1
- package/lib/commonjs/networking/apiClient.js.map +1 -1
- package/lib/commonjs/networking/outboundQueue.js +92 -0
- package/lib/commonjs/networking/outboundQueue.js.map +1 -0
- package/lib/commonjs/networking/xmpp/createTimeoutPromise.xmpp.js +4 -1
- package/lib/commonjs/networking/xmpp/createTimeoutPromise.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js +7 -8
- package/lib/commonjs/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
- package/lib/commonjs/networking/xmpp/getRoomsPaged.xmpp.js +26 -3
- package/lib/commonjs/networking/xmpp/getRoomsPaged.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +26 -8
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js +2 -1
- package/lib/commonjs/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +294 -35
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +22 -6
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +157 -23
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/utils/installPromiseRejectionTracker.js +83 -0
- package/lib/commonjs/utils/installPromiseRejectionTracker.js.map +1 -0
- package/lib/commonjs/utils/resendMessage.js +1 -1
- package/lib/commonjs/utils/resendMessage.js.map +1 -1
- package/lib/module/assets/icons.js +5 -1
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/ContextMenu/ContextMenuComponents.js +11 -5
- package/lib/module/components/ContextMenu/ContextMenuComponents.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +65 -39
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +57 -13
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/MediaMessage.js +4 -2
- package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
- package/lib/module/components/MainComponents/MessageContainer.js +2 -2
- package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +166 -29
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/ReduxWrapper.js +18 -8
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/SystemMessage.js +33 -21
- package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
- package/lib/module/components/MessageBubble/Message.js +85 -40
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +84 -24
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js +15 -3
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/DocumentViewer.js +99 -0
- package/lib/module/components/Modals/FilePreviewModal/DocumentViewer.js.map +1 -0
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +143 -25
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js +31 -3
- package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
- package/lib/module/components/Modals/Modal/Modal.js +5 -1
- package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/module/components/Modals/ModalWrapper/ModalWrapper.js +79 -49
- package/lib/module/components/Modals/ModalWrapper/ModalWrapper.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +3 -3
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/Modals/styledModalComponents.js +4 -9
- package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/module/components/styled/MediaFilePreview.js +47 -28
- package/lib/module/components/styled/MediaFilePreview.js.map +1 -1
- package/lib/module/components/styled/MessageImage.js +51 -11
- package/lib/module/components/styled/MessageImage.js.map +1 -1
- package/lib/module/components/styled/NewMessageLabel.js +8 -6
- package/lib/module/components/styled/NewMessageLabel.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +50 -28
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/MediaComponents.js +14 -4
- package/lib/module/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js +7 -2
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/module/components/styled/UnsupportedType.js +5 -1
- package/lib/module/components/styled/UnsupportedType.js.map +1 -1
- package/lib/module/components/styled/VideoMessage.js +61 -15
- package/lib/module/components/styled/VideoMessage.js.map +1 -1
- package/lib/module/context/MessageNotificationContext.js +7 -7
- package/lib/module/context/MessageNotificationContext.js.map +1 -1
- package/lib/module/context/xmppProvider.js +246 -34
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/chatAutoEnterer.js +2 -7
- package/lib/module/helpers/chatAutoEnterer.js.map +1 -1
- package/lib/module/helpers/historyPreloadScheduler.js +4 -1
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +15 -5
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/keyboardLayout.js +12 -0
- package/lib/module/helpers/keyboardLayout.js.map +1 -0
- package/lib/module/helpers/mediaDimensions.js +46 -0
- package/lib/module/helpers/mediaDimensions.js.map +1 -0
- package/lib/module/helpers/normalizeRoomJid.js +15 -0
- package/lib/module/helpers/normalizeRoomJid.js.map +1 -0
- package/lib/module/hooks/useChatRoomFocus.js +82 -0
- package/lib/module/hooks/useChatRoomFocus.js.map +1 -0
- package/lib/module/hooks/useHeapSender.js +1 -1
- package/lib/module/hooks/useHeapSender.js.map +1 -1
- package/lib/module/hooks/useLogout.js +3 -3
- package/lib/module/hooks/useLogout.js.map +1 -1
- package/lib/module/hooks/usePushNotifications.js +6 -2
- package/lib/module/hooks/usePushNotifications.js.map +1 -1
- package/lib/module/hooks/useRoomState.js +2 -0
- package/lib/module/hooks/useRoomState.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +203 -12
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js +12 -14
- package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/module/main.js +1 -0
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/auth.api.js +67 -1
- package/lib/module/networking/api-requests/auth.api.js.map +1 -1
- package/lib/module/networking/apiClient.js +2 -1
- package/lib/module/networking/apiClient.js.map +1 -1
- package/lib/module/networking/outboundQueue.js +84 -0
- package/lib/module/networking/outboundQueue.js.map +1 -0
- package/lib/module/networking/xmpp/createTimeoutPromise.xmpp.js +4 -1
- package/lib/module/networking/xmpp/createTimeoutPromise.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js +7 -8
- package/lib/module/networking/xmpp/flushLastViewedToPrivateStore.js.map +1 -1
- package/lib/module/networking/xmpp/getRoomsPaged.xmpp.js +26 -3
- package/lib/module/networking/xmpp/getRoomsPaged.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +26 -8
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js +2 -1
- package/lib/module/networking/xmpp/sendTextMessage.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +294 -35
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/roomStore/Middleware/unreadMidlleware.js +22 -6
- package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +154 -22
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/utils/installPromiseRejectionTracker.js +78 -0
- package/lib/module/utils/installPromiseRejectionTracker.js.map +1 -0
- package/lib/module/utils/resendMessage.js +1 -1
- package/lib/module/utils/resendMessage.js.map +1 -1
- package/lib/typescript/assets/icons.d.ts +8 -4
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- package/lib/typescript/components/ContextMenu/ContextMenuComponents.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts +1 -0
- package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts +1 -0
- package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/SystemMessage.d.ts +0 -7
- package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +4 -2
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
- package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts.map +1 -1
- package/lib/typescript/components/Modals/FilePreviewModal/DocumentViewer.d.ts +29 -0
- package/lib/typescript/components/Modals/FilePreviewModal/DocumentViewer.d.ts.map +1 -0
- package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts +0 -1
- package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
- package/lib/typescript/components/Modals/Modal/Modal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ModalWrapper/ModalWrapper.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/styledModalComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/MediaFilePreview.d.ts.map +1 -1
- package/lib/typescript/components/styled/MessageImage.d.ts.map +1 -1
- package/lib/typescript/components/styled/NewMessageLabel.d.ts +1 -5
- package/lib/typescript/components/styled/NewMessageLabel.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledInputComponents/MediaComponents.d.ts +9 -1
- package/lib/typescript/components/styled/StyledInputComponents/MediaComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledInputComponents/StyledInputComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/UnsupportedType.d.ts +1 -0
- package/lib/typescript/components/styled/UnsupportedType.d.ts.map +1 -1
- package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts +1 -0
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/chatAutoEnterer.d.ts.map +1 -1
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts.map +1 -1
- package/lib/typescript/helpers/insertMessageWithDelimiter.d.ts.map +1 -1
- package/lib/typescript/helpers/keyboardLayout.d.ts +9 -0
- package/lib/typescript/helpers/keyboardLayout.d.ts.map +1 -0
- package/lib/typescript/helpers/mediaDimensions.d.ts +9 -0
- package/lib/typescript/helpers/mediaDimensions.d.ts.map +1 -0
- package/lib/typescript/helpers/normalizeRoomJid.d.ts +2 -0
- package/lib/typescript/helpers/normalizeRoomJid.d.ts.map +1 -0
- package/lib/typescript/hooks/useChatRoomFocus.d.ts +42 -0
- package/lib/typescript/hooks/useChatRoomFocus.d.ts.map +1 -0
- package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
- package/lib/typescript/hooks/usePushNotifications.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomState.d.ts +1 -0
- package/lib/typescript/hooks/useRoomState.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/hooks/useUnreadMessagesCounter.d.ts.map +1 -1
- package/lib/typescript/main.d.ts +1 -0
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/auth.api.d.ts +3 -0
- package/lib/typescript/networking/api-requests/auth.api.d.ts.map +1 -1
- package/lib/typescript/networking/apiClient.d.ts.map +1 -1
- package/lib/typescript/networking/outboundQueue.d.ts +57 -0
- package/lib/typescript/networking/outboundQueue.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/createTimeoutPromise.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts +1 -1
- package/lib/typescript/networking/xmpp/flushLastViewedToPrivateStore.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/getRoomsPaged.xmpp.d.ts +1 -1
- package/lib/typescript/networking/xmpp/getRoomsPaged.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/sendTextMessage.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmppClient.d.ts +33 -4
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +8 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/types/models/media.model.d.ts +1 -0
- package/lib/typescript/types/models/media.model.d.ts.map +1 -1
- package/lib/typescript/types/models/xmpp.model.d.ts +1 -1
- package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +4 -0
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/utils/installPromiseRejectionTracker.d.ts +20 -0
- package/lib/typescript/utils/installPromiseRejectionTracker.d.ts.map +1 -0
- package/lib/typescript/utils/resendMessage.d.ts.map +1 -1
- package/package.json +18 -2
- package/src/assets/icons.tsx +23 -14
- package/src/components/ContextMenu/ContextMenuComponents.tsx +10 -5
- package/src/components/MainComponents/ChatRoom.tsx +81 -66
- package/src/components/MainComponents/ChatWrapper.tsx +99 -21
- package/src/components/MainComponents/MediaMessage.tsx +3 -0
- package/src/components/MainComponents/MessageContainer.tsx +4 -2
- package/src/components/MainComponents/MessageList.tsx +175 -28
- package/src/components/MainComponents/ReduxWrapper.tsx +19 -9
- package/src/components/MainComponents/SystemMessage.tsx +38 -26
- package/src/components/MessageBubble/Message.tsx +91 -62
- package/src/components/MessageBubble/MessageInteractions.tsx +98 -29
- package/src/components/Modals/AttachSheet/AttachSheet.tsx +17 -3
- package/src/components/Modals/FilePreviewModal/DocumentViewer.tsx +93 -0
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +152 -25
- package/src/components/Modals/FilePreviewModal/PdfView.tsx +32 -4
- package/src/components/Modals/Modal/Modal.tsx +4 -1
- package/src/components/Modals/ModalWrapper/ModalWrapper.tsx +70 -58
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +19 -15
- package/src/components/Modals/styledModalComponents.tsx +4 -9
- package/src/components/styled/MediaFilePreview.tsx +46 -26
- package/src/components/styled/MessageImage.tsx +58 -13
- package/src/components/styled/NewMessageLabel.tsx +8 -5
- package/src/components/styled/SendInput.tsx +64 -29
- package/src/components/styled/StyledInputComponents/MediaComponents.tsx +15 -5
- package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +7 -2
- package/src/components/styled/UnsupportedType.tsx +7 -1
- package/src/components/styled/VideoMessage.tsx +59 -11
- package/src/context/MessageNotificationContext.tsx +8 -8
- package/src/context/xmppProvider.tsx +247 -30
- package/src/helpers/chatAutoEnterer.ts +2 -8
- package/src/helpers/historyPreloadScheduler.ts +4 -1
- package/src/helpers/insertMessageWithDelimiter.ts +22 -15
- package/src/helpers/keyboardLayout.ts +18 -0
- package/src/helpers/mediaDimensions.ts +47 -0
- package/src/helpers/normalizeRoomJid.ts +6 -0
- package/src/hooks/useChatRoomFocus.ts +95 -0
- package/src/hooks/useHeapSender.tsx +2 -1
- package/src/hooks/useLogout.tsx +3 -3
- package/src/hooks/usePushNotifications.ts +21 -8
- package/src/hooks/useRoomState.tsx +4 -0
- package/src/hooks/useSendMessage.tsx +258 -13
- package/src/hooks/useUnreadMessagesCounter.ts +13 -16
- package/src/main.ts +1 -0
- package/src/networking/api-requests/auth.api.ts +55 -1
- package/src/networking/apiClient.ts +2 -1
- package/src/networking/outboundQueue.ts +98 -0
- package/src/networking/xmpp/createTimeoutPromise.xmpp.ts +5 -1
- package/src/networking/xmpp/flushLastViewedToPrivateStore.ts +11 -13
- package/src/networking/xmpp/getRoomsPaged.xmpp.ts +27 -3
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +24 -9
- package/src/networking/xmpp/sendTextMessage.xmpp.ts +2 -1
- package/src/networking/xmppClient.ts +317 -43
- package/src/roomStore/Middleware/unreadMidlleware.tsx +23 -5
- package/src/roomStore/roomsSlice.ts +177 -27
- package/src/types/models/media.model.ts +3 -0
- package/src/types/models/xmpp.model.ts +2 -1
- package/src/types/types.ts +15 -0
- package/src/utils/installPromiseRejectionTracker.ts +91 -0
- package/src/utils/resendMessage.ts +2 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import 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 {
|
|
15
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
<
|
|
245
|
+
<View
|
|
161
246
|
style={{
|
|
162
247
|
width: '100%',
|
|
163
|
-
|
|
248
|
+
padding: 20,
|
|
249
|
+
gap: 12,
|
|
250
|
+
backgroundColor: '#FFF8ED',
|
|
251
|
+
borderRadius: 16,
|
|
164
252
|
}}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
326
|
+
flex: 1,
|
|
221
327
|
justifyContent: 'center',
|
|
222
|
-
overflow:
|
|
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
|
|
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 }}>×</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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
: { maxWidth: 640 }
|
|
77
|
-
}
|
|
78
|
-
>
|
|
79
|
-
<CloseButton onPress={handleCloseModal}>
|
|
80
|
-
<Text style={{ fontSize: 24 }}>×</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?.
|
|
288
|
+
{selectedUser && !config?.disableMemberProfileActions && (
|
|
289
289
|
<>
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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:
|
|
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 {
|
|
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
|
-
<
|
|
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>
|