@amityco/ts-sdk 6.17.3 → 6.18.0
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/dist/@types/core/events.d.ts +4 -2
- package/dist/@types/core/events.d.ts.map +1 -1
- package/dist/@types/core/marker.d.ts +12 -1
- package/dist/@types/core/marker.d.ts.map +1 -1
- package/dist/@types/core/model.d.ts +6 -2
- package/dist/@types/core/model.d.ts.map +1 -1
- package/dist/@types/core/payload.d.ts +20 -3
- package/dist/@types/core/payload.d.ts.map +1 -1
- package/dist/@types/core/readReceipt.d.ts +21 -0
- package/dist/@types/core/readReceipt.d.ts.map +1 -0
- package/dist/@types/domains/channel.d.ts +11 -1
- package/dist/@types/domains/channel.d.ts.map +1 -1
- package/dist/@types/domains/client.d.ts +12 -2
- package/dist/@types/domains/client.d.ts.map +1 -1
- package/dist/@types/domains/community.d.ts +1 -3
- package/dist/@types/domains/community.d.ts.map +1 -1
- package/dist/@types/domains/group.d.ts +2 -2
- package/dist/@types/domains/group.d.ts.map +1 -1
- package/dist/@types/domains/marker.d.ts +15 -0
- package/dist/@types/domains/marker.d.ts.map +1 -1
- package/dist/@types/domains/message.d.ts +4 -0
- package/dist/@types/domains/message.d.ts.map +1 -1
- package/dist/@types/domains/story.d.ts +20 -3
- package/dist/@types/domains/story.d.ts.map +1 -1
- package/dist/@types/domains/subChannel.d.ts +4 -0
- package/dist/@types/domains/subChannel.d.ts.map +1 -1
- package/dist/channelRepository/api/markAsRead.d.ts.map +1 -1
- package/dist/channelRepository/channelModeration/api/index.d.ts +2 -0
- package/dist/channelRepository/channelModeration/api/index.d.ts.map +1 -1
- package/dist/channelRepository/channelModeration/api/muteMembers.d.ts +17 -0
- package/dist/channelRepository/channelModeration/api/muteMembers.d.ts.map +1 -0
- package/dist/channelRepository/channelModeration/api/unmuteMembers.d.ts +16 -0
- package/dist/channelRepository/channelModeration/api/unmuteMembers.d.ts.map +1 -0
- package/dist/channelRepository/events/onChannelDeleted.d.ts.map +1 -1
- package/dist/channelRepository/events/onChannelLeft.d.ts.map +1 -1
- package/dist/channelRepository/events/onChannelMemberBanned.d.ts.map +1 -1
- package/dist/channelRepository/observers/getChannel.d.ts.map +1 -1
- package/dist/channelRepository/observers/getChannels/ChannelLiveCollectionController.d.ts.map +1 -1
- package/dist/channelRepository/observers/getChannels/ChannelQueryStreamController.d.ts.map +1 -1
- package/dist/channelRepository/utils/getChannelIsMentioned.d.ts +10 -0
- package/dist/channelRepository/utils/getChannelIsMentioned.d.ts.map +1 -0
- package/dist/channelRepository/utils/getSubChannelsUnreadCount.d.ts +10 -0
- package/dist/channelRepository/utils/getSubChannelsUnreadCount.d.ts.map +1 -0
- package/dist/channelRepository/utils/prepareChannelPayload.d.ts.map +1 -1
- package/dist/client/api/accessTokenExpiryWatcher.d.ts +1 -1
- package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/client/api/enableUnreadCount.d.ts +2 -0
- package/dist/client/api/enableUnreadCount.d.ts.map +1 -0
- package/dist/client/api/index.d.ts +1 -0
- package/dist/client/api/index.d.ts.map +1 -1
- package/dist/client/api/login.d.ts.map +1 -1
- package/dist/client/api/markerSync.d.ts.map +1 -1
- package/dist/client/api/renewal.d.ts.map +1 -1
- package/dist/client/api/validateTexts.d.ts +8 -0
- package/dist/client/api/validateTexts.d.ts.map +1 -0
- package/dist/client/api/validateUrls.d.ts +8 -0
- package/dist/client/api/validateUrls.d.ts.map +1 -0
- package/dist/client/observers/getUserUnread.d.ts +1 -1
- package/dist/client/observers/getUserUnread.d.ts.map +1 -1
- package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngine.d.ts +33 -0
- package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngine.d.ts.map +1 -0
- package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngineOnLoginHandler.d.ts +3 -0
- package/dist/client/utils/ReadReceiptSync/readReceiptSyncEngineOnLoginHandler.d.ts.map +1 -0
- package/dist/client/utils/markerSyncEngine.d.ts +2 -0
- package/dist/client/utils/markerSyncEngine.d.ts.map +1 -1
- package/dist/client/utils/setClientToken.d.ts.map +1 -1
- package/dist/client/utils/subscribeGlobalTopic.d.ts.map +1 -1
- package/dist/commentRepository/api/deleteComment.d.ts.map +1 -1
- package/dist/commentRepository/api/queryComments.d.ts.map +1 -1
- package/dist/commentRepository/events/utils.d.ts.map +1 -1
- package/dist/commentRepository/internalApi/queryComments.d.ts.map +1 -1
- package/dist/commentRepository/utils/convertToInternalComment.d.ts +8 -0
- package/dist/commentRepository/utils/convertToInternalComment.d.ts.map +1 -0
- package/dist/core/events.d.ts +3 -3
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/model/idResolvers.d.ts.map +1 -1
- package/dist/core/model/index.d.ts.map +1 -1
- package/dist/core/query/sorting.d.ts +6 -0
- package/dist/core/query/sorting.d.ts.map +1 -1
- package/dist/core/subscription.d.ts +1 -0
- package/dist/core/subscription.d.ts.map +1 -1
- package/dist/index.cjs.js +5745 -4474
- package/dist/index.esm.js +5183 -3914
- package/dist/index.umd.js +4 -4
- package/dist/marker/api/getChannelMarkers.d.ts.map +1 -1
- package/dist/marker/api/getMessageMarkers.d.ts.map +1 -1
- package/dist/marker/api/getSubChannelMarkers.d.ts.map +1 -1
- package/dist/marker/api/getUserMarker.d.ts +1 -1
- package/dist/marker/api/getUserMarker.d.ts.map +1 -1
- package/dist/marker/api/getUserMessageFeedMarkers.d.ts +18 -0
- package/dist/marker/api/getUserMessageFeedMarkers.d.ts.map +1 -0
- package/dist/marker/events/onMessageMarked.d.ts.map +1 -1
- package/dist/marker/events/onUserFeedMarkerUpdated.d.ts +17 -0
- package/dist/marker/events/onUserFeedMarkerUpdated.d.ts.map +1 -0
- package/dist/marker/events/onUserMarkerSync.d.ts.map +1 -1
- package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadByChannelId.d.ts +2 -0
- package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadByChannelId.d.ts.map +1 -0
- package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadBySubChannelId.d.ts +2 -0
- package/dist/marker/utils/addFlagIsDeletedSubChannelUnreadBySubChannelId.d.ts.map +1 -0
- package/dist/marker/utils/deleteChannelUnreadByChannelId.d.ts +2 -0
- package/dist/marker/utils/deleteChannelUnreadByChannelId.d.ts.map +1 -0
- package/dist/marker/utils/persistUnreadCountInfo.d.ts +2 -0
- package/dist/marker/utils/persistUnreadCountInfo.d.ts.map +1 -0
- package/dist/marker/utils/reCalculateChannelUnreadInfo.d.ts +2 -0
- package/dist/marker/utils/reCalculateChannelUnreadInfo.d.ts.map +1 -0
- package/dist/marker/utils/updateSubChannelUnreadFromMessage.d.ts +2 -0
- package/dist/marker/utils/updateSubChannelUnreadFromMessage.d.ts.map +1 -0
- package/dist/messagePreview/utils/getSubChannelMessagePreviewWithUser.d.ts +1 -0
- package/dist/messagePreview/utils/getSubChannelMessagePreviewWithUser.d.ts.map +1 -1
- package/dist/messagePreview/utils/updateMessagePreviewFromMessage.d.ts +2 -2
- package/dist/messagePreview/utils/updateMessagePreviewFromMessage.d.ts.map +1 -1
- package/dist/messageRepository/api/createMessage.d.ts.map +1 -1
- package/dist/messageRepository/api/deleteMessage.d.ts.map +1 -1
- package/dist/messageRepository/api/editMessage.d.ts.map +1 -1
- package/dist/messageRepository/api/getMessage.d.ts.map +1 -1
- package/dist/messageRepository/api/getMessages.d.ts.map +1 -1
- package/dist/messageRepository/api/markAsDelivered.d.ts.map +1 -1
- package/dist/messageRepository/api/queryMessages.d.ts.map +1 -1
- package/dist/messageRepository/api/softDeleteMessage.d.ts.map +1 -1
- package/dist/messageRepository/api/updateMessage.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageCreated.d.ts +2 -2
- package/dist/messageRepository/events/onMessageCreated.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageDeleted.d.ts +1 -1
- package/dist/messageRepository/events/onMessageDeleted.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageFetched.d.ts +1 -1
- package/dist/messageRepository/events/onMessageFetched.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageFlagCleared.d.ts +1 -1
- package/dist/messageRepository/events/onMessageFlagCleared.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageFlagged.d.ts +1 -1
- package/dist/messageRepository/events/onMessageFlagged.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageReactionAdded.d.ts +1 -1
- package/dist/messageRepository/events/onMessageReactionAdded.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageReactionRemoved.d.ts +1 -1
- package/dist/messageRepository/events/onMessageReactionRemoved.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageUnflagged.d.ts +1 -1
- package/dist/messageRepository/events/onMessageUnflagged.d.ts.map +1 -1
- package/dist/messageRepository/events/onMessageUpdated.d.ts +1 -1
- package/dist/messageRepository/events/onMessageUpdated.d.ts.map +1 -1
- package/dist/messageRepository/internalApi/getMessage.d.ts +32 -0
- package/dist/messageRepository/internalApi/getMessage.d.ts.map +1 -0
- package/dist/messageRepository/internalApi/getMessages.d.ts +32 -0
- package/dist/messageRepository/internalApi/getMessages.d.ts.map +1 -0
- package/dist/messageRepository/observers/getMessage.d.ts.map +1 -1
- package/dist/messageRepository/observers/getMessages/MessageLiveCollectionController.d.ts.map +1 -1
- package/dist/messageRepository/observers/getMessages/MessageQueryStreamController.d.ts +2 -2
- package/dist/messageRepository/observers/getMessages/MessageQueryStreamController.d.ts.map +1 -1
- package/dist/messageRepository/observers/observeMessage.d.ts.map +1 -1
- package/dist/messageRepository/observers/observeMessages.d.ts.map +1 -1
- package/dist/messageRepository/utils/getMessageReadCount.d.ts +1 -1
- package/dist/messageRepository/utils/getMessageReadCount.d.ts.map +1 -1
- package/dist/messageRepository/utils/prepareMessagePayload.d.ts +1 -1
- package/dist/messageRepository/utils/prepareMessagePayload.d.ts.map +1 -1
- package/dist/reactionRepository/events/onReactionAdded.d.ts +1 -1
- package/dist/reactionRepository/events/onReactionAdded.d.ts.map +1 -1
- package/dist/reactionRepository/events/onReactionRemoved.d.ts +1 -1
- package/dist/reactionRepository/events/onReactionRemoved.d.ts.map +1 -1
- package/dist/reactionRepository/events/onReactorAdded.d.ts.map +1 -1
- package/dist/reactionRepository/events/onReactorRemoved.d.ts.map +1 -1
- package/dist/reactionRepository/utils/fetchReference.d.ts +1 -1
- package/dist/reactionRepository/utils/fetchReference.d.ts.map +1 -1
- package/dist/reactionRepository/utils/prepareMessagePayloadForCache.d.ts +1 -1
- package/dist/reactionRepository/utils/prepareMessagePayloadForCache.d.ts.map +1 -1
- package/dist/reactionRepository/utils/prepareReactionPayloadFormEvent.d.ts +1 -0
- package/dist/reactionRepository/utils/prepareReactionPayloadFormEvent.d.ts.map +1 -1
- package/dist/storyRepository/api/createImageStory.d.ts.map +1 -1
- package/dist/storyRepository/api/createVideoStory.d.ts.map +1 -1
- package/dist/storyRepository/constants.d.ts +2 -0
- package/dist/storyRepository/constants.d.ts.map +1 -1
- package/dist/storyRepository/events/onStoryReactionAdded.d.ts.map +1 -1
- package/dist/storyRepository/events/onStoryReactionRemoved.d.ts.map +1 -1
- package/dist/storyRepository/internalApi/getStoryByStoryId.d.ts.map +1 -1
- package/dist/storyRepository/observers/getActiveStoriesByTarget.d.ts.map +1 -1
- package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.d.ts +14 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.d.ts.map +1 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.d.ts +13 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.d.ts.map +1 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.d.ts +16 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.d.ts.map +1 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.d.ts +2 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.d.ts.map +1 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/index.d.ts +2 -0
- package/dist/storyRepository/observers/getGlobalStoryTargets/index.d.ts.map +1 -0
- package/dist/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.d.ts.map +1 -1
- package/dist/storyRepository/observers/index.d.ts +1 -0
- package/dist/storyRepository/observers/index.d.ts.map +1 -1
- package/dist/storyRepository/utils/StoryComputedValue.d.ts +21 -0
- package/dist/storyRepository/utils/StoryComputedValue.d.ts.map +1 -0
- package/dist/storyRepository/utils/convertRawToStory.d.ts +2 -2
- package/dist/storyRepository/utils/convertRawToStory.d.ts.map +1 -1
- package/dist/storyRepository/utils/convertStoryPayloadToRaw.d.ts.map +1 -1
- package/dist/subChannelRepository/api/markAsReadBySegment.d.ts +16 -0
- package/dist/subChannelRepository/api/markAsReadBySegment.d.ts.map +1 -0
- package/dist/subChannelRepository/api/readingAPI.d.ts.map +1 -1
- package/dist/subChannelRepository/api/startReadingAPI.d.ts.map +1 -1
- package/dist/subChannelRepository/api/stopReadingAPI.d.ts.map +1 -1
- package/dist/subChannelRepository/events/onSubChannelCreated.d.ts.map +1 -1
- package/dist/subChannelRepository/events/onSubChannelDeleted.d.ts.map +1 -1
- package/dist/subChannelRepository/index.d.ts +1 -0
- package/dist/subChannelRepository/index.d.ts.map +1 -1
- package/dist/subChannelRepository/observers/getSubChannel.d.ts.map +1 -1
- package/dist/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.d.ts.map +1 -1
- package/dist/subChannelRepository/utils/convertSubChannelFromRaw.d.ts.map +1 -1
- package/dist/subChannelRepository/utils/getSubChannelIsMentioned.d.ts +2 -0
- package/dist/subChannelRepository/utils/getSubChannelIsMentioned.d.ts.map +1 -0
- package/dist/subChannelRepository/utils/getSubChannelUnreadCount.d.ts.map +1 -1
- package/dist/subChannelRepository/utils/markReadEngine.d.ts +2 -0
- package/dist/subChannelRepository/utils/markReadEngine.d.ts.map +1 -1
- package/dist/subChannelRepository/utils/messageReceiptSync.d.ts +31 -0
- package/dist/subChannelRepository/utils/messageReceiptSync.d.ts.map +1 -0
- package/dist/subChannelRepository/utils/persistOptimisticUnreadInfo.d.ts +2 -0
- package/dist/subChannelRepository/utils/persistOptimisticUnreadInfo.d.ts.map +1 -0
- package/dist/utils/linkedObject/index.d.ts +1 -0
- package/dist/utils/linkedObject/index.d.ts.map +1 -1
- package/dist/utils/linkedObject/messageLinkedObject.d.ts +2 -0
- package/dist/utils/linkedObject/messageLinkedObject.d.ts.map +1 -0
- package/dist/utils/linkedObject/storyLinkedObject.d.ts.map +1 -1
- package/dist/utils/linkedObject/storyTargetLinkedObject.d.ts.map +1 -1
- package/dist/utils/marker.d.ts +0 -1
- package/dist/utils/marker.d.ts.map +1 -1
- package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
- package/dist/utils/tests/dummy/community.d.ts +1 -1
- package/dist/utils/tests/dummy/marker.d.ts +1 -0
- package/dist/utils/tests/dummy/marker.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/@types/core/events.ts +4 -2
- package/src/@types/core/marker.ts +13 -1
- package/src/@types/core/model.ts +8 -2
- package/src/@types/core/payload.ts +26 -3
- package/src/@types/core/readReceipt.ts +23 -0
- package/src/@types/domains/channel.ts +11 -1
- package/src/@types/domains/client.ts +14 -6
- package/src/@types/domains/community.ts +2 -3
- package/src/@types/domains/group.ts +2 -2
- package/src/@types/domains/marker.ts +17 -0
- package/src/@types/domains/message.ts +6 -0
- package/src/@types/domains/story.ts +26 -4
- package/src/@types/domains/subChannel.ts +4 -0
- package/src/channelRepository/api/markAsRead.ts +3 -7
- package/src/channelRepository/channelModeration/api/index.ts +3 -0
- package/src/channelRepository/channelModeration/api/muteMembers.ts +47 -0
- package/src/channelRepository/channelModeration/api/unmuteMembers.ts +43 -0
- package/src/channelRepository/events/onChannelCreated.ts +1 -1
- package/src/channelRepository/events/onChannelDeleted.ts +9 -0
- package/src/channelRepository/events/onChannelJoined.ts +1 -1
- package/src/channelRepository/events/onChannelLeft.ts +10 -1
- package/src/channelRepository/events/onChannelMemberAdded.ts +1 -1
- package/src/channelRepository/events/onChannelMemberBanned.ts +17 -0
- package/src/channelRepository/events/onChannelMemberRemoved.ts +1 -1
- package/src/channelRepository/events/onChannelMemberRoleAdded.ts +1 -1
- package/src/channelRepository/events/onChannelMemberRoleRemoved.ts +1 -1
- package/src/channelRepository/events/onChannelMemberUnbanned.ts +1 -1
- package/src/channelRepository/events/onChannelMuted.ts +1 -1
- package/src/channelRepository/events/onChannelUpdated.ts +1 -1
- package/src/channelRepository/observers/getChannel.ts +12 -8
- package/src/channelRepository/observers/getChannels/ChannelLiveCollectionController.ts +44 -11
- package/src/channelRepository/observers/getChannels/ChannelQueryStreamController.ts +4 -1
- package/src/channelRepository/utils/getChannelIsMentioned.ts +42 -0
- package/src/channelRepository/utils/getSubChannelsUnreadCount.ts +50 -0
- package/src/channelRepository/utils/prepareChannelPayload.ts +25 -4
- package/src/channelRepository/utils/tests/prepareChannelPayload.test.ts +6 -0
- package/src/client/api/accessTokenExpiryWatcher.ts +7 -2
- package/src/client/api/createClient.ts +11 -0
- package/src/client/api/enableUnreadCount.ts +24 -0
- package/src/client/api/index.ts +2 -0
- package/src/client/api/login.ts +7 -5
- package/src/client/api/markerSync.ts +2 -7
- package/src/client/api/renewal.ts +2 -5
- package/src/client/api/validateTexts.ts +23 -0
- package/src/client/api/validateUrls.ts +23 -0
- package/src/client/observers/getUserUnread.ts +38 -13
- package/src/client/utils/ReadReceiptSync/readReceiptSyncEngine.ts +259 -0
- package/src/client/utils/ReadReceiptSync/readReceiptSyncEngineOnLoginHandler.ts +21 -0
- package/src/client/utils/markerSyncEngine.ts +30 -5
- package/src/client/utils/setClientToken.ts +0 -2
- package/src/client/utils/subscribeGlobalTopic.ts +2 -0
- package/src/commentRepository/api/deleteComment.ts +29 -12
- package/src/commentRepository/api/queryComments.ts +4 -2
- package/src/commentRepository/events/utils.ts +1 -2
- package/src/commentRepository/internalApi/queryComments.ts +4 -3
- package/src/commentRepository/utils/convertToInternalComment.ts +17 -0
- package/src/core/model/idResolvers.ts +3 -0
- package/src/core/model/index.ts +3 -0
- package/src/core/query/sorting.ts +8 -0
- package/src/core/subscription.ts +6 -0
- package/src/marker/api/getChannelMarkers.ts +2 -4
- package/src/marker/api/getMessageMarkers.ts +1 -5
- package/src/marker/api/getSubChannelMarkers.ts +12 -7
- package/src/marker/api/getUserMarker.ts +3 -10
- package/src/marker/api/getUserMessageFeedMarkers.ts +35 -0
- package/src/marker/api/tests/getSubChannelMarkers.test.ts +7 -0
- package/src/marker/events/onChannelMarkerFetched.ts +1 -1
- package/src/marker/events/onChannelMarkerUpdated.ts +1 -1
- package/src/marker/events/onFeedlMarkerFetched.ts +1 -1
- package/src/marker/events/onFeedlMarkerUpdated.ts +1 -1
- package/src/marker/events/onMessageMarked.ts +28 -12
- package/src/marker/events/onMessageMarkerFetched.ts +1 -1
- package/src/marker/events/onSubChannelMarkerFetched.ts +1 -1
- package/src/marker/events/onSubChannelMarkerUpdated.ts +1 -1
- package/src/marker/events/onUserFeedMarkerUpdated.ts +38 -0
- package/src/marker/events/onUserMarkerFetched.ts +1 -1
- package/src/marker/events/onUserMarkerSync.ts +3 -8
- package/src/marker/utils/addFlagIsDeletedSubChannelUnreadByChannelId.ts +19 -0
- package/src/marker/utils/addFlagIsDeletedSubChannelUnreadBySubChannelId.ts +13 -0
- package/src/marker/utils/deleteChannelUnreadByChannelId.ts +11 -0
- package/src/marker/utils/persistUnreadCountInfo.ts +47 -0
- package/src/marker/utils/reCalculateChannelUnreadInfo.ts +37 -0
- package/src/marker/utils/updateSubChannelUnreadFromMessage.ts +40 -0
- package/src/messagePreview/utils/updateMessagePreviewFromMessage.ts +2 -2
- package/src/messageRepository/api/createMessage.ts +6 -4
- package/src/messageRepository/api/deleteMessage.ts +6 -5
- package/src/messageRepository/api/editMessage.ts +5 -4
- package/src/messageRepository/api/getMessage.ts +2 -1
- package/src/messageRepository/api/getMessages.ts +2 -1
- package/src/messageRepository/api/markAsDelivered.ts +2 -6
- package/src/messageRepository/api/queryMessages.ts +8 -1
- package/src/messageRepository/api/softDeleteMessage.ts +6 -5
- package/src/messageRepository/api/updateMessage.ts +5 -4
- package/src/messageRepository/events/onMessageCreated.ts +12 -2
- package/src/messageRepository/events/onMessageDeleted.ts +4 -2
- package/src/messageRepository/events/onMessageFetched.ts +3 -1
- package/src/messageRepository/events/onMessageFlagCleared.ts +1 -1
- package/src/messageRepository/events/onMessageFlagged.ts +4 -2
- package/src/messageRepository/events/onMessageReactionAdded.ts +1 -1
- package/src/messageRepository/events/onMessageReactionRemoved.ts +1 -1
- package/src/messageRepository/events/onMessageUnflagged.ts +3 -1
- package/src/messageRepository/events/onMessageUpdated.ts +4 -2
- package/src/messageRepository/events/tests/events.test.ts +4 -1
- package/src/messageRepository/internalApi/getMessage.ts +101 -0
- package/src/messageRepository/internalApi/getMessages.ts +82 -0
- package/src/messageRepository/observers/getMessage.ts +10 -2
- package/src/messageRepository/observers/getMessages/MessageLiveCollectionController.ts +4 -2
- package/src/messageRepository/observers/getMessages/MessageQueryStreamController.ts +2 -2
- package/src/messageRepository/observers/observeMessage.ts +13 -4
- package/src/messageRepository/observers/observeMessages.ts +19 -6
- package/src/messageRepository/utils/getMessageReadCount.ts +5 -4
- package/src/messageRepository/utils/prepareMessagePayload.ts +6 -10
- package/src/reactionRepository/events/onReactionAdded.ts +1 -0
- package/src/reactionRepository/events/onReactorAdded.ts +13 -0
- package/src/reactionRepository/events/onReactorRemoved.ts +13 -0
- package/src/reactionRepository/utils/fetchReference.ts +1 -1
- package/src/reactionRepository/utils/prepareMessagePayloadForCache.ts +1 -1
- package/src/reactionRepository/utils/prepareReactionPayloadFormEvent.ts +68 -15
- package/src/storyRepository/api/createImageStory.ts +7 -0
- package/src/storyRepository/api/createVideoStory.ts +7 -0
- package/src/storyRepository/constants.ts +2 -0
- package/src/storyRepository/events/onStoryCreated.ts +2 -2
- package/src/storyRepository/events/onStoryDeleted.ts +2 -2
- package/src/storyRepository/events/onStoryReactionAdded.ts +11 -5
- package/src/storyRepository/events/onStoryReactionRemoved.ts +11 -5
- package/src/storyRepository/events/onStoryUpdated.ts +2 -2
- package/src/storyRepository/internalApi/createStory.ts +2 -2
- package/src/storyRepository/internalApi/deleteStory.ts +1 -1
- package/src/storyRepository/internalApi/getActiveStoriesByTarget.ts +2 -2
- package/src/storyRepository/internalApi/getStoryByStoryId.ts +2 -1
- package/src/storyRepository/observers/getActiveStoriesByTarget.ts +11 -5
- package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.ts +152 -0
- package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.ts +73 -0
- package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.ts +94 -0
- package/src/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.ts +32 -0
- package/src/storyRepository/observers/getGlobalStoryTargets/index.ts +1 -0
- package/src/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.ts +0 -2
- package/src/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.ts +2 -2
- package/src/storyRepository/observers/index.ts +1 -0
- package/src/storyRepository/utils/StoryComputedValue.ts +136 -0
- package/src/storyRepository/utils/convertRawToStory.ts +11 -4
- package/src/storyRepository/utils/convertStoryPayloadToRaw.ts +23 -0
- package/src/subChannelRepository/api/markAsReadBySegment.ts +35 -0
- package/src/subChannelRepository/api/readingAPI.ts +2 -7
- package/src/subChannelRepository/api/startReadingAPI.ts +2 -7
- package/src/subChannelRepository/api/stopReadingAPI.ts +2 -7
- package/src/subChannelRepository/events/onSubChannelCreated.ts +7 -1
- package/src/subChannelRepository/events/onSubChannelDeleted.ts +10 -1
- package/src/subChannelRepository/events/onSubChannelFetched.ts +1 -1
- package/src/subChannelRepository/index.ts +1 -0
- package/src/subChannelRepository/observers/getSubChannel.ts +10 -8
- package/src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts +9 -4
- package/src/subChannelRepository/utils/convertSubChannelFromRaw.ts +5 -2
- package/src/subChannelRepository/utils/{getSubChannelHasMentioned.ts → getSubChannelIsMentioned.ts} +19 -1
- package/src/subChannelRepository/utils/getSubChannelUnreadCount.ts +18 -0
- package/src/subChannelRepository/utils/markReadEngine.ts +2 -0
- package/src/subChannelRepository/utils/messageReceiptSync.ts +73 -0
- package/src/subChannelRepository/utils/persistOptimisticUnreadInfo.ts +23 -0
- package/src/utils/linkedObject/index.ts +2 -0
- package/src/utils/linkedObject/messageLinkedObject.ts +21 -0
- package/src/utils/linkedObject/storyLinkedObject.ts +2 -1
- package/src/utils/linkedObject/storyTargetLinkedObject.ts +26 -4
- package/src/utils/marker.ts +0 -6
- package/src/utils/tests/dummy/channel.ts +8 -0
- package/src/utils/tests/dummy/marker.ts +15 -1
- package/dist/channelRepository/utils/getChannelHasMentioned.d.ts +0 -7
- package/dist/channelRepository/utils/getChannelHasMentioned.d.ts.map +0 -1
- package/dist/channelRepository/utils/getChannelUnreadCount.d.ts +0 -2
- package/dist/channelRepository/utils/getChannelUnreadCount.d.ts.map +0 -1
- package/dist/storyRepository/utils/calculateHasUnseenFlag.d.ts +0 -6
- package/dist/storyRepository/utils/calculateHasUnseenFlag.d.ts.map +0 -1
- package/dist/subChannelRepository/utils/getSubChannelHasMentioned.d.ts +0 -2
- package/dist/subChannelRepository/utils/getSubChannelHasMentioned.d.ts.map +0 -1
- package/src/channelRepository/utils/getChannelHasMentioned.ts +0 -28
- package/src/channelRepository/utils/getChannelUnreadCount.ts +0 -27
- package/src/storyRepository/utils/calculateHasUnseenFlag.ts +0 -47
|
@@ -9,6 +9,9 @@ import {
|
|
|
9
9
|
UNSYNCED_OBJECT_CACHED_AT_VALUE,
|
|
10
10
|
} from '~/utils/constants';
|
|
11
11
|
|
|
12
|
+
import { isEqual } from '~/utils/isEqual';
|
|
13
|
+
import { convertGetterPropsToStatic } from '~/utils/object';
|
|
14
|
+
|
|
12
15
|
/**
|
|
13
16
|
*
|
|
14
17
|
* ```js
|
|
@@ -27,7 +30,7 @@ import {
|
|
|
27
30
|
* @category Message Live Object
|
|
28
31
|
*/
|
|
29
32
|
export const getUserUnread = (
|
|
30
|
-
callback: Amity.LiveObjectCallback<Amity.UserUnread>,
|
|
33
|
+
callback: Amity.LiveObjectCallback<Amity.UserUnread | undefined>,
|
|
31
34
|
): Amity.Unsubscriber => {
|
|
32
35
|
const { _id: userId } = getActiveUser();
|
|
33
36
|
|
|
@@ -51,14 +54,25 @@ export const getUserUnread = (
|
|
|
51
54
|
|
|
52
55
|
let isUnsyncedModel = false; // for messages
|
|
53
56
|
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
let model: Omit<Amity.UserUnread, 'hasMentioned'> | undefined;
|
|
58
|
+
|
|
59
|
+
const dispatcher = (data: Amity.LiveObject<Amity.UserMarker | undefined>) => {
|
|
60
|
+
const { data: userUnread } = data;
|
|
61
|
+
|
|
62
|
+
const callbackModel = userUnread
|
|
63
|
+
? {
|
|
64
|
+
unreadCount: userUnread.unreadCount,
|
|
65
|
+
isMentioned: userUnread.isMentioned,
|
|
66
|
+
}
|
|
67
|
+
: undefined;
|
|
68
|
+
|
|
69
|
+
model = callbackModel ? convertGetterPropsToStatic(callbackModel) : callbackModel;
|
|
56
70
|
|
|
57
71
|
callback({
|
|
58
|
-
data:
|
|
59
|
-
hasMentioned:
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
data: callbackModel
|
|
73
|
+
? { ...callbackModel, hasMentioned: callbackModel.isMentioned }
|
|
74
|
+
: callbackModel,
|
|
75
|
+
|
|
62
76
|
loading: data.loading,
|
|
63
77
|
error: data.error,
|
|
64
78
|
});
|
|
@@ -78,25 +92,36 @@ export const getUserUnread = (
|
|
|
78
92
|
return currentMaxUserMarker;
|
|
79
93
|
}, null as Amity.UserMarker | null);
|
|
80
94
|
|
|
95
|
+
const eventModel = {
|
|
96
|
+
unreadCount: latestUserMarker?.unreadCount ?? 0,
|
|
97
|
+
isMentioned: filterUserMarkers.some(userMarker => !!userMarker.isMentioned),
|
|
98
|
+
} as Amity.UserMarker;
|
|
99
|
+
|
|
100
|
+
if (isEqual(model, eventModel)) return;
|
|
101
|
+
|
|
81
102
|
dispatcher({
|
|
82
103
|
loading: false,
|
|
83
|
-
data:
|
|
84
|
-
unreadCount: latestUserMarker?.unreadCount ?? 0,
|
|
85
|
-
hasMentioned: filterUserMarkers.some(userMarker => !!userMarker.hasMentioned),
|
|
86
|
-
} as Amity.UserMarker,
|
|
104
|
+
data: eventModel,
|
|
87
105
|
});
|
|
88
106
|
};
|
|
89
107
|
|
|
90
108
|
function isAmityUserMarkerData(data: unknown): data is Amity.UserMarker {
|
|
109
|
+
/**
|
|
110
|
+
* The `data` return from runQuery is Amity.UserMarker | undefined.
|
|
111
|
+
* It's not located inside data field
|
|
112
|
+
*/
|
|
91
113
|
if (data == null) return false;
|
|
92
|
-
return (data as { data: Amity.UserMarker })
|
|
114
|
+
return (data as { data: Amity.UserMarker }) != null;
|
|
93
115
|
}
|
|
94
116
|
|
|
95
117
|
const onFetch = () => {
|
|
96
118
|
const query = createQuery(getUserMarker);
|
|
97
119
|
|
|
98
120
|
runQuery(query, ({ error, data, loading, origin, cachedAt }) => {
|
|
99
|
-
if (!isAmityUserMarkerData(data))
|
|
121
|
+
if (!isAmityUserMarkerData(data)) {
|
|
122
|
+
dispatcher({ loading, data: undefined, origin, error });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
100
125
|
if (cachedAt === UNSYNCED_OBJECT_CACHED_AT_VALUE) {
|
|
101
126
|
dispatcher({
|
|
102
127
|
data,
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { pullFromCache, pushToCache, queryCache } from '~/cache/api';
|
|
2
|
+
import { getActiveClient } from '../../api/activeClient';
|
|
3
|
+
import { markAsReadBySegment } from '~/subChannelRepository/api/markAsReadBySegment';
|
|
4
|
+
import { reCalculateChannelUnreadInfo } from '~/marker/utils/reCalculateChannelUnreadInfo';
|
|
5
|
+
|
|
6
|
+
export class MessageReadReceiptSyncEngine {
|
|
7
|
+
private client: Amity.Client;
|
|
8
|
+
|
|
9
|
+
private isActive = true;
|
|
10
|
+
|
|
11
|
+
private MAX_RETRY = 3;
|
|
12
|
+
|
|
13
|
+
private JOB_QUEUE_SIZE = 120;
|
|
14
|
+
|
|
15
|
+
private jobQueue: Amity.ReadReceiptSyncJob[] = [];
|
|
16
|
+
|
|
17
|
+
private timer: NodeJS.Timer | undefined;
|
|
18
|
+
|
|
19
|
+
// Interval for message read receipt sync in seconds
|
|
20
|
+
private RECEIPT_SYNC_INTERVAL = 1;
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
this.client = getActiveClient();
|
|
24
|
+
// Get remaining unsync read receipts from cache
|
|
25
|
+
this.getUnsyncJobs();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Call this when client call client.login
|
|
29
|
+
startSyncReadReceipt() {
|
|
30
|
+
// Start timer when start receipt sync
|
|
31
|
+
this.timer = setInterval(() => {
|
|
32
|
+
this.syncReadReceipts();
|
|
33
|
+
}, this.RECEIPT_SYNC_INTERVAL * 1000);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Read receipt observer handling
|
|
37
|
+
syncReadReceipts(): void {
|
|
38
|
+
if (this.jobQueue.length === 0 || this.isActive === false) return;
|
|
39
|
+
|
|
40
|
+
const readReceipt = this.getReadReceipt();
|
|
41
|
+
if (readReceipt) {
|
|
42
|
+
this.markReadApi(readReceipt);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private getUnsyncJobs(): void {
|
|
47
|
+
// Get all read receipts that has latestSyncSegment < latestSegment
|
|
48
|
+
const readReceipts = queryCache<Amity.ReadReceipt>(['readReceipt'])?.filter(({ data }) => {
|
|
49
|
+
return data.latestSyncSegment < data.latestSegment;
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Enqueue unsync read receipts to the job queue
|
|
53
|
+
readReceipts?.forEach(({ data: readReceipt }) => {
|
|
54
|
+
this.enqueueReadReceipt(readReceipt.subChannelId, readReceipt.latestSegment);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private getReadReceipt(): Amity.ReadReceiptSyncJob | undefined {
|
|
59
|
+
// Get first read receipt in queue
|
|
60
|
+
const syncJob = this.jobQueue[0];
|
|
61
|
+
|
|
62
|
+
if (!syncJob) return;
|
|
63
|
+
// Skip when it's syncing
|
|
64
|
+
if (syncJob.syncState === Amity.ReadReceiptSyncState.SYNCING) return;
|
|
65
|
+
|
|
66
|
+
// Get readReceipt from cache by subChannelId
|
|
67
|
+
const readReceipt = pullFromCache<Amity.ReadReceipt>([
|
|
68
|
+
'readReceipt',
|
|
69
|
+
syncJob.subChannelId,
|
|
70
|
+
])?.data;
|
|
71
|
+
|
|
72
|
+
if (!readReceipt) return;
|
|
73
|
+
|
|
74
|
+
if (readReceipt?.latestSegment > readReceipt?.latestSyncSegment) {
|
|
75
|
+
syncJob.segment = readReceipt.latestSegment;
|
|
76
|
+
return syncJob;
|
|
77
|
+
}
|
|
78
|
+
// Clear all synced job in job queue
|
|
79
|
+
this.removeSynedReceipt(readReceipt.subChannelId, readReceipt.latestSegment);
|
|
80
|
+
|
|
81
|
+
// Recursion getReadReceipt() until get unsync read receipt or job queue is empty
|
|
82
|
+
return this.getReadReceipt();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private async markReadApi(syncJob: Amity.ReadReceiptSyncJob): Promise<void> {
|
|
86
|
+
const newSyncJob = syncJob;
|
|
87
|
+
newSyncJob.syncState = Amity.ReadReceiptSyncState.SYNCING;
|
|
88
|
+
|
|
89
|
+
const { subChannelId, segment } = newSyncJob;
|
|
90
|
+
|
|
91
|
+
const response = await markAsReadBySegment({ subChannelId, readToSegment: segment });
|
|
92
|
+
|
|
93
|
+
if (response) {
|
|
94
|
+
this.removeSynedReceipt(syncJob.subChannelId, syncJob.segment);
|
|
95
|
+
|
|
96
|
+
const readReceiptCache = pullFromCache<Amity.ReadReceipt>([
|
|
97
|
+
'readReceipt',
|
|
98
|
+
subChannelId,
|
|
99
|
+
])?.data;
|
|
100
|
+
|
|
101
|
+
pushToCache(['readReceipt', subChannelId], {
|
|
102
|
+
...readReceiptCache,
|
|
103
|
+
latestSyncSegment: segment,
|
|
104
|
+
});
|
|
105
|
+
} else if (!response) {
|
|
106
|
+
if (newSyncJob.retryCount > this.MAX_RETRY) {
|
|
107
|
+
this.removeJobFromQueue(newSyncJob);
|
|
108
|
+
} else {
|
|
109
|
+
newSyncJob.retryCount += 1;
|
|
110
|
+
newSyncJob.syncState = Amity.ReadReceiptSyncState.CREATED;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private removeSynedReceipt(subChannelId: string, segment: number) {
|
|
116
|
+
const syncJobs = this.jobQueue;
|
|
117
|
+
|
|
118
|
+
syncJobs.forEach(job => {
|
|
119
|
+
if (job.subChannelId === subChannelId && job.segment <= segment) {
|
|
120
|
+
this.removeJobFromQueue(job);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private startObservingReadReceiptQueue(): void {
|
|
126
|
+
if (this.client.isUnreadCountEnabled) {
|
|
127
|
+
this.isActive = true;
|
|
128
|
+
this.startSyncReadReceipt();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private stopObservingReadReceiptQueue(): void {
|
|
133
|
+
this.isActive = false;
|
|
134
|
+
|
|
135
|
+
const syncJobs = this.jobQueue;
|
|
136
|
+
syncJobs.map(job => {
|
|
137
|
+
if (job.syncState === Amity.ReadReceiptSyncState.SYNCING) {
|
|
138
|
+
return { ...job, syncState: Amity.ReadReceiptSyncState.CREATED };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return job;
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
if (this.timer) clearInterval(this.timer);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Session Management
|
|
148
|
+
onSessionEstablished(): void {
|
|
149
|
+
this.startObservingReadReceiptQueue();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
onSessionDestroyed(): void {
|
|
153
|
+
this.stopObservingReadReceiptQueue();
|
|
154
|
+
this.jobQueue = [];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
onTokenExpired(): void {
|
|
158
|
+
this.stopObservingReadReceiptQueue();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Network Connection Management
|
|
162
|
+
onNetworkOffline(): void {
|
|
163
|
+
// Stop observing to the read receipt queue.
|
|
164
|
+
this.stopObservingReadReceiptQueue();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
onNetworkOnline(): void {
|
|
168
|
+
// Resume observing to the read receipt queue.
|
|
169
|
+
this.startObservingReadReceiptQueue();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
markRead(subChannelId: string, segment: number): void {
|
|
173
|
+
// Step 1: Optimistic update of subChannelUnreadInfo.readToSegment to message.segment
|
|
174
|
+
const cacheKey = ['subChannelUnreadInfo', 'get', subChannelId];
|
|
175
|
+
const subChannelUnreadInfo = pullFromCache<Amity.SubChannelUnreadInfo>(cacheKey)?.data;
|
|
176
|
+
|
|
177
|
+
if (subChannelUnreadInfo && segment > subChannelUnreadInfo.readToSegment) {
|
|
178
|
+
subChannelUnreadInfo.readToSegment = segment;
|
|
179
|
+
subChannelUnreadInfo.unreadCount = Math.max(subChannelUnreadInfo.lastSegment - segment, 0);
|
|
180
|
+
|
|
181
|
+
reCalculateChannelUnreadInfo(subChannelUnreadInfo.channelId);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
pushToCache(cacheKey, subChannelUnreadInfo);
|
|
185
|
+
|
|
186
|
+
// Step 2: Enqueue the read receipt
|
|
187
|
+
this.enqueueReadReceipt(subChannelId, segment);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private enqueueReadReceipt(subChannelId: string, segment: number): void {
|
|
191
|
+
const readReceipt = pullFromCache<Amity.ReadReceipt>(['readReceipt', subChannelId])?.data;
|
|
192
|
+
|
|
193
|
+
// Create new read receipt if it's not exists and add job to queue
|
|
194
|
+
if (!readReceipt) {
|
|
195
|
+
const readReceiptSubChannel: Amity.ReadReceipt = {
|
|
196
|
+
subChannelId,
|
|
197
|
+
latestSegment: segment,
|
|
198
|
+
latestSyncSegment: 0,
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
pushToCache(['readReceipt', subChannelId], readReceiptSubChannel);
|
|
202
|
+
} else if (readReceipt.latestSegment < segment) {
|
|
203
|
+
pushToCache(['readReceipt', subChannelId], { ...readReceipt, latestSegment: segment });
|
|
204
|
+
} else if (readReceipt.latestSyncSegment >= segment) {
|
|
205
|
+
// Skip the job when lastSyncSegment > = segment
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
let syncJob: Amity.ReadReceiptSyncJob | null = this.getSyncJob(subChannelId);
|
|
210
|
+
|
|
211
|
+
if (syncJob === null || syncJob.syncState === Amity.ReadReceiptSyncState.SYNCING) {
|
|
212
|
+
syncJob = {
|
|
213
|
+
subChannelId,
|
|
214
|
+
segment,
|
|
215
|
+
syncState: Amity.ReadReceiptSyncState.CREATED,
|
|
216
|
+
retryCount: 0,
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
this.enqueueJob(syncJob);
|
|
220
|
+
} else if (syncJob.segment < segment) {
|
|
221
|
+
syncJob.segment = segment;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
private getSyncJob(subChannelId: string): Amity.ReadReceiptSyncJob | null {
|
|
226
|
+
const syncJobs = this.jobQueue;
|
|
227
|
+
|
|
228
|
+
const targetJob = syncJobs.find(job => job.subChannelId === subChannelId);
|
|
229
|
+
|
|
230
|
+
return targetJob || null;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private enqueueJob(syncJob: Amity.ReadReceiptSyncJob) {
|
|
234
|
+
if (this.jobQueue.length < this.JOB_QUEUE_SIZE) {
|
|
235
|
+
this.jobQueue.push(syncJob);
|
|
236
|
+
} else {
|
|
237
|
+
// Remove oldest job when queue reach maximum capacity
|
|
238
|
+
this.jobQueue.shift();
|
|
239
|
+
this.jobQueue.push(syncJob);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private removeJobFromQueue(item: Amity.ReadReceiptSyncJob) {
|
|
244
|
+
const index = this.jobQueue.indexOf(item);
|
|
245
|
+
if (index > -1) {
|
|
246
|
+
this.jobQueue.splice(index, 1);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
let instance: MessageReadReceiptSyncEngine | null = null;
|
|
252
|
+
|
|
253
|
+
export default {
|
|
254
|
+
getInstance: () => {
|
|
255
|
+
if (!instance) instance = new MessageReadReceiptSyncEngine();
|
|
256
|
+
|
|
257
|
+
return instance;
|
|
258
|
+
},
|
|
259
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { onSessionStateChange } from '~/client/events/onSessionStateChange';
|
|
2
|
+
import ReadReceiptSyncEngine from '~/client/utils/ReadReceiptSync/readReceiptSyncEngine';
|
|
3
|
+
|
|
4
|
+
export default () => {
|
|
5
|
+
const readReceiptSyncEngine = ReadReceiptSyncEngine.getInstance();
|
|
6
|
+
readReceiptSyncEngine.startSyncReadReceipt();
|
|
7
|
+
|
|
8
|
+
onSessionStateChange(state => {
|
|
9
|
+
if (state === Amity.SessionStates.ESTABLISHED) {
|
|
10
|
+
readReceiptSyncEngine.onSessionEstablished();
|
|
11
|
+
} else if (state === Amity.SessionStates.TOKEN_EXPIRED) {
|
|
12
|
+
readReceiptSyncEngine.onTokenExpired();
|
|
13
|
+
} else {
|
|
14
|
+
readReceiptSyncEngine.onSessionDestroyed();
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return () => {
|
|
19
|
+
readReceiptSyncEngine.onSessionDestroyed();
|
|
20
|
+
};
|
|
21
|
+
};
|
|
@@ -6,14 +6,18 @@ import {
|
|
|
6
6
|
} from '~/channelRepository/events';
|
|
7
7
|
import { onUserMarkerSync } from '~/marker/events/onUserMarkerSync';
|
|
8
8
|
import { setIntervalTask } from '~/utils/timer';
|
|
9
|
-
import { getUserMarker } from '~/marker/api';
|
|
10
|
-
import { onFeedMarkerUpdated } from '~/marker/events';
|
|
11
|
-
import { onMessageCreatedMqtt } from '~/messageRepository/events';
|
|
12
|
-
import { onSubChannelCreated
|
|
9
|
+
import { getUserMarker } from '~/marker/api/getUserMarker';
|
|
10
|
+
import { onFeedMarkerUpdated } from '~/marker/events/onFeedlMarkerUpdated';
|
|
11
|
+
import { onMessageCreatedMqtt } from '~/messageRepository/events/onMessageCreated';
|
|
12
|
+
import { onSubChannelCreated } from '~/subChannelRepository/events/onSubChannelCreated';
|
|
13
|
+
import { onSubChannelDeleted } from '~/subChannelRepository/events/onSubChannelDeleted';
|
|
13
14
|
import { isUnreadCountSupport } from '~/subChannelRepository/utils';
|
|
14
15
|
|
|
15
|
-
import { markerSync } from '../api';
|
|
16
|
+
import { markerSync } from '../api/markerSync';
|
|
17
|
+
import { enableUnreadCount } from '../api/enableUnreadCount';
|
|
18
|
+
|
|
16
19
|
import { onOnline } from './onOnline';
|
|
20
|
+
import { onUserFeedMarkerUpdated } from '~/marker/events/onUserFeedMarkerUpdated';
|
|
17
21
|
|
|
18
22
|
const SYNC_TRIGGER_INTERVAL_TIME = 2000;
|
|
19
23
|
const ON_SUB_CHANNEL_DELETE_SYNC_TRIGGER_DELAY = 2000;
|
|
@@ -22,6 +26,7 @@ let isSyncRunning = false;
|
|
|
22
26
|
let disposers: (() => void)[] = [];
|
|
23
27
|
let isWaitingForResponse = false;
|
|
24
28
|
|
|
29
|
+
let isConsistentMode = true;
|
|
25
30
|
let deviceLastSyncAt: Date | null = null;
|
|
26
31
|
|
|
27
32
|
const getDeviceLastSyncAt = () => {
|
|
@@ -161,6 +166,7 @@ const registerEventListeners = () => {
|
|
|
161
166
|
),
|
|
162
167
|
onFeedMarkerUpdated(() => events.push(Amity.MarkerSyncEvent.MARKER_UPDATED)),
|
|
163
168
|
onUserMarkerSync(() => events.push(Amity.MarkerSyncEvent.MARKER_UPDATED)),
|
|
169
|
+
onUserFeedMarkerUpdated(() => events.push(Amity.MarkerSyncEvent.MARKER_UPDATED)),
|
|
164
170
|
);
|
|
165
171
|
};
|
|
166
172
|
|
|
@@ -169,6 +175,18 @@ const unRegisterEventListeners = () => {
|
|
|
169
175
|
disposers = [];
|
|
170
176
|
};
|
|
171
177
|
|
|
178
|
+
export const startMarkerSync = async () => {
|
|
179
|
+
await fetchDeviceLastSyncAt();
|
|
180
|
+
pushMarkerSyncEvent(Amity.MarkerSyncEvent.START_SYNCING);
|
|
181
|
+
|
|
182
|
+
isConsistentMode = true;
|
|
183
|
+
isSyncRunning = true;
|
|
184
|
+
|
|
185
|
+
registerEventListeners();
|
|
186
|
+
|
|
187
|
+
return unRegisterEventListeners;
|
|
188
|
+
};
|
|
189
|
+
|
|
172
190
|
/**
|
|
173
191
|
```js
|
|
174
192
|
* import { startUnreadSync } from '@amityco/ts-sdk'
|
|
@@ -183,7 +201,12 @@ const unRegisterEventListeners = () => {
|
|
|
183
201
|
export const startUnreadSync = async () => {
|
|
184
202
|
await fetchDeviceLastSyncAt();
|
|
185
203
|
pushMarkerSyncEvent(Amity.MarkerSyncEvent.START_SYNCING);
|
|
204
|
+
|
|
205
|
+
enableUnreadCount();
|
|
206
|
+
|
|
207
|
+
isConsistentMode = false;
|
|
186
208
|
isSyncRunning = true;
|
|
209
|
+
|
|
187
210
|
registerEventListeners();
|
|
188
211
|
};
|
|
189
212
|
|
|
@@ -217,3 +240,5 @@ setIntervalTask(async () => {
|
|
|
217
240
|
|
|
218
241
|
await markerSyncTrigger();
|
|
219
242
|
}, SYNC_TRIGGER_INTERVAL_TIME);
|
|
243
|
+
|
|
244
|
+
export const getMarkerSyncConsistentMode = () => isConsistentMode;
|
|
@@ -19,8 +19,6 @@ export const setClientToken = async (params: Parameters<typeof getToken>[0]) =>
|
|
|
19
19
|
// begin establishing session
|
|
20
20
|
setSessionState(Amity.SessionStates.ESTABLISHING);
|
|
21
21
|
|
|
22
|
-
// @ts-ignore: in that particular case, typing can be
|
|
23
|
-
// ignored since we enforce default values just before.
|
|
24
22
|
const { accessToken, users, expiresAt, issuedAt, refreshToken } = await getToken(params);
|
|
25
23
|
|
|
26
24
|
// manually setup the token for http transport
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getActiveUser } from '~/client/api/activeUser';
|
|
2
2
|
import {
|
|
3
|
+
getMarkerUserFeedTopic,
|
|
3
4
|
getNetworkTopic,
|
|
4
5
|
getSmartFeedChannelTopic,
|
|
5
6
|
getSmartFeedMessageTopic,
|
|
@@ -17,6 +18,7 @@ export const subscribeGlobalTopic = () => {
|
|
|
17
18
|
|
|
18
19
|
// subscribing to user topic is necessary to handle ban event
|
|
19
20
|
subscribeTopic(getUserTopic(getActiveUser())),
|
|
21
|
+
subscribeTopic(getMarkerUserFeedTopic()),
|
|
20
22
|
];
|
|
21
23
|
|
|
22
24
|
return () => disposers.forEach(fn => fn());
|
|
@@ -7,6 +7,7 @@ import { getPost } from '~/postRepository/api/getPost';
|
|
|
7
7
|
import { pushToTombstone } from '~/cache/api/pushToTombstone';
|
|
8
8
|
import { scheduleTask } from '~/core/microtasks';
|
|
9
9
|
|
|
10
|
+
import { getStoryByStoryId } from '~/storyRepository/internalApi/getStoryByStoryId';
|
|
10
11
|
import { getComment } from './getComment';
|
|
11
12
|
|
|
12
13
|
/* begin_public_function
|
|
@@ -48,20 +49,36 @@ export const deleteComment = async (
|
|
|
48
49
|
// to support hard deletion
|
|
49
50
|
const deleted = { ...comment.data, isDeleted: true };
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
if (comment.data.referenceType === 'story') {
|
|
53
|
+
const story = await getStoryByStoryId(comment.data.referenceId);
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
fireEvent('local.story.updated', {
|
|
56
|
+
stories: [story.data],
|
|
57
|
+
categories: [],
|
|
58
|
+
comments: [],
|
|
59
|
+
communities: [],
|
|
60
|
+
communityUsers: [],
|
|
61
|
+
files: [],
|
|
62
|
+
users: [],
|
|
63
|
+
});
|
|
64
|
+
} else {
|
|
65
|
+
const post = await getPost(comment.data.referenceId);
|
|
66
|
+
|
|
67
|
+
// @TODO: Need to separate Local / MQTT later
|
|
68
|
+
fireEvent('post.updated', {
|
|
69
|
+
posts: [post.data],
|
|
70
|
+
categories: [],
|
|
71
|
+
comments: [],
|
|
72
|
+
communities: [],
|
|
73
|
+
communityUsers: [],
|
|
74
|
+
feeds: [],
|
|
75
|
+
files: [],
|
|
76
|
+
postChildren: [],
|
|
77
|
+
users: [],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
64
80
|
|
|
81
|
+
// @TODO: Need to separate Local / MQTT later
|
|
65
82
|
fireEvent('comment.deleted', {
|
|
66
83
|
comments: [deleted],
|
|
67
84
|
commentChildren: [],
|
|
@@ -4,6 +4,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
|
4
4
|
import { getResolver } from '~/core/model';
|
|
5
5
|
|
|
6
6
|
import { inferIsDeleted } from '~/utils/inferIsDeleted';
|
|
7
|
+
import { convertToInternalComment } from '../utils/convertToInternalComment';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* ```js
|
|
@@ -52,12 +53,13 @@ export const queryComments = async (
|
|
|
52
53
|
// API-FIX: backend should answer Amity.Response (2)
|
|
53
54
|
// const { paging, comments } = unwrapPayload(data)
|
|
54
55
|
const { paging, ...payload } = data;
|
|
55
|
-
const
|
|
56
|
+
const processedData = convertToInternalComment(payload);
|
|
57
|
+
const { comments } = processedData;
|
|
56
58
|
|
|
57
59
|
const cachedAt = client.cache && Date.now();
|
|
58
60
|
|
|
59
61
|
if (client.cache) {
|
|
60
|
-
ingestInCache(
|
|
62
|
+
ingestInCache(processedData as Amity.CommentPayload, { cachedAt });
|
|
61
63
|
|
|
62
64
|
const cacheKey = ['comment', 'query', { ...params, options: { limit } } as Amity.Serializable];
|
|
63
65
|
|
|
@@ -44,8 +44,7 @@ export const createCommentEventSubscriber = (
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
const queries = queryCache<Amity.InternalComment[]>(['comment', 'query'])?.filter(
|
|
47
|
-
({ key }) =>
|
|
48
|
-
(key[2] as Amity.QueryComments)?.referenceId === comment.data.referenceId,
|
|
47
|
+
({ key }) => (key[2] as Amity.QueryComments)?.referenceId === comment.data.referenceId,
|
|
49
48
|
);
|
|
50
49
|
|
|
51
50
|
queries?.map(({ key, data }) => upsertInCache(key, data as any, { cachedAt: -1 }));
|
|
@@ -2,8 +2,8 @@ import { getActiveClient } from '~/client/api';
|
|
|
2
2
|
import { pushToCache } from '~/cache/api';
|
|
3
3
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
4
4
|
import { getResolver } from '~/core/model';
|
|
5
|
-
|
|
6
5
|
import { inferIsDeleted } from '~/utils/inferIsDeleted';
|
|
6
|
+
import { convertToInternalComment } from '../utils/convertToInternalComment';
|
|
7
7
|
|
|
8
8
|
export const queryComments = async (
|
|
9
9
|
query: Amity.QueryComments,
|
|
@@ -38,12 +38,13 @@ export const queryComments = async (
|
|
|
38
38
|
// API-FIX: backend should answer Amity.Response (2)
|
|
39
39
|
// const { paging, comments } = unwrapPayload(data)
|
|
40
40
|
const { paging, ...payload } = data;
|
|
41
|
-
const
|
|
41
|
+
const processedData = convertToInternalComment(payload);
|
|
42
|
+
const { comments } = processedData;
|
|
42
43
|
|
|
43
44
|
const cachedAt = client.cache && Date.now();
|
|
44
45
|
|
|
45
46
|
if (client.cache) {
|
|
46
|
-
ingestInCache(
|
|
47
|
+
ingestInCache(processedData as Amity.CommentPayload, { cachedAt });
|
|
47
48
|
|
|
48
49
|
const cacheKey = ['comment', 'query', { ...params, options: { limit } } as Amity.Serializable];
|
|
49
50
|
pushToCache(cacheKey, { comments: comments.map(getResolver('comment')), paging });
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const convertToInternalComment = (commentPayload: Amity.CommentPayload) => {
|
|
2
|
+
const { comments } = commentPayload;
|
|
3
|
+
|
|
4
|
+
return {
|
|
5
|
+
...commentPayload,
|
|
6
|
+
comments: comments.map(comment => {
|
|
7
|
+
if (comment.hasOwnProperty('myReactions')) return comment;
|
|
8
|
+
|
|
9
|
+
// Sometimes `myReactions` field will not come with BE response because that field is empty
|
|
10
|
+
// We need to put it with an empty array manually to make it show up in client side
|
|
11
|
+
return {
|
|
12
|
+
myReactions: [],
|
|
13
|
+
...comment,
|
|
14
|
+
};
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
};
|
|
@@ -23,6 +23,9 @@ const idResolvers: Resolvers = {
|
|
|
23
23
|
messagePreviewChannel: ({ channelId }) => `${channelId}`,
|
|
24
24
|
messagePreviewSubChannel: ({ subChannelId }) => `${subChannelId}`,
|
|
25
25
|
|
|
26
|
+
channelUnreadInfo: ({ channelId }) => channelId,
|
|
27
|
+
subChannelUnreadInfo: ({ subChannelId }) => subChannelId,
|
|
28
|
+
|
|
26
29
|
channelMarker: ({ entityId, userId }) => `${entityId}#${userId}`,
|
|
27
30
|
subChannelMarker: ({ entityId, feedId, userId }) => `${entityId}#${feedId}#${userId}`,
|
|
28
31
|
messageMarker: ({ feedId, contentId, creatorId }) => `${feedId}#${contentId}#${creatorId}`,
|
package/src/core/model/index.ts
CHANGED
|
@@ -20,6 +20,9 @@ export const PAYLOAD2MODEL: Record<string, Amity.Domain> = {
|
|
|
20
20
|
messagePreviewChannel: 'messagePreviewChannel',
|
|
21
21
|
messagePreviewSubChannel: 'messagePreviewSubChannel',
|
|
22
22
|
|
|
23
|
+
channelUnreadInfo: 'channelUnreadInfo',
|
|
24
|
+
subChannelUnreadInfo: 'subChannelUnreadInfo',
|
|
25
|
+
|
|
23
26
|
userEntityMarkers: 'channelMarker',
|
|
24
27
|
userFeedMarkers: 'subChannelMarker',
|
|
25
28
|
contentMarkers: 'messageMarker',
|
|
@@ -45,6 +45,14 @@ export const sortByFirstCreated: SortingFunc<{ createdAt: Date | number | string
|
|
|
45
45
|
{ createdAt: b },
|
|
46
46
|
) => new Date(a).valueOf() - new Date(b).valueOf();
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Sorting a story-collection by its localSortingDate
|
|
50
|
+
*/
|
|
51
|
+
export const sortByLocalSortingDate: SortingFunc<{
|
|
52
|
+
localSortingDate: Date | number | string;
|
|
53
|
+
}> = ({ localSortingDate: a }, { localSortingDate: b }) =>
|
|
54
|
+
new Date(b).getTime() - new Date(a).getTime();
|
|
55
|
+
|
|
48
56
|
/**
|
|
49
57
|
* Sorting a collection by its newest items
|
|
50
58
|
*/
|
package/src/core/subscription.ts
CHANGED
|
@@ -106,6 +106,12 @@ export const getMarkedMessageTopic = ({
|
|
|
106
106
|
return `${getNetworkId(user)}/marker/channel/${channelId}/message/${subChannelId}`;
|
|
107
107
|
};
|
|
108
108
|
|
|
109
|
+
export const getMarkerUserFeedTopic = () => {
|
|
110
|
+
const user = getActiveUser();
|
|
111
|
+
|
|
112
|
+
return `${getNetworkId(user)}/marker/user/${user._id}`;
|
|
113
|
+
};
|
|
114
|
+
|
|
109
115
|
/**
|
|
110
116
|
* @hidden
|
|
111
117
|
*
|