@ethora/chat-component-rn 26.8.4 → 26.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/lib/commonjs/assets/emojiData.js +40 -0
- package/lib/commonjs/assets/emojiData.js.map +1 -0
- package/lib/commonjs/assets/icons.js +1 -1
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +12 -7
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js +7 -9
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +47 -26
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatWrapper.js +58 -21
- package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/commonjs/components/MainComponents/KeyboardInputDock.js +40 -0
- package/lib/commonjs/components/MainComponents/KeyboardInputDock.js.map +1 -0
- package/lib/commonjs/components/MainComponents/MessageContainer.js +4 -12
- package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +110 -35
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +32 -29
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomStack.js +270 -0
- package/lib/commonjs/components/MainComponents/RoomStack.js.map +1 -0
- package/lib/commonjs/components/MainComponents/SystemMessage.js +6 -2
- package/lib/commonjs/components/MainComponents/SystemMessage.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/Avatar.js +5 -1
- package/lib/commonjs/components/MessageBubble/Avatar.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js +17 -21
- package/lib/commonjs/components/MessageBubble/BottomReplyContainer.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js +447 -0
- package/lib/commonjs/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
- package/lib/commonjs/components/MessageBubble/Message.js +200 -132
- package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js +213 -12
- package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageReaction.js +113 -94
- package/lib/commonjs/components/MessageBubble/MessageReaction.js.map +1 -1
- package/lib/commonjs/components/MessageBubble/MessageReply.js +66 -24
- package/lib/commonjs/components/MessageBubble/MessageReply.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +6 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/Modal/Modal.js +24 -0
- package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js +178 -0
- package/lib/commonjs/components/Modals/Modal/SwipeBackLayer.js.map +1 -0
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js +28 -10
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +9 -3
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +5 -4
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
- package/lib/commonjs/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
- package/lib/commonjs/components/Thread/ThreadWrapper.js +265 -152
- package/lib/commonjs/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/commonjs/components/styled/DateLabel.js +6 -3
- package/lib/commonjs/components/styled/DateLabel.js.map +1 -1
- package/lib/commonjs/context/MessageNotificationContext.js +188 -9
- package/lib/commonjs/context/MessageNotificationContext.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +22 -7
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/createRoomFromApi.js +36 -2
- package/lib/commonjs/helpers/createRoomFromApi.js.map +1 -1
- package/lib/commonjs/helpers/emoji.js +51 -0
- package/lib/commonjs/helpers/emoji.js.map +1 -0
- package/lib/commonjs/helpers/haptics.js +29 -0
- package/lib/commonjs/helpers/haptics.js.map +1 -0
- package/lib/commonjs/helpers/historyPreloadScheduler.js +32 -66
- package/lib/commonjs/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js +21 -12
- package/lib/commonjs/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/commonjs/helpers/keyboardLayout.js +23 -1
- package/lib/commonjs/helpers/keyboardLayout.js.map +1 -1
- package/lib/commonjs/helpers/mamReactions.js +57 -0
- package/lib/commonjs/helpers/mamReactions.js.map +1 -0
- package/lib/commonjs/helpers/parseMessageReference.js +42 -0
- package/lib/commonjs/helpers/parseMessageReference.js.map +1 -0
- package/lib/commonjs/helpers/reactionsConfig.js +17 -0
- package/lib/commonjs/helpers/reactionsConfig.js.map +1 -0
- package/lib/commonjs/helpers/updateMessagesTillLast.js +17 -2
- package/lib/commonjs/helpers/updateMessagesTillLast.js.map +1 -1
- package/lib/commonjs/hooks/useHeapSender.js +3 -1
- package/lib/commonjs/hooks/useHeapSender.js.map +1 -1
- package/lib/commonjs/hooks/useMessageHeapState.js +3 -2
- package/lib/commonjs/hooks/useMessageHeapState.js.map +1 -1
- package/lib/commonjs/hooks/useRoomInitialization.js +16 -7
- package/lib/commonjs/hooks/useRoomInitialization.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +14 -8
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js +1 -1
- package/lib/commonjs/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/commonjs/networking/stanzaHandlers.js +106 -50
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js +29 -74
- package/lib/commonjs/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js +4 -0
- package/lib/commonjs/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmpp/mamRouter.js +186 -0
- package/lib/commonjs/networking/xmpp/mamRouter.js.map +1 -0
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js +41 -4
- package/lib/commonjs/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +98 -23
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js +29 -34
- package/lib/commonjs/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/perfMiddleware.js +51 -0
- package/lib/commonjs/roomStore/Middleware/perfMiddleware.js.map +1 -0
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js +66 -43
- package/lib/commonjs/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js +88 -68
- package/lib/commonjs/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/commonjs/roomStore/index.js +18 -14
- package/lib/commonjs/roomStore/index.js.map +1 -1
- package/lib/commonjs/roomStore/persistBackend.js +96 -0
- package/lib/commonjs/roomStore/persistBackend.js.map +1 -0
- package/lib/commonjs/roomStore/persistence.js +245 -50
- package/lib/commonjs/roomStore/persistence.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +282 -136
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/commonjs/theme/theme.js +3 -0
- package/lib/commonjs/theme/theme.js.map +1 -1
- package/lib/commonjs/utils/devLogger.js +14 -0
- package/lib/commonjs/utils/devLogger.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/module/assets/emojiData.js +36 -0
- package/lib/module/assets/emojiData.js.map +1 -0
- package/lib/module/assets/icons.js +1 -1
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +12 -7
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/MainComponents/ChatHeader.js +8 -10
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +49 -28
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/ChatWrapper.js +60 -23
- package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
- package/lib/module/components/MainComponents/KeyboardInputDock.js +33 -0
- package/lib/module/components/MainComponents/KeyboardInputDock.js.map +1 -0
- package/lib/module/components/MainComponents/MessageContainer.js +7 -14
- package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +110 -35
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +32 -29
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/MainComponents/RoomStack.js +266 -0
- package/lib/module/components/MainComponents/RoomStack.js.map +1 -0
- package/lib/module/components/MainComponents/SystemMessage.js +6 -2
- package/lib/module/components/MainComponents/SystemMessage.js.map +1 -1
- package/lib/module/components/MessageBubble/Avatar.js +5 -1
- package/lib/module/components/MessageBubble/Avatar.js.map +1 -1
- package/lib/module/components/MessageBubble/BottomReplyContainer.js +18 -22
- package/lib/module/components/MessageBubble/BottomReplyContainer.js.map +1 -1
- package/lib/module/components/MessageBubble/EmojiPickerSheet.js +438 -0
- package/lib/module/components/MessageBubble/EmojiPickerSheet.js.map +1 -0
- package/lib/module/components/MessageBubble/Message.js +203 -134
- package/lib/module/components/MessageBubble/Message.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageInteractions.js +215 -14
- package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageReaction.js +115 -94
- package/lib/module/components/MessageBubble/MessageReaction.js.map +1 -1
- package/lib/module/components/MessageBubble/MessageReply.js +65 -24
- package/lib/module/components/MessageBubble/MessageReply.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +6 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/Modal/Modal.js +25 -1
- package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/module/components/Modals/Modal/SwipeBackLayer.js +172 -0
- package/lib/module/components/Modals/Modal/SwipeBackLayer.js.map +1 -0
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js +29 -11
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +10 -4
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +5 -4
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js +8 -9
- package/lib/module/components/RoomComponents/styled/LastMessageEmoji.js.map +1 -1
- package/lib/module/components/Thread/ThreadWrapper.js +264 -152
- package/lib/module/components/Thread/ThreadWrapper.js.map +1 -1
- package/lib/module/components/styled/DateLabel.js +6 -3
- package/lib/module/components/styled/DateLabel.js.map +1 -1
- package/lib/module/context/MessageNotificationContext.js +190 -11
- package/lib/module/context/MessageNotificationContext.js.map +1 -1
- package/lib/module/context/xmppProvider.js +22 -7
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/createRoomFromApi.js +36 -2
- package/lib/module/helpers/createRoomFromApi.js.map +1 -1
- package/lib/module/helpers/emoji.js +44 -0
- package/lib/module/helpers/emoji.js.map +1 -0
- package/lib/module/helpers/haptics.js +24 -0
- package/lib/module/helpers/haptics.js.map +1 -0
- package/lib/module/helpers/historyPreloadScheduler.js +32 -66
- package/lib/module/helpers/historyPreloadScheduler.js.map +1 -1
- package/lib/module/helpers/insertMessageWithDelimiter.js +21 -12
- package/lib/module/helpers/insertMessageWithDelimiter.js.map +1 -1
- package/lib/module/helpers/keyboardLayout.js +20 -0
- package/lib/module/helpers/keyboardLayout.js.map +1 -1
- package/lib/module/helpers/mamReactions.js +51 -0
- package/lib/module/helpers/mamReactions.js.map +1 -0
- package/lib/module/helpers/parseMessageReference.js +37 -0
- package/lib/module/helpers/parseMessageReference.js.map +1 -0
- package/lib/module/helpers/reactionsConfig.js +10 -0
- package/lib/module/helpers/reactionsConfig.js.map +1 -0
- package/lib/module/helpers/updateMessagesTillLast.js +17 -2
- package/lib/module/helpers/updateMessagesTillLast.js.map +1 -1
- package/lib/module/hooks/useHeapSender.js +3 -1
- package/lib/module/hooks/useHeapSender.js.map +1 -1
- package/lib/module/hooks/useMessageHeapState.js +3 -2
- package/lib/module/hooks/useMessageHeapState.js.map +1 -1
- package/lib/module/hooks/useRoomInitialization.js +17 -8
- package/lib/module/hooks/useRoomInitialization.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +14 -8
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js +1 -1
- package/lib/module/hooks/useUnreadMessagesCounter.js.map +1 -1
- package/lib/module/networking/stanzaHandlers.js +107 -51
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmpp/getHistory.xmpp.js +29 -74
- package/lib/module/networking/xmpp/getHistory.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js +4 -0
- package/lib/module/networking/xmpp/handleStanzas.xmpp.js.map +1 -1
- package/lib/module/networking/xmpp/mamRouter.js +175 -0
- package/lib/module/networking/xmpp/mamRouter.js.map +1 -0
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js +38 -2
- package/lib/module/networking/xmpp/presenceInRoom.xmpp.js.map +1 -1
- package/lib/module/networking/xmppClient.js +99 -24
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/roomStore/Middleware/newMessageMidlleware.js +29 -34
- package/lib/module/roomStore/Middleware/newMessageMidlleware.js.map +1 -1
- package/lib/module/roomStore/Middleware/perfMiddleware.js +45 -0
- package/lib/module/roomStore/Middleware/perfMiddleware.js.map +1 -0
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js +66 -43
- package/lib/module/roomStore/Middleware/reactionsMiddleware.js.map +1 -1
- package/lib/module/roomStore/Middleware/unreadMidlleware.js +89 -69
- package/lib/module/roomStore/Middleware/unreadMidlleware.js.map +1 -1
- package/lib/module/roomStore/index.js +19 -15
- package/lib/module/roomStore/index.js.map +1 -1
- package/lib/module/roomStore/persistBackend.js +89 -0
- package/lib/module/roomStore/persistBackend.js.map +1 -0
- package/lib/module/roomStore/persistence.js +245 -48
- package/lib/module/roomStore/persistence.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +275 -134
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/theme/theme.js +3 -0
- package/lib/module/theme/theme.js.map +1 -1
- package/lib/module/utils/devLogger.js +13 -0
- package/lib/module/utils/devLogger.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/typescript/assets/emojiData.d.ts +8 -0
- package/lib/typescript/assets/emojiData.d.ts.map +1 -0
- package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatHeader.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/KeyboardInputDock.d.ts +16 -0
- package/lib/typescript/components/MainComponents/KeyboardInputDock.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/MessageContainer.d.ts +2 -2
- 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/RoomList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/RoomStack.d.ts +42 -0
- package/lib/typescript/components/MainComponents/RoomStack.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/SystemMessage.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/Avatar.d.ts +2 -0
- package/lib/typescript/components/MessageBubble/Avatar.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/BottomReplyContainer.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts +11 -0
- package/lib/typescript/components/MessageBubble/EmojiPickerSheet.d.ts.map +1 -0
- package/lib/typescript/components/MessageBubble/Message.d.ts +2 -2
- package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts +2 -0
- package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageReaction.d.ts +1 -0
- package/lib/typescript/components/MessageBubble/MessageReaction.d.ts.map +1 -1
- package/lib/typescript/components/MessageBubble/MessageReply.d.ts +7 -7
- package/lib/typescript/components/MessageBubble/MessageReply.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/Modal/Modal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts +16 -0
- package/lib/typescript/components/Modals/Modal/SwipeBackLayer.d.ts.map +1 -0
- package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts +2 -2
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts +3 -6
- package/lib/typescript/components/RoomComponents/styled/LastMessageEmoji.d.ts.map +1 -1
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts +7 -1
- package/lib/typescript/components/Thread/ThreadWrapper.d.ts.map +1 -1
- package/lib/typescript/components/styled/DateLabel.d.ts +1 -0
- package/lib/typescript/components/styled/DateLabel.d.ts.map +1 -1
- package/lib/typescript/context/MessageNotificationContext.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/createRoomFromApi.d.ts.map +1 -1
- package/lib/typescript/helpers/emoji.d.ts +6 -0
- package/lib/typescript/helpers/emoji.d.ts.map +1 -0
- package/lib/typescript/helpers/haptics.d.ts +3 -0
- package/lib/typescript/helpers/haptics.d.ts.map +1 -0
- package/lib/typescript/helpers/historyPreloadScheduler.d.ts +1 -0
- 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 +6 -0
- package/lib/typescript/helpers/keyboardLayout.d.ts.map +1 -1
- package/lib/typescript/helpers/mamReactions.d.ts +13 -0
- package/lib/typescript/helpers/mamReactions.d.ts.map +1 -0
- package/lib/typescript/helpers/parseMessageReference.d.ts +16 -0
- package/lib/typescript/helpers/parseMessageReference.d.ts.map +1 -0
- package/lib/typescript/helpers/reactionsConfig.d.ts +5 -0
- package/lib/typescript/helpers/reactionsConfig.d.ts.map +1 -0
- package/lib/typescript/helpers/updateMessagesTillLast.d.ts.map +1 -1
- package/lib/typescript/hooks/useHeapSender.d.ts.map +1 -1
- package/lib/typescript/hooks/useMessageHeapState.d.ts.map +1 -1
- package/lib/typescript/hooks/useRoomInitialization.d.ts +2 -2
- package/lib/typescript/hooks/useRoomInitialization.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts +4 -2
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts +3 -1
- package/lib/typescript/networking/xmpp/getHistory.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/handleStanzas.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmpp/mamRouter.d.ts +23 -0
- package/lib/typescript/networking/xmpp/mamRouter.d.ts.map +1 -0
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts +1 -0
- package/lib/typescript/networking/xmpp/presenceInRoom.xmpp.d.ts.map +1 -1
- package/lib/typescript/networking/xmppClient.d.ts +22 -1
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/newMessageMidlleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts +4 -0
- package/lib/typescript/roomStore/Middleware/perfMiddleware.d.ts.map +1 -0
- package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts +9 -0
- package/lib/typescript/roomStore/Middleware/reactionsMiddleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/Middleware/unreadMidlleware.d.ts.map +1 -1
- package/lib/typescript/roomStore/index.d.ts.map +1 -1
- package/lib/typescript/roomStore/persistBackend.d.ts +11 -0
- package/lib/typescript/roomStore/persistBackend.d.ts.map +1 -0
- package/lib/typescript/roomStore/persistence.d.ts +5 -6
- package/lib/typescript/roomStore/persistence.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +41 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/theme/theme.d.ts +4 -1
- package/lib/typescript/theme/theme.d.ts.map +1 -1
- package/lib/typescript/types/models/message.model.d.ts +4 -0
- package/lib/typescript/types/models/message.model.d.ts.map +1 -1
- package/lib/typescript/types/models/room.model.d.ts +16 -0
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/models/xmpp.model.d.ts +6 -1
- package/lib/typescript/types/models/xmpp.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +15 -3
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/utils/devLogger.d.ts +8 -0
- package/lib/typescript/utils/devLogger.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/package.json +10 -1
- package/src/assets/emojiData.ts +2146 -0
- package/src/assets/icons.tsx +5 -5
- package/src/components/Header/HeaderRoomList.tsx +7 -5
- package/src/components/MainComponents/ChatHeader.tsx +16 -7
- package/src/components/MainComponents/ChatRoom.tsx +64 -32
- package/src/components/MainComponents/ChatWrapper.tsx +73 -21
- package/src/components/MainComponents/KeyboardInputDock.tsx +47 -0
- package/src/components/MainComponents/MessageContainer.tsx +7 -15
- package/src/components/MainComponents/MessageList.tsx +96 -43
- package/src/components/MainComponents/RoomList.tsx +28 -29
- package/src/components/MainComponents/RoomStack.tsx +309 -0
- package/src/components/MainComponents/SystemMessage.tsx +6 -2
- package/src/components/MessageBubble/Avatar.tsx +7 -1
- package/src/components/MessageBubble/BottomReplyContainer.tsx +19 -21
- package/src/components/MessageBubble/EmojiPickerSheet.tsx +468 -0
- package/src/components/MessageBubble/Message.tsx +146 -87
- package/src/components/MessageBubble/MessageInteractions.tsx +213 -12
- package/src/components/MessageBubble/MessageReaction.tsx +120 -96
- package/src/components/MessageBubble/MessageReply.tsx +65 -32
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +4 -0
- package/src/components/Modals/Modal/Modal.tsx +32 -1
- package/src/components/Modals/Modal/SwipeBackLayer.tsx +221 -0
- package/src/components/Modals/ProfileHeader/ProfileHeader.tsx +29 -8
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +6 -3
- package/src/components/RoomComponents/ChatRoomItem.tsx +11 -4
- package/src/components/RoomComponents/styled/LastMessageEmoji.tsx +7 -8
- package/src/components/Thread/ThreadWrapper.tsx +274 -198
- package/src/components/styled/DateLabel.tsx +7 -3
- package/src/context/MessageNotificationContext.tsx +205 -7
- package/src/context/xmppProvider.tsx +29 -9
- package/src/helpers/createRoomFromApi.tsx +37 -1
- package/src/helpers/emoji.ts +39 -0
- package/src/helpers/haptics.ts +19 -0
- package/src/helpers/historyPreloadScheduler.ts +37 -69
- package/src/helpers/insertMessageWithDelimiter.ts +23 -16
- package/src/helpers/keyboardLayout.ts +26 -0
- package/src/helpers/mamReactions.ts +59 -0
- package/src/helpers/parseMessageReference.ts +38 -0
- package/src/helpers/reactionsConfig.ts +13 -0
- package/src/helpers/updateMessagesTillLast.tsx +14 -2
- package/src/hooks/useHeapSender.tsx +3 -2
- package/src/hooks/useMessageHeapState.tsx +6 -2
- package/src/hooks/useRoomInitialization.tsx +32 -15
- package/src/hooks/useSendMessage.tsx +18 -11
- package/src/hooks/useUnreadMessagesCounter.ts +1 -1
- package/src/networking/stanzaHandlers.ts +116 -60
- package/src/networking/xmpp/getHistory.xmpp.ts +44 -106
- package/src/networking/xmpp/handleStanzas.xmpp.ts +2 -0
- package/src/networking/xmpp/mamRouter.ts +176 -0
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +46 -3
- package/src/networking/xmppClient.ts +105 -20
- package/src/roomStore/Middleware/newMessageMidlleware.tsx +35 -38
- package/src/roomStore/Middleware/perfMiddleware.ts +50 -0
- package/src/roomStore/Middleware/reactionsMiddleware.tsx +53 -52
- package/src/roomStore/Middleware/unreadMidlleware.tsx +92 -80
- package/src/roomStore/index.ts +28 -27
- package/src/roomStore/persistBackend.ts +96 -0
- package/src/roomStore/persistence.ts +280 -73
- package/src/roomStore/roomsSlice.ts +304 -155
- package/src/theme/theme.ts +10 -1
- package/src/types/models/message.model.ts +4 -0
- package/src/types/models/room.model.ts +17 -0
- package/src/types/models/xmpp.model.ts +4 -2
- package/src/types/types.ts +15 -3
- package/src/utils/devLogger.ts +16 -0
- package/src/version.ts +1 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { IMessage } from '../types/types';
|
|
2
|
-
import { isDateAfter, isDateBefore } from './dateComparison';
|
|
3
2
|
import { msgSortableMs } from './msgSortableMs';
|
|
4
3
|
|
|
5
4
|
// Robustly resolve a caller-supplied read marker to epoch milliseconds.
|
|
@@ -90,17 +89,29 @@ export function insertMessageWithDelimiter(
|
|
|
90
89
|
return;
|
|
91
90
|
}
|
|
92
91
|
|
|
93
|
-
const newMessageDate = message.date;
|
|
94
92
|
const lastMessage = roomMessages[roomMessages.length - 1];
|
|
95
|
-
|
|
93
|
+
// Ordered by the id-encoded server timestamp (msgSortableMs), the same
|
|
94
|
+
// key the list and the unread logic use. The old `date` string compare
|
|
95
|
+
// had a hole: a message neither strictly after the last one nor
|
|
96
|
+
// strictly before the first (same second, or an unparseable date) fell
|
|
97
|
+
// through every branch and was silently DROPPED.
|
|
98
|
+
const newMs = msgSortableMs(message);
|
|
99
|
+
const lastMs = lastMessage ? msgSortableMs(lastMessage) : 0;
|
|
96
100
|
|
|
97
|
-
if (
|
|
101
|
+
if (!lastMessage || !newMs || newMs >= lastMs) {
|
|
98
102
|
const index = roomMessages.findIndex(
|
|
99
103
|
(msg) => msg.id === message.xmppId || msg.id === message.id
|
|
100
104
|
);
|
|
101
105
|
|
|
102
106
|
if (index !== -1) {
|
|
103
|
-
|
|
107
|
+
// Keep an open thread open when its parent is replaced by the echo.
|
|
108
|
+
const keepThread = (roomMessages[index] as any)?.activeMessage;
|
|
109
|
+
roomMessages[index] = {
|
|
110
|
+
...message,
|
|
111
|
+
id: message.id,
|
|
112
|
+
pending: false,
|
|
113
|
+
...(keepThread ? { activeMessage: true } : {}),
|
|
114
|
+
};
|
|
104
115
|
} else {
|
|
105
116
|
roomMessages.push(message);
|
|
106
117
|
}
|
|
@@ -153,18 +164,14 @@ export function insertMessageWithDelimiter(
|
|
|
153
164
|
});
|
|
154
165
|
}
|
|
155
166
|
}
|
|
156
|
-
} else if (
|
|
157
|
-
isDateBefore(newMessageDate.toString(), firstMessage?.date?.toString() ?? '')
|
|
158
|
-
) {
|
|
159
|
-
roomMessages.unshift(message);
|
|
160
167
|
} else {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
+
// Before the first message strictly newer than it; equal keys keep
|
|
169
|
+
// arrival order.
|
|
170
|
+
const at = roomMessages.findIndex((msg) => msgSortableMs(msg) > newMs);
|
|
171
|
+
if (at === -1) {
|
|
172
|
+
roomMessages.push(message);
|
|
173
|
+
} else {
|
|
174
|
+
roomMessages.splice(at, 0, message);
|
|
168
175
|
}
|
|
169
176
|
}
|
|
170
177
|
}
|
|
@@ -6,6 +6,9 @@ type KeyboardLayoutArgs = {
|
|
|
6
6
|
};
|
|
7
7
|
|
|
8
8
|
export const ANDROID_INPUT_DOCK_GAP = 12;
|
|
9
|
+
// Bottom padding the dock keeps while the iOS keyboard is open, so the
|
|
10
|
+
// composer is glued to the keyboard without touching its edge.
|
|
11
|
+
export const IOS_KEYBOARD_DOCK_GAP = 4;
|
|
9
12
|
|
|
10
13
|
export const getKeyboardVerticalOffset = ({
|
|
11
14
|
platform,
|
|
@@ -14,6 +17,29 @@ export const getKeyboardVerticalOffset = ({
|
|
|
14
17
|
}: KeyboardLayoutArgs): number =>
|
|
15
18
|
configuredOffset + (platform === 'ios' ? bottomInset : 0);
|
|
16
19
|
|
|
20
|
+
// Offset for the KeyboardAvoidingView strategy. Unlike KeyboardStickyView
|
|
21
|
+
// (where a positive `opened` offset pushes the dock DOWN into the keyboard),
|
|
22
|
+
// a positive value here ADDS bottom padding above the keyboard — so the
|
|
23
|
+
// safe-area inset must not be added: the avoiding view already ends exactly
|
|
24
|
+
// at the keyboard's top edge.
|
|
25
|
+
export const getKeyboardAvoidingOffset = ({
|
|
26
|
+
configuredOffset = 0,
|
|
27
|
+
}: Pick<KeyboardLayoutArgs, 'configuredOffset'>): number => configuredOffset;
|
|
28
|
+
|
|
29
|
+
// Dock bottom padding while the keyboard is open (KeyboardAvoidingView
|
|
30
|
+
// strategy). On iOS the safe-area padding collapses to a small gap; Android
|
|
31
|
+
// keeps its fixed gap.
|
|
32
|
+
export const getInputDockKeyboardPadding = ({
|
|
33
|
+
platform,
|
|
34
|
+
inputDockPaddingBottom,
|
|
35
|
+
}: {
|
|
36
|
+
platform: string;
|
|
37
|
+
inputDockPaddingBottom: number;
|
|
38
|
+
}): number =>
|
|
39
|
+
platform === 'ios'
|
|
40
|
+
? Math.min(inputDockPaddingBottom, IOS_KEYBOARD_DOCK_GAP)
|
|
41
|
+
: inputDockPaddingBottom;
|
|
42
|
+
|
|
17
43
|
type InputDockPaddingArgs = Omit<KeyboardLayoutArgs, 'configuredOffset'> & {
|
|
18
44
|
// Explicit `inputDockPaddingBottom` config value, verbatim on both
|
|
19
45
|
// platforms when provided (0 allowed). Takes priority over every other
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { IMessage } from '../types/models/message.model';
|
|
2
|
+
import { applyReactionToMessage, compareStanzaIds } from '../roomStore/roomsSlice';
|
|
3
|
+
|
|
4
|
+
export interface ExtractedReaction {
|
|
5
|
+
messageId: string;
|
|
6
|
+
from: string;
|
|
7
|
+
emoji: string[];
|
|
8
|
+
data: Record<string, string>;
|
|
9
|
+
roomJID: string;
|
|
10
|
+
/** Server stanza id (microsecond timestamp) — orders reactions. */
|
|
11
|
+
ts?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const extractReaction = (
|
|
15
|
+
msg: any,
|
|
16
|
+
fallbackRoomJID?: string,
|
|
17
|
+
archiveId?: string
|
|
18
|
+
): ExtractedReaction | null => {
|
|
19
|
+
const reactionsEl = msg?.getChild?.('reactions');
|
|
20
|
+
if (!reactionsEl) {return null;}
|
|
21
|
+
const messageId = reactionsEl.attrs?.id;
|
|
22
|
+
const from = String(reactionsEl.attrs?.from || '');
|
|
23
|
+
if (!messageId || !from.split('@')[0]) {return null;}
|
|
24
|
+
const emoji: string[] = (reactionsEl.getChildren?.('reaction') || [])
|
|
25
|
+
.map((reaction: any) => (reaction.text ? reaction.text() : ''))
|
|
26
|
+
.filter(Boolean);
|
|
27
|
+
const data = (msg.getChild?.('data')?.attrs || {}) as Record<string, string>;
|
|
28
|
+
const stanzaId = msg.getChild?.('stanza-id');
|
|
29
|
+
const roomJID = String(
|
|
30
|
+
stanzaId?.attrs?.by || fallbackRoomJID || msg.attrs?.from || ''
|
|
31
|
+
).split('/')[0];
|
|
32
|
+
const rawTs = String(archiveId || stanzaId?.attrs?.id || '');
|
|
33
|
+
const ts = /^\d+$/.test(rawTs) ? rawTs : undefined;
|
|
34
|
+
return { messageId, from, emoji, data, roomJID, ...(ts ? { ts } : {}) };
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const applyMamReactions = (
|
|
38
|
+
messages: IMessage[],
|
|
39
|
+
reactions: ExtractedReaction[]
|
|
40
|
+
): ExtractedReaction[] => {
|
|
41
|
+
const byId = new Map<string, IMessage>();
|
|
42
|
+
for (const message of messages) {
|
|
43
|
+
if (message?.id) {byId.set(String(message.id), message);}
|
|
44
|
+
}
|
|
45
|
+
const deferred: ExtractedReaction[] = [];
|
|
46
|
+
// Oldest first, so the newest state of each reactor wins.
|
|
47
|
+
const ordered = reactions
|
|
48
|
+
.slice()
|
|
49
|
+
.sort((a, b) => (a.ts && b.ts ? compareStanzaIds(a.ts, b.ts) : 0));
|
|
50
|
+
for (const reaction of ordered) {
|
|
51
|
+
const target = byId.get(String(reaction.messageId));
|
|
52
|
+
if (target) {
|
|
53
|
+
applyReactionToMessage(target, reaction.from, reaction.emoji, reaction.data, reaction.ts);
|
|
54
|
+
} else {
|
|
55
|
+
deferred.push(reaction);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return deferred;
|
|
59
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** The parent a reply points at, read from its `mainMessage` JSON. */
|
|
2
|
+
export interface MessageReference {
|
|
3
|
+
id: string;
|
|
4
|
+
text: string;
|
|
5
|
+
roomJid: string;
|
|
6
|
+
userName?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const cache = new WeakMap<object, MessageReference | null>();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Safe read of `message.mainMessage` (a JSON string on the wire). Null for
|
|
13
|
+
* a missing or malformed value — a bad payload must not crash a bubble.
|
|
14
|
+
* Cached per message object.
|
|
15
|
+
*/
|
|
16
|
+
export const parseMessageReference = (message: {
|
|
17
|
+
mainMessage?: string;
|
|
18
|
+
} | null | undefined): MessageReference | null => {
|
|
19
|
+
if (!message?.mainMessage) {return null;}
|
|
20
|
+
const cached = cache.get(message);
|
|
21
|
+
if (cached !== undefined) {return cached;}
|
|
22
|
+
let ref: MessageReference | null = null;
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(message.mainMessage);
|
|
25
|
+
if (parsed && parsed.id != null) {
|
|
26
|
+
ref = {
|
|
27
|
+
id: String(parsed.id),
|
|
28
|
+
text: typeof parsed.text === 'string' ? parsed.text : '',
|
|
29
|
+
roomJid: typeof parsed.roomJid === 'string' ? parsed.roomJid : '',
|
|
30
|
+
userName: typeof parsed.userName === 'string' ? parsed.userName : undefined,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
} catch {
|
|
34
|
+
ref = null;
|
|
35
|
+
}
|
|
36
|
+
cache.set(message, ref);
|
|
37
|
+
return ref;
|
|
38
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IConfig } from '../types/types';
|
|
2
|
+
import { DEFAULT_QUICK_REACTIONS } from './emoji';
|
|
3
|
+
|
|
4
|
+
export const reactionsEnabled = (config?: IConfig | null): boolean =>
|
|
5
|
+
!config?.disableReactions && config?.reactions?.enabled !== false;
|
|
6
|
+
|
|
7
|
+
export const quickReactionIds = (config?: IConfig | null): string[] => {
|
|
8
|
+
const ids = config?.reactions?.quickReactions;
|
|
9
|
+
return Array.isArray(ids) && ids.length ? ids.slice(0, 8) : DEFAULT_QUICK_REACTIONS;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const reactionPickerEnabled = (config?: IConfig | null): boolean =>
|
|
13
|
+
reactionsEnabled(config) && config?.reactions?.picker !== false;
|
|
@@ -31,10 +31,20 @@ export const updateMessagesTillLast = async (
|
|
|
31
31
|
processedIndex + batchSize
|
|
32
32
|
);
|
|
33
33
|
|
|
34
|
+
|
|
34
35
|
const lastTimestampsByJid = currentBatch.reduce(
|
|
35
36
|
(acc: Record<string, number>, current: string) => {
|
|
36
37
|
const room = (store.getState() as any).rooms?.rooms?.[current];
|
|
37
|
-
|
|
38
|
+
const cached: IMessage[] = Array.isArray(room?.messages)
|
|
39
|
+
? room.messages
|
|
40
|
+
: [];
|
|
41
|
+
let newest = 0;
|
|
42
|
+
for (const m of cached) {
|
|
43
|
+
if (!m || m.pending || m.id === 'delimiter-new') {continue;}
|
|
44
|
+
const id = Number(m.id);
|
|
45
|
+
if (Number.isFinite(id) && id > newest) {newest = id;}
|
|
46
|
+
}
|
|
47
|
+
acc[current] = newest;
|
|
38
48
|
return acc;
|
|
39
49
|
},
|
|
40
50
|
{} as Record<string, number>
|
|
@@ -59,7 +69,9 @@ export const updateMessagesTillLast = async (
|
|
|
59
69
|
const fetchedMessages = await client.getHistoryStanza(
|
|
60
70
|
jid,
|
|
61
71
|
messagesPerFetch,
|
|
62
|
-
Number(lastMessageId)
|
|
72
|
+
Number(lastMessageId),
|
|
73
|
+
undefined,
|
|
74
|
+
{ coalesceRoom: true, source: 'background', selfApplied: true }
|
|
63
75
|
);
|
|
64
76
|
|
|
65
77
|
if (!fetchedMessages.length) {break;}
|
|
@@ -50,8 +50,9 @@ export const useHeapSender = (client: XmppClient | null) => {
|
|
|
50
50
|
msg.user.walletAddress || '',
|
|
51
51
|
msg.body,
|
|
52
52
|
'',
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
// Wire values are strings: '"false"' is truthy.
|
|
54
|
+
String(msg.isReply) === 'true',
|
|
55
|
+
String(msg.showInChannel) === 'true',
|
|
55
56
|
msg.mainMessage,
|
|
56
57
|
msg.id
|
|
57
58
|
);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
1
2
|
import { useSelector } from 'react-redux';
|
|
2
3
|
import { RootState } from '../roomStore';
|
|
3
4
|
|
|
@@ -8,8 +9,11 @@ export const useMessageHeapState = () => {
|
|
|
8
9
|
const failedMessages = useSelector(
|
|
9
10
|
(state: RootState) => state.roomHeapSlice?.failedMessages
|
|
10
11
|
);
|
|
11
|
-
const idSet = new Set(queue?.map((m) => m.id) ?? []);
|
|
12
|
-
const failedIdSet =
|
|
12
|
+
const idSet = useMemo(() => new Set(queue?.map((m) => m.id) ?? []), [queue]);
|
|
13
|
+
const failedIdSet = useMemo(
|
|
14
|
+
() => new Set(Object.keys(failedMessages || {})),
|
|
15
|
+
[failedMessages]
|
|
16
|
+
);
|
|
13
17
|
|
|
14
18
|
return { queue, idSet, failedMessages, failedIdSet };
|
|
15
19
|
};
|
|
@@ -2,8 +2,9 @@ import { useEffect } from 'react';
|
|
|
2
2
|
import { setIsLoading } from '../roomStore/roomsSlice';
|
|
3
3
|
import { useXmppClient } from '../context/xmppProvider';
|
|
4
4
|
import { IConfig, IMessage, IRoom } from '../types/types';
|
|
5
|
-
import { useDispatch } from 'react-redux';
|
|
5
|
+
import { useDispatch, useSelector, useStore } from 'react-redux';
|
|
6
6
|
import useGetNewArchRoom from './useGetNewArchRoom';
|
|
7
|
+
import type { RootState } from '../roomStore';
|
|
7
8
|
|
|
8
9
|
const countUndefinedText = (arr: IMessage[]) =>
|
|
9
10
|
(Array.isArray(arr) ? arr : []).filter(
|
|
@@ -21,14 +22,32 @@ const hasLoadedRoomHistory = (room?: IRoom): boolean => {
|
|
|
21
22
|
);
|
|
22
23
|
};
|
|
23
24
|
|
|
25
|
+
const defaultRoomJids = (config: IConfig): string[] =>
|
|
26
|
+
(config?.defaultRooms || []).map((room: any) =>
|
|
27
|
+
typeof room === 'string' ? room : room?.jid
|
|
28
|
+
);
|
|
29
|
+
|
|
24
30
|
export const useRoomInitialization = (
|
|
25
31
|
activeRoomJID: string,
|
|
26
|
-
|
|
27
|
-
config: IConfig,
|
|
28
|
-
messageLength: number
|
|
32
|
+
config: IConfig
|
|
29
33
|
) => {
|
|
30
34
|
const { client } = useXmppClient();
|
|
31
35
|
const dispatch = useDispatch();
|
|
36
|
+
const reduxStore = useStore<RootState>();
|
|
37
|
+
|
|
38
|
+
const hasRooms = useSelector(
|
|
39
|
+
(state: RootState) => Object.keys(state.rooms.rooms || {}).length > 0
|
|
40
|
+
);
|
|
41
|
+
const activeRoomExists = useSelector(
|
|
42
|
+
(state: RootState) => !!activeRoomJID && !!state.rooms.rooms?.[activeRoomJID]
|
|
43
|
+
);
|
|
44
|
+
const activeHistoryLoaded = useSelector((state: RootState) =>
|
|
45
|
+
hasLoadedRoomHistory(state.rooms.rooms?.[activeRoomJID])
|
|
46
|
+
);
|
|
47
|
+
const defaultRoomsMissing = useSelector((state: RootState) => {
|
|
48
|
+
const jids = defaultRoomJids(config);
|
|
49
|
+
return jids.length > 0 && jids.some((jid) => !state.rooms.rooms?.[jid]);
|
|
50
|
+
});
|
|
32
51
|
|
|
33
52
|
const syncRooms = useGetNewArchRoom();
|
|
34
53
|
|
|
@@ -59,9 +78,8 @@ export const useRoomInitialization = (
|
|
|
59
78
|
}, [client, activeRoomJID]);
|
|
60
79
|
|
|
61
80
|
useEffect(() => {
|
|
62
|
-
const
|
|
63
|
-
const shouldLoadActiveHistory =
|
|
64
|
-
!!activeRoomJID && !hasLoadedRoomHistory(activeRoom);
|
|
81
|
+
const roomsList = reduxStore.getState().rooms.rooms || {};
|
|
82
|
+
const shouldLoadActiveHistory = !!activeRoomJID && !activeHistoryLoaded;
|
|
65
83
|
|
|
66
84
|
const getDefaultHistory = async () => {
|
|
67
85
|
if (!client || !activeRoomJID) {return;}
|
|
@@ -129,7 +147,7 @@ export const useRoomInitialization = (
|
|
|
129
147
|
// real, non-pending message in the room counts as "loaded").
|
|
130
148
|
dispatch(setIsLoading({ loading: true, chatJID: activeRoomJID }));
|
|
131
149
|
getDefaultHistory();
|
|
132
|
-
} else {
|
|
150
|
+
} else if (roomsList?.[activeRoomJID]?.isLoading) {
|
|
133
151
|
dispatch(setIsLoading({ loading: false, chatJID: activeRoomJID }));
|
|
134
152
|
}
|
|
135
153
|
} else if (!roomsList?.[activeRoomJID]) {
|
|
@@ -137,10 +155,7 @@ export const useRoomInitialization = (
|
|
|
137
155
|
}
|
|
138
156
|
|
|
139
157
|
if (client && config?.defaultRooms) {
|
|
140
|
-
|
|
141
|
-
(room) => roomsList[typeof room === 'string' ? room : room.jid] !== undefined
|
|
142
|
-
);
|
|
143
|
-
if (roomsList && !allExist) {
|
|
158
|
+
if (defaultRoomsMissing) {
|
|
144
159
|
config?.defaultRooms.map(async (room) => {
|
|
145
160
|
client.presenceInRoomStanza(typeof room === 'string' ? room : room.jid);
|
|
146
161
|
});
|
|
@@ -151,10 +166,12 @@ export const useRoomInitialization = (
|
|
|
151
166
|
}
|
|
152
167
|
}
|
|
153
168
|
}
|
|
169
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
154
170
|
}, [
|
|
155
171
|
activeRoomJID,
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
172
|
+
hasRooms,
|
|
173
|
+
activeRoomExists,
|
|
174
|
+
activeHistoryLoaded,
|
|
175
|
+
defaultRoomsMissing,
|
|
159
176
|
]);
|
|
160
177
|
};
|
|
@@ -79,7 +79,6 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
79
79
|
(state: RootState) => state.chatSettingStore.langSource
|
|
80
80
|
);
|
|
81
81
|
const editAction = useSelector((state: RootState) => state.rooms.editAction);
|
|
82
|
-
const rooms = useSelector((state: RootState) => state.rooms.rooms);
|
|
83
82
|
|
|
84
83
|
const {
|
|
85
84
|
handleMessageSent,
|
|
@@ -88,10 +87,6 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
88
87
|
handleMessageRetry,
|
|
89
88
|
} = useEventHandlers(config);
|
|
90
89
|
|
|
91
|
-
const failedMessages = useSelector(
|
|
92
|
-
(state: RootState) => state.roomHeapSlice?.failedMessages || {}
|
|
93
|
-
);
|
|
94
|
-
|
|
95
90
|
const sendMessage = useCallback(
|
|
96
91
|
async (
|
|
97
92
|
message: string,
|
|
@@ -162,6 +157,16 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
162
157
|
// manual-mode readers see the Translate link on it too (parity with
|
|
163
158
|
// the web SDK, which stamps langSource on the optimistic message).
|
|
164
159
|
langSource: (langSource as any) || 'en',
|
|
160
|
+
// Reply fields as the wire carries them (strings), so a thread reply
|
|
161
|
+
// shows in its thread — and NOT in the channel — from the first
|
|
162
|
+
// frame, not only once the server echo lands.
|
|
163
|
+
...(isReply
|
|
164
|
+
? {
|
|
165
|
+
isReply: 'true',
|
|
166
|
+
showInChannel: isChecked ? 'true' : 'false',
|
|
167
|
+
mainMessage,
|
|
168
|
+
}
|
|
169
|
+
: {}),
|
|
165
170
|
user: {
|
|
166
171
|
...(user as any),
|
|
167
172
|
id: selfId,
|
|
@@ -423,7 +428,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
423
428
|
mimetype: type,
|
|
424
429
|
originalName: data?.name,
|
|
425
430
|
size: fileSizeStr,
|
|
426
|
-
isReply,
|
|
431
|
+
isReply: isReply ? 'true' : 'false',
|
|
427
432
|
showInChannel: `${isChecked}`,
|
|
428
433
|
mainMessage,
|
|
429
434
|
} as any as IMessage,
|
|
@@ -673,7 +678,8 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
673
678
|
// it. No-op when the id isn't in the failed map.
|
|
674
679
|
const retryMessage = useCallback(
|
|
675
680
|
async (failedId: string) => {
|
|
676
|
-
const payload =
|
|
681
|
+
const payload =
|
|
682
|
+
reduxStore.getState().roomHeapSlice?.failedMessages?.[failedId];
|
|
677
683
|
if (!payload) {return;}
|
|
678
684
|
|
|
679
685
|
// The server may have accepted the original send even though its
|
|
@@ -681,7 +687,8 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
681
687
|
// failed, but a confirmed (non-pending) copy is already sitting in
|
|
682
688
|
// the room. Resending here would deliver a genuine duplicate; just
|
|
683
689
|
// clear the failure and let the existing copy stand.
|
|
684
|
-
const roomMsgs =
|
|
690
|
+
const roomMsgs =
|
|
691
|
+
reduxStore.getState().rooms?.rooms?.[payload.roomJID]?.messages || [];
|
|
685
692
|
const alreadyDelivered = roomMsgs.some(
|
|
686
693
|
(m: any) =>
|
|
687
694
|
!m.pending && (m.id === failedId || m.xmppId === failedId)
|
|
@@ -720,7 +727,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
720
727
|
);
|
|
721
728
|
}
|
|
722
729
|
},
|
|
723
|
-
[
|
|
730
|
+
[reduxStore, dispatch, handleMessageRetry, sendMessage, sendMedia]
|
|
724
731
|
);
|
|
725
732
|
|
|
726
733
|
// ChatRoom/ThreadWrapper consume this as the "edit branch" of send.
|
|
@@ -762,7 +769,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
762
769
|
const isLastMessageFromUserAndProcessing = useCallback(
|
|
763
770
|
(roomJID: string): boolean => {
|
|
764
771
|
if (!roomJID) {return false;}
|
|
765
|
-
const msgs = rooms?.[roomJID]?.messages;
|
|
772
|
+
const msgs = reduxStore.getState().rooms?.rooms?.[roomJID]?.messages;
|
|
766
773
|
if (!msgs || msgs.length === 0) {return false;}
|
|
767
774
|
const last = msgs[msgs.length - 1];
|
|
768
775
|
if (!last?.pending) {return false;}
|
|
@@ -770,7 +777,7 @@ export const useSendMessage = (_configOverride?: IConfig) => {
|
|
|
770
777
|
if (!selfId) {return false;}
|
|
771
778
|
return last.user?.id === selfId;
|
|
772
779
|
},
|
|
773
|
-
[
|
|
780
|
+
[reduxStore, user?.xmppUsername, user?.walletAddress]
|
|
774
781
|
);
|
|
775
782
|
|
|
776
783
|
return {
|
|
@@ -49,7 +49,7 @@ export const useUnreadMessagesCounter = (): UnreadMessagesStats => {
|
|
|
49
49
|
unreadByRoom[roomJid] = unreadCount;
|
|
50
50
|
totalCount += unreadCount;
|
|
51
51
|
}
|
|
52
|
-
if ((room as any)?.unreadCapped) {
|
|
52
|
+
if ((room as any)?.unreadCapped && unreadCount >= 10) {
|
|
53
53
|
isCapped = true;
|
|
54
54
|
}
|
|
55
55
|
});
|