@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
package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.ts
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import hash from 'object-hash';
|
|
2
|
+
import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
|
|
3
|
+
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
4
|
+
import { LinkedObject } from '~/utils/linkedObject';
|
|
5
|
+
import { STORY_KEY_CACHE } from '~/storyRepository/constants';
|
|
6
|
+
import { sortByLocalSortingDate } from '~/core/query';
|
|
7
|
+
import { onStoryCreated, onStoryCreatedLocal } from '~/storyRepository/events/onStoryCreated';
|
|
8
|
+
import { onStoryUpdated, onStoryUpdatedLocal } from '~/storyRepository/events/onStoryUpdated';
|
|
9
|
+
import { onStoryDeleted, onStoryDeletedLocal } from '~/storyRepository/events/onStoryDeleted';
|
|
10
|
+
import { onStoryError } from '~/storyRepository/events/onStoryError';
|
|
11
|
+
import { GlobalStoryQueryStreamController } from './GlobalStoryQueryStreamController';
|
|
12
|
+
import { GlobalStoryPageController } from './GlobalStoryPageController';
|
|
13
|
+
|
|
14
|
+
type StoryTargetBySeenState = {
|
|
15
|
+
seen: Amity.StoryTarget[];
|
|
16
|
+
unseen: Amity.StoryTarget[];
|
|
17
|
+
unknown: Amity.StoryTarget[];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export class GlobalStoryLiveCollectionController extends LiveCollectionController<
|
|
21
|
+
'globalStoryFeed',
|
|
22
|
+
Amity.StoryGlobalQuery,
|
|
23
|
+
Amity.StoryTarget,
|
|
24
|
+
GlobalStoryPageController
|
|
25
|
+
> {
|
|
26
|
+
private queryStreamController: GlobalStoryQueryStreamController;
|
|
27
|
+
|
|
28
|
+
private query: Amity.StoryGlobalQuery;
|
|
29
|
+
|
|
30
|
+
constructor(
|
|
31
|
+
query: Amity.StoryGlobalQuery,
|
|
32
|
+
callback: Amity.LiveCollectionCallback<Amity.StoryTarget>,
|
|
33
|
+
) {
|
|
34
|
+
const queryStreamId = hash(query);
|
|
35
|
+
const cacheKey = [STORY_KEY_CACHE.STORY_GLOBAL_FEED, 'collection', queryStreamId];
|
|
36
|
+
const paginationController = new GlobalStoryPageController(query);
|
|
37
|
+
|
|
38
|
+
super(paginationController, queryStreamId, cacheKey, callback);
|
|
39
|
+
|
|
40
|
+
this.query = query;
|
|
41
|
+
|
|
42
|
+
this.queryStreamController = new GlobalStoryQueryStreamController(
|
|
43
|
+
this.query,
|
|
44
|
+
this.cacheKey,
|
|
45
|
+
this.notifyChange.bind(this),
|
|
46
|
+
paginationController,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
this.paginationController = paginationController;
|
|
50
|
+
this.callback = callback.bind(this);
|
|
51
|
+
this.loadPage(true);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
protected setup() {
|
|
55
|
+
const collection = pullFromCache<Amity.StoryTargetLiveCollectionCache>(this.cacheKey)?.data;
|
|
56
|
+
if (!collection) {
|
|
57
|
+
pushToCache(this.cacheKey, {
|
|
58
|
+
data: [],
|
|
59
|
+
params: {},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
protected persistModel(response: Amity.GlobalStoryFeedPayload) {
|
|
65
|
+
this.queryStreamController.saveToMainDB(response);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected persistQueryStream({
|
|
69
|
+
response,
|
|
70
|
+
direction,
|
|
71
|
+
refresh,
|
|
72
|
+
}: Amity.LiveCollectionPersistQueryStreamParams<'globalStoryFeed'>) {
|
|
73
|
+
this.queryStreamController.appendToQueryStream(response, direction, refresh);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
|
|
77
|
+
const collection = pullFromCache<Amity.StoryTargetLiveCollectionCache>(this.cacheKey)?.data;
|
|
78
|
+
if (!collection) return;
|
|
79
|
+
|
|
80
|
+
let data = collection.data
|
|
81
|
+
.map(
|
|
82
|
+
targetId =>
|
|
83
|
+
pullFromCache<Amity.RawStoryTarget>([STORY_KEY_CACHE.STORY_TARGET, 'get', targetId])!,
|
|
84
|
+
)
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.map(storyTarget => LinkedObject.storyTarget(storyTarget.data));
|
|
87
|
+
|
|
88
|
+
if (!this.shouldNotify(data) && origin === 'event') return;
|
|
89
|
+
|
|
90
|
+
data = this.applyFilter(data)
|
|
91
|
+
// Remove internal fields
|
|
92
|
+
.map(
|
|
93
|
+
({ localFilter, localLastExpires, localLastSeen, localSortingDate, ...rest }) => rest,
|
|
94
|
+
) as Amity.StoryTarget[];
|
|
95
|
+
|
|
96
|
+
this.callback({
|
|
97
|
+
onNextPage: () => this.loadPage(false, Amity.LiveCollectionPageDirection.NEXT),
|
|
98
|
+
data,
|
|
99
|
+
hasNextPage: !!this.paginationController.getNextToken(),
|
|
100
|
+
loading,
|
|
101
|
+
error,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private applyFilter(data: Amity.StoryTarget[]): Amity.StoryTarget[] {
|
|
106
|
+
if (this.query.seenState !== Amity.StorySeenQuery.SMART) {
|
|
107
|
+
return data
|
|
108
|
+
.filter(({ hasUnseen }) => {
|
|
109
|
+
if (this.query.seenState === Amity.StorySeenQuery.ALL) return true;
|
|
110
|
+
if (this.query.seenState === Amity.StorySeenQuery.SEEN && !hasUnseen) return true;
|
|
111
|
+
return this.query.seenState === Amity.StorySeenQuery.UNSEEN && hasUnseen;
|
|
112
|
+
})
|
|
113
|
+
.sort(sortByLocalSortingDate);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Smart Filter - Apply local sorting on each list of data
|
|
117
|
+
const result = data.reduce<StoryTargetBySeenState>(
|
|
118
|
+
(acc, storyTarget) => {
|
|
119
|
+
if (storyTarget.localFilter === Amity.StorySeenQuery.UNSEEN) {
|
|
120
|
+
acc.unseen.push(storyTarget);
|
|
121
|
+
} else if (storyTarget.localFilter === Amity.StorySeenQuery.SEEN) {
|
|
122
|
+
acc.seen.push(storyTarget);
|
|
123
|
+
} else {
|
|
124
|
+
acc.unknown.push(storyTarget);
|
|
125
|
+
}
|
|
126
|
+
return acc;
|
|
127
|
+
},
|
|
128
|
+
{ unseen: [], seen: [], unknown: [] },
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
const sortedUnknown = result.unknown.sort(sortByLocalSortingDate) || [];
|
|
132
|
+
const sortedUnseen = result.unseen.sort(sortByLocalSortingDate) || [];
|
|
133
|
+
const sortedSeen = result.seen.sort(sortByLocalSortingDate) || [];
|
|
134
|
+
|
|
135
|
+
// Merge all status and remove internal fields
|
|
136
|
+
return sortedUnknown.concat(sortedUnseen, sortedSeen);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
startSubscription() {
|
|
140
|
+
return this.queryStreamController.subscribeRTE([
|
|
141
|
+
{ fn: onStoryCreated, action: Amity.StoryActionType.OnCreate },
|
|
142
|
+
{ fn: onStoryUpdated, action: Amity.StoryActionType.OnUpdate },
|
|
143
|
+
{ fn: onStoryDeleted, action: Amity.StoryActionType.OnDelete },
|
|
144
|
+
|
|
145
|
+
{ fn: onStoryCreatedLocal, action: Amity.StoryActionType.OnCreate },
|
|
146
|
+
{ fn: onStoryUpdatedLocal, action: Amity.StoryActionType.OnUpdate },
|
|
147
|
+
{ fn: onStoryDeletedLocal, action: Amity.StoryActionType.OnDelete },
|
|
148
|
+
|
|
149
|
+
{ fn: onStoryError, action: Amity.StoryActionType.OnError },
|
|
150
|
+
]);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { PaginationController } from '~/core/liveCollection/PaginationController';
|
|
2
|
+
|
|
3
|
+
type GlobalStoryFeedResult = Amity.GlobalStoryFeedPayload & Amity.Pagination;
|
|
4
|
+
|
|
5
|
+
const mergeResult = (
|
|
6
|
+
resultA: GlobalStoryFeedResult,
|
|
7
|
+
resultB: GlobalStoryFeedResult,
|
|
8
|
+
): GlobalStoryFeedResult => {
|
|
9
|
+
return {
|
|
10
|
+
categories: resultA.categories.concat(resultB.categories),
|
|
11
|
+
communities: resultA.communities.concat(resultB.communities),
|
|
12
|
+
communityUsers: resultA.communityUsers.concat(resultB.communityUsers),
|
|
13
|
+
files: resultA.files.concat(resultB.files),
|
|
14
|
+
storyTargets: resultA.storyTargets.concat(resultB.storyTargets),
|
|
15
|
+
users: resultA.users.concat(resultB.users),
|
|
16
|
+
paging: resultB.paging,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const addFlagLocalFilter = (
|
|
21
|
+
payload: GlobalStoryFeedResult,
|
|
22
|
+
filter: Amity.StorySeenQuery,
|
|
23
|
+
): GlobalStoryFeedResult => {
|
|
24
|
+
return {
|
|
25
|
+
...payload,
|
|
26
|
+
storyTargets: payload.storyTargets.map(item => ({ ...item, localFilter: filter })) || [],
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export class GlobalStoryPageController extends PaginationController<
|
|
31
|
+
'globalStoryFeed',
|
|
32
|
+
Amity.LiveCollectionParams<Amity.StoryGlobalQuery>
|
|
33
|
+
> {
|
|
34
|
+
private smartFilterState = Amity.StorySeenQuery.UNSEEN;
|
|
35
|
+
|
|
36
|
+
async getRequest(
|
|
37
|
+
queryParams: Amity.LiveCollectionParams<Amity.StoryGlobalQuery>,
|
|
38
|
+
token: string | undefined,
|
|
39
|
+
) {
|
|
40
|
+
// Apply default values for parameters
|
|
41
|
+
const { limit = 10, seenState = Amity.StorySeenQuery.UNSEEN } = queryParams;
|
|
42
|
+
|
|
43
|
+
const result = await this.createRequest({
|
|
44
|
+
seenState: seenState === Amity.StorySeenQuery.SMART ? this.smartFilterState : seenState,
|
|
45
|
+
limit,
|
|
46
|
+
token,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Use Early return to reduce condition complexity
|
|
50
|
+
if (result.paging?.next) return result;
|
|
51
|
+
if (seenState !== Amity.StorySeenQuery.SMART) return result;
|
|
52
|
+
if (this.smartFilterState === Amity.StorySeenQuery.SEEN) return result;
|
|
53
|
+
|
|
54
|
+
this.smartFilterState = Amity.StorySeenQuery.SEEN;
|
|
55
|
+
const additionalResult = await this.createRequest({
|
|
56
|
+
seenState: this.smartFilterState,
|
|
57
|
+
limit,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return mergeResult(result, additionalResult);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async createRequest(params: { seenState: Amity.StorySeenQuery; limit: number; token?: string }) {
|
|
64
|
+
const { data: queryResponse } = await this.http.get<GlobalStoryFeedResult>(
|
|
65
|
+
'/api/v5/me/global-story-targets',
|
|
66
|
+
{
|
|
67
|
+
params,
|
|
68
|
+
},
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return addFlagLocalFilter(queryResponse, params.seenState);
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { QueryStreamController } from '~/core/liveCollection/QueryStreamController';
|
|
2
|
+
import { getActiveClient } from '~/client';
|
|
3
|
+
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
4
|
+
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
5
|
+
import { GlobalStoryPageController } from './GlobalStoryPageController';
|
|
6
|
+
|
|
7
|
+
const updateLocalList = (cacheKey: string[], targetIds: Amity.StoryTarget['targetId'][]) => {
|
|
8
|
+
const collection = pullFromCache<Amity.StoryLiveCollectionCache>(cacheKey)?.data;
|
|
9
|
+
const storyTargets = collection?.data ?? [];
|
|
10
|
+
|
|
11
|
+
pushToCache(cacheKey, {
|
|
12
|
+
...collection,
|
|
13
|
+
data: [...new Set([...storyTargets, ...targetIds])],
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export class GlobalStoryQueryStreamController extends QueryStreamController<
|
|
18
|
+
Amity.GlobalStoryFeedPayload,
|
|
19
|
+
Amity.LiveCollectionParams<Amity.StoryGlobalQuery>
|
|
20
|
+
> {
|
|
21
|
+
private notifyChange: (params: Amity.LiveCollectionNotifyParams) => void;
|
|
22
|
+
|
|
23
|
+
private preparePayload: (response: Amity.GlobalStoryFeedPayload) => Amity.GlobalStoryFeedPayload;
|
|
24
|
+
|
|
25
|
+
private paginationController: GlobalStoryPageController;
|
|
26
|
+
|
|
27
|
+
constructor(
|
|
28
|
+
query: Amity.LiveCollectionParams<Amity.StoryGlobalQuery>,
|
|
29
|
+
cacheKey: string[],
|
|
30
|
+
notifyChange: (params: Amity.LiveCollectionNotifyParams) => void,
|
|
31
|
+
paginationController: GlobalStoryPageController,
|
|
32
|
+
) {
|
|
33
|
+
super(query, cacheKey);
|
|
34
|
+
this.notifyChange = notifyChange;
|
|
35
|
+
this.paginationController = paginationController;
|
|
36
|
+
|
|
37
|
+
// Fix ESLint, "Expected 'this' to be used by class method"
|
|
38
|
+
this.preparePayload = payload => payload;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
saveToMainDB(response: Amity.GlobalStoryFeedPayload) {
|
|
42
|
+
const client = getActiveClient();
|
|
43
|
+
const cachedAt = client.cache && Date.now();
|
|
44
|
+
|
|
45
|
+
// Fix Eslint error for "Expected 'this' to be used by class method"
|
|
46
|
+
const data = this.preparePayload(response);
|
|
47
|
+
|
|
48
|
+
if (client.cache) {
|
|
49
|
+
ingestInCache(data, { cachedAt });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
appendToQueryStream(
|
|
54
|
+
response: Amity.GlobalStoryFeedPayload,
|
|
55
|
+
direction: Amity.LiveCollectionPageDirection,
|
|
56
|
+
refresh = false,
|
|
57
|
+
) {
|
|
58
|
+
if (refresh) {
|
|
59
|
+
pushToCache(this.cacheKey, {
|
|
60
|
+
data: response.storyTargets.map(({ targetId }) => targetId),
|
|
61
|
+
});
|
|
62
|
+
} else {
|
|
63
|
+
updateLocalList(
|
|
64
|
+
this.cacheKey,
|
|
65
|
+
response.storyTargets.map(({ targetId }) => targetId),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
reactor(actionType: Amity.StoryActionType) {
|
|
71
|
+
return (payload: Amity.InternalStory[]) => {
|
|
72
|
+
if (
|
|
73
|
+
actionType === Amity.StoryActionType.OnCreate &&
|
|
74
|
+
this.query.seenState !== Amity.StorySeenQuery.SEEN
|
|
75
|
+
) {
|
|
76
|
+
updateLocalList(
|
|
77
|
+
this.cacheKey,
|
|
78
|
+
payload.map(({ targetId }) => targetId),
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
this.notifyChange({ origin: Amity.LiveDataOrigin.EVENT, loading: false });
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
subscribeRTE(
|
|
87
|
+
createSubscriber: {
|
|
88
|
+
fn: (reactor: Amity.Listener<Amity.InternalStory[]>) => Amity.Unsubscriber;
|
|
89
|
+
action: Amity.StoryActionType;
|
|
90
|
+
}[],
|
|
91
|
+
) {
|
|
92
|
+
return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client';
|
|
2
|
+
import { ENABLE_CACHE_MESSAGE } from '~/utils/constants';
|
|
3
|
+
import { dropFromCache } from '~/cache/api';
|
|
4
|
+
import { GlobalStoryLiveCollectionController } from './GlobalStoryLiveCollectionController';
|
|
5
|
+
|
|
6
|
+
export const getGlobalStoryTargets = (
|
|
7
|
+
params: Amity.LiveCollectionParams<Amity.StoryGlobalQuery>,
|
|
8
|
+
callback: Amity.LiveCollectionCallback<Amity.StoryTarget>,
|
|
9
|
+
config?: Amity.LiveCollectionConfig,
|
|
10
|
+
) => {
|
|
11
|
+
const { log, cache, userId } = getActiveClient();
|
|
12
|
+
|
|
13
|
+
if (!cache) {
|
|
14
|
+
console.log(ENABLE_CACHE_MESSAGE);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const timestamp = Date.now();
|
|
18
|
+
log(`getGlobalStoryTarget(tmpid: ${timestamp}) > listen`);
|
|
19
|
+
|
|
20
|
+
const storyLiveCollection = new GlobalStoryLiveCollectionController(params, callback);
|
|
21
|
+
const disposers = storyLiveCollection.startSubscription();
|
|
22
|
+
const cacheKey = storyLiveCollection.getCacheKey();
|
|
23
|
+
|
|
24
|
+
disposers.push(() => {
|
|
25
|
+
dropFromCache(cacheKey);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return () => {
|
|
29
|
+
log(`getGlobalStoryTarget(tmpid: ${timestamp}) > dispose`);
|
|
30
|
+
disposers.forEach(fn => fn());
|
|
31
|
+
};
|
|
32
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getGlobalStoryTargets';
|
|
@@ -4,7 +4,7 @@ import { getActiveClient } from '~/client';
|
|
|
4
4
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
5
5
|
import { updateLocalLastStoryExpires } from '~/storyRepository/utils/updateLocalLastStoryExpires';
|
|
6
6
|
import { mappingStoryIdToReferenceId } from '~/storyRepository/utils/mappingStoryIdToReferenceId';
|
|
7
|
-
import {
|
|
7
|
+
import { convertRawStoryToInternal } from '~/storyRepository/utils/convertRawToStory';
|
|
8
8
|
import { StoryPaginationNoPageController } from './StoryPaginationNoPageController';
|
|
9
9
|
|
|
10
10
|
export class StoryQueryStreamController extends QueryStreamController<
|
|
@@ -31,7 +31,7 @@ export class StoryQueryStreamController extends QueryStreamController<
|
|
|
31
31
|
const client = getActiveClient();
|
|
32
32
|
const cachedAt = client.cache && Date.now();
|
|
33
33
|
|
|
34
|
-
const convertedData: Amity.StoryPayload =
|
|
34
|
+
const convertedData: Amity.StoryPayload = convertRawStoryToInternal(response);
|
|
35
35
|
|
|
36
36
|
if (client.cache) {
|
|
37
37
|
ingestInCache(convertedData, { cachedAt });
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { pullFromCache, queryCache } from '~/cache/api';
|
|
2
|
+
import { STORY_KEY_CACHE } from '~/storyRepository/constants';
|
|
3
|
+
|
|
4
|
+
export class StoryComputedValue {
|
|
5
|
+
private readonly _targetId: string;
|
|
6
|
+
|
|
7
|
+
private readonly _lastStoryExpiresAt?: Amity.timestamp;
|
|
8
|
+
|
|
9
|
+
private readonly _lastStorySeenExpiresAt?: Amity.timestamp;
|
|
10
|
+
|
|
11
|
+
private cacheStoryExpireTime?: Amity.Cached<Amity.timestamp>;
|
|
12
|
+
|
|
13
|
+
private cacheStoreSeenTime?: Amity.Cached<Amity.timestamp>;
|
|
14
|
+
|
|
15
|
+
private _syncingStoriesCount = 0;
|
|
16
|
+
|
|
17
|
+
private _errorStoriesCount = 0;
|
|
18
|
+
|
|
19
|
+
constructor(
|
|
20
|
+
targetId: string,
|
|
21
|
+
lastStoryExpiresAt?: Amity.timestamp,
|
|
22
|
+
lastStorySeenExpiresAt?: Amity.timestamp,
|
|
23
|
+
) {
|
|
24
|
+
this._targetId = targetId;
|
|
25
|
+
|
|
26
|
+
this._lastStoryExpiresAt = lastStoryExpiresAt;
|
|
27
|
+
|
|
28
|
+
this._lastStorySeenExpiresAt = lastStorySeenExpiresAt;
|
|
29
|
+
|
|
30
|
+
this.cacheStoryExpireTime = pullFromCache<Amity.timestamp>([
|
|
31
|
+
STORY_KEY_CACHE.EXPIRE,
|
|
32
|
+
this._targetId,
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
this.cacheStoreSeenTime = pullFromCache<Amity.timestamp>([
|
|
36
|
+
STORY_KEY_CACHE.LAST_SEEN,
|
|
37
|
+
this._targetId,
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
this.getTotalStoryByStatus();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get lastStoryExpiresAt(): number {
|
|
44
|
+
return this._lastStoryExpiresAt ? new Date(this._lastStoryExpiresAt).getTime() : 0;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
get lastStorySeenExpiresAt(): number {
|
|
48
|
+
return this._lastStorySeenExpiresAt ? new Date(this._lastStorySeenExpiresAt).getTime() : 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get localLastStoryExpires(): number {
|
|
52
|
+
return this.cacheStoryExpireTime?.data
|
|
53
|
+
? new Date(this.cacheStoryExpireTime?.data).getTime()
|
|
54
|
+
: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get localLastStorySeenExpiresAt(): number {
|
|
58
|
+
return this.cacheStoreSeenTime?.data ? new Date(this.cacheStoreSeenTime?.data).getTime() : 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get isContainUnSyncedStory(): boolean {
|
|
62
|
+
const currentSyncingState = pullFromCache<Amity.SyncState>([
|
|
63
|
+
STORY_KEY_CACHE.SYNC_STATE,
|
|
64
|
+
this._targetId,
|
|
65
|
+
]);
|
|
66
|
+
|
|
67
|
+
if (!currentSyncingState?.data) return false;
|
|
68
|
+
|
|
69
|
+
return [Amity.SyncState.Syncing, Amity.SyncState.Error].includes(currentSyncingState.data);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
getLocalLastSortingDate(): number {
|
|
73
|
+
if (this.isContainUnSyncedStory) {
|
|
74
|
+
return this.localLastStoryExpires;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return this.lastStoryExpiresAt;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
getHasUnseenFlag(): boolean {
|
|
81
|
+
const now = new Date().getTime();
|
|
82
|
+
|
|
83
|
+
const highestSeen = Math.max(this.lastStorySeenExpiresAt, this.localLastStorySeenExpiresAt);
|
|
84
|
+
|
|
85
|
+
const currentSyncingState = pullFromCache<Amity.SyncState>([
|
|
86
|
+
STORY_KEY_CACHE.SYNC_STATE,
|
|
87
|
+
this._targetId,
|
|
88
|
+
]);
|
|
89
|
+
|
|
90
|
+
if (this.isContainUnSyncedStory) {
|
|
91
|
+
return this.localLastStoryExpires > now && this.localLastStoryExpires > highestSeen;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return this.lastStoryExpiresAt > now && this.lastStoryExpiresAt > highestSeen;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
getTotalStoryByStatus(): void {
|
|
98
|
+
const stories = queryCache<Amity.InternalStory>([STORY_KEY_CACHE.STORY, 'get']);
|
|
99
|
+
|
|
100
|
+
if (!stories) {
|
|
101
|
+
this._errorStoriesCount = 0;
|
|
102
|
+
this._syncingStoriesCount = 0;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const groupByType = stories.reduce(
|
|
107
|
+
(acc, story) => {
|
|
108
|
+
const {
|
|
109
|
+
data: { targetId, syncState },
|
|
110
|
+
} = story;
|
|
111
|
+
|
|
112
|
+
if (targetId === this._targetId) {
|
|
113
|
+
acc[syncState!] += 1;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return acc;
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
syncing: 0,
|
|
120
|
+
error: 0,
|
|
121
|
+
synced: 0,
|
|
122
|
+
},
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
this._errorStoriesCount = groupByType.error;
|
|
126
|
+
this._syncingStoriesCount = groupByType.syncing;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
get syncingStoriesCount(): number {
|
|
130
|
+
return this._syncingStoriesCount;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
get failedStoriesCount(): number {
|
|
134
|
+
return this._errorStoriesCount;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
// Due to we have optimistic logic, we will use referenceId as a id in SDK instead of storyId
|
|
2
2
|
|
|
3
|
-
export const
|
|
3
|
+
export const applyMissingField = (
|
|
4
|
+
rawData: Amity.RawStory,
|
|
5
|
+
isCreated = false,
|
|
6
|
+
): Amity.InternalStory => {
|
|
4
7
|
const { storyId, referenceId } = rawData;
|
|
5
8
|
|
|
6
|
-
if (
|
|
9
|
+
if (!isCreated) {
|
|
10
|
+
if (referenceId) return { ...rawData, syncState: Amity.SyncState.Synced };
|
|
11
|
+
}
|
|
12
|
+
|
|
7
13
|
return { ...rawData, syncState: Amity.SyncState.Synced, referenceId: storyId };
|
|
8
14
|
};
|
|
9
15
|
|
|
10
|
-
export const
|
|
16
|
+
export const convertRawStoryToInternal = (
|
|
11
17
|
data: Amity.StoryPayload,
|
|
18
|
+
isCreated = false,
|
|
12
19
|
): Amity.StoryWithOptimisticPayload => {
|
|
13
20
|
const { stories } = data;
|
|
14
|
-
const storiesData = stories.map(
|
|
21
|
+
const storiesData = stories.map(story => applyMissingField(story, isCreated));
|
|
15
22
|
return { ...data, stories: storiesData };
|
|
16
23
|
};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { getActiveClient } from '~/client';
|
|
2
2
|
import { YEAR } from '~/utils/constants';
|
|
3
|
+
import { pullFromCache } from '~/cache/api';
|
|
4
|
+
import { STORY_KEY_CACHE } from '~/storyRepository/constants';
|
|
5
|
+
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
3
6
|
|
|
4
7
|
export const convertStoryPayloadToRaw = (
|
|
5
8
|
payload: Amity.StoryCreatePayload,
|
|
@@ -8,6 +11,26 @@ export const convertStoryPayloadToRaw = (
|
|
|
8
11
|
|
|
9
12
|
const now = new Date();
|
|
10
13
|
const expiresAt = now.getTime() + YEAR;
|
|
14
|
+
const expiresAtDate = new Date(expiresAt).toISOString();
|
|
15
|
+
|
|
16
|
+
let storyTarget = pullFromCache<Amity.RawStoryTarget>([
|
|
17
|
+
STORY_KEY_CACHE.STORY_TARGET,
|
|
18
|
+
'get',
|
|
19
|
+
payload.targetId,
|
|
20
|
+
])?.data;
|
|
21
|
+
|
|
22
|
+
if (!storyTarget) {
|
|
23
|
+
// Save mock story target to cache
|
|
24
|
+
storyTarget = {
|
|
25
|
+
targetType: payload.targetType,
|
|
26
|
+
targetId: payload.targetId,
|
|
27
|
+
lastStoryExpiresAt: expiresAtDate,
|
|
28
|
+
targetPublicId: payload.targetId,
|
|
29
|
+
targetUpdatedAt: now.toISOString(),
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
ingestInCache({ storyTargets: [storyTarget] });
|
|
33
|
+
}
|
|
11
34
|
|
|
12
35
|
return {
|
|
13
36
|
stories: [
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api/activeClient';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* Mark subChannel as read by readToSegment
|
|
6
|
+
*
|
|
7
|
+
* @param subChannelIds the IDs of the {@link Amity.SubChannel} to update
|
|
8
|
+
* @param readToSegment the segment to mark as read
|
|
9
|
+
* @returns a success boolean if the {@link Amity.SubChannel} was updated
|
|
10
|
+
*
|
|
11
|
+
* @category Channel API
|
|
12
|
+
* @async
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export const markAsReadBySegment = async ({
|
|
16
|
+
subChannelId,
|
|
17
|
+
readToSegment,
|
|
18
|
+
}: {
|
|
19
|
+
subChannelId: Amity.SubChannel['subChannelId'];
|
|
20
|
+
readToSegment: number;
|
|
21
|
+
}): Promise<boolean> => {
|
|
22
|
+
const client = getActiveClient();
|
|
23
|
+
client.log('subChannel/markAsReadBySegment', subChannelId);
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
await client.http.put<Amity.MarkAsReadPayload>(
|
|
27
|
+
`/api/v1/markers/message-feeds/${subChannelId}/mark-read`,
|
|
28
|
+
{ readToSegment },
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
return true;
|
|
32
|
+
} catch (e) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
2
2
|
import { getActiveClient } from '~/client/api/activeClient';
|
|
3
3
|
import { fireEvent } from '~/core/events';
|
|
4
|
-
import {
|
|
5
|
-
convertChannelMarkerResponse,
|
|
6
|
-
convertSubChannelMarkerResponse,
|
|
7
|
-
convertUserMarkerResponse,
|
|
8
|
-
} from '~/utils/marker';
|
|
4
|
+
import { convertChannelMarkerResponse, convertSubChannelMarkerResponse } from '~/utils/marker';
|
|
9
5
|
|
|
10
6
|
/**
|
|
11
7
|
* ```js
|
|
@@ -37,10 +33,9 @@ export const readingAPI = async (
|
|
|
37
33
|
userEntityMarkers: userEntityMarkersPayload,
|
|
38
34
|
userFeedMarkers: userFeedMarkersPayload,
|
|
39
35
|
feedMarkers,
|
|
40
|
-
userMarkers
|
|
36
|
+
userMarkers,
|
|
41
37
|
} = payload;
|
|
42
38
|
|
|
43
|
-
const userMarkers = convertUserMarkerResponse(userMarkersPayload);
|
|
44
39
|
const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
|
|
45
40
|
const userFeedMarkers = convertSubChannelMarkerResponse(userFeedMarkersPayload);
|
|
46
41
|
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
2
2
|
import { getActiveClient } from '~/client/api/activeClient';
|
|
3
3
|
import { fireEvent } from '~/core/events';
|
|
4
|
-
import {
|
|
5
|
-
convertChannelMarkerResponse,
|
|
6
|
-
convertSubChannelMarkerResponse,
|
|
7
|
-
convertUserMarkerResponse,
|
|
8
|
-
} from '~/utils/marker';
|
|
4
|
+
import { convertChannelMarkerResponse, convertSubChannelMarkerResponse } from '~/utils/marker';
|
|
9
5
|
|
|
10
6
|
/**
|
|
11
7
|
* ```js
|
|
@@ -36,10 +32,9 @@ export const startReadingAPI = async (
|
|
|
36
32
|
userEntityMarkers: userEntityMarkersPayload,
|
|
37
33
|
userFeedMarkers: userFeedMarkersPayload,
|
|
38
34
|
feedMarkers,
|
|
39
|
-
userMarkers
|
|
35
|
+
userMarkers,
|
|
40
36
|
} = payload;
|
|
41
37
|
|
|
42
|
-
const userMarkers = convertUserMarkerResponse(userMarkersPayload);
|
|
43
38
|
const userEntityMarkers = convertChannelMarkerResponse(userEntityMarkersPayload);
|
|
44
39
|
const userFeedMarkers = convertSubChannelMarkerResponse(userFeedMarkersPayload);
|
|
45
40
|
|