@amityco/ts-sdk 0.0.1-e26de88.0 → 0.0.1-e556efe.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/.eslintrc.json +13 -10
- package/dist/@types/core/events.d.ts +15 -10
- package/dist/@types/core/events.d.ts.map +1 -1
- package/dist/@types/core/live.d.ts +23 -0
- package/dist/@types/core/live.d.ts.map +1 -0
- package/dist/@types/core/model.d.ts +6 -0
- package/dist/@types/core/model.d.ts.map +1 -1
- package/dist/@types/core/paging.d.ts +1 -1
- package/dist/@types/core/paging.d.ts.map +1 -1
- package/dist/@types/core/payload.d.ts +15 -6
- package/dist/@types/core/payload.d.ts.map +1 -1
- package/dist/@types/domains/channel.d.ts +1 -2
- package/dist/@types/domains/channel.d.ts.map +1 -1
- package/dist/@types/domains/comment.d.ts +15 -0
- package/dist/@types/domains/comment.d.ts.map +1 -1
- package/dist/@types/domains/content.d.ts +5 -2
- package/dist/@types/domains/content.d.ts.map +1 -1
- package/dist/@types/domains/follow.d.ts +2 -1
- package/dist/@types/domains/follow.d.ts.map +1 -1
- package/dist/@types/domains/message.d.ts +5 -2
- package/dist/@types/domains/message.d.ts.map +1 -1
- package/dist/@types/domains/poll.d.ts +27 -0
- package/dist/@types/domains/poll.d.ts.map +1 -0
- package/dist/@types/domains/post.d.ts +18 -1
- package/dist/@types/domains/post.d.ts.map +1 -1
- package/dist/@types/domains/reaction.d.ts +18 -8
- package/dist/@types/domains/reaction.d.ts.map +1 -1
- package/dist/@types/domains/user.d.ts +2 -1
- package/dist/@types/domains/user.d.ts.map +1 -1
- package/dist/@types/index.d.ts +2 -0
- package/dist/@types/index.d.ts.map +1 -1
- package/dist/cache/api/ingestInCache.d.ts +1 -1
- package/dist/cache/api/ingestInCache.d.ts.map +1 -1
- package/dist/cache/api/mergeInCache.d.ts +1 -1
- package/dist/cache/api/mergeInCache.d.ts.map +1 -1
- package/dist/category/api/getCategory.d.ts +18 -2
- package/dist/category/api/getCategory.d.ts.map +1 -1
- package/dist/category/api/queryCategories.d.ts +23 -11
- package/dist/category/api/queryCategories.d.ts.map +1 -1
- package/dist/channel/api/addChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/banChannelMembers.d.ts +16 -0
- package/dist/channel/api/banChannelMembers.d.ts.map +1 -0
- package/dist/channel/api/deleteChannel.d.ts.map +1 -1
- package/dist/channel/api/index.d.ts +2 -0
- package/dist/channel/api/index.d.ts.map +1 -1
- package/dist/channel/api/queryChannelMembers.d.ts +2 -1
- package/dist/channel/api/queryChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/queryChannels.d.ts +9 -6
- package/dist/channel/api/queryChannels.d.ts.map +1 -1
- package/dist/channel/api/removeChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/unbanChannelMembers.d.ts +16 -0
- package/dist/channel/api/unbanChannelMembers.d.ts.map +1 -0
- package/dist/channel/api/updateChannel.d.ts +1 -1
- package/dist/channel/api/updateChannel.d.ts.map +1 -1
- package/dist/channel/events/index.d.ts +2 -2
- package/dist/channel/events/index.d.ts.map +1 -1
- package/dist/channel/events/onChannelMemberAdded.d.ts +17 -0
- package/dist/channel/events/onChannelMemberAdded.d.ts.map +1 -0
- package/dist/channel/events/onChannelMemberRemoved.d.ts +17 -0
- package/dist/channel/events/onChannelMemberRemoved.d.ts.map +1 -0
- package/dist/channel/observers/observeChannel.d.ts.map +1 -1
- package/dist/client/api/connectClient.d.ts +7 -4
- package/dist/client/api/connectClient.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts +1 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/comment/api/queryComments.d.ts +1 -8
- package/dist/comment/api/queryComments.d.ts.map +1 -1
- package/dist/comment/observers/index.d.ts +1 -0
- package/dist/comment/observers/index.d.ts.map +1 -1
- package/dist/comment/observers/liveComments.d.ts +22 -0
- package/dist/comment/observers/liveComments.d.ts.map +1 -0
- package/dist/comment/observers/observeComments.d.ts.map +1 -1
- package/dist/community/api/addCommunityMembersRoles.d.ts +18 -0
- package/dist/community/api/addCommunityMembersRoles.d.ts.map +1 -0
- package/dist/community/api/getRecommendedCommunities.d.ts +1 -1
- package/dist/community/api/getRecommendedCommunities.d.ts.map +1 -1
- package/dist/community/api/getTopTrendingCommunities.d.ts +1 -1
- package/dist/community/api/getTopTrendingCommunities.d.ts.map +1 -1
- package/dist/community/api/index.d.ts +2 -2
- package/dist/community/api/index.d.ts.map +1 -1
- package/dist/community/api/queryCommunities.d.ts +7 -7
- package/dist/community/api/queryCommunities.d.ts.map +1 -1
- package/dist/community/api/removeCommunityMembersRoles.d.ts +18 -0
- package/dist/community/api/removeCommunityMembersRoles.d.ts.map +1 -0
- package/dist/core/debug.d.ts +1 -1
- package/dist/core/debug.d.ts.map +1 -1
- 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/identifyModel.d.ts +1 -0
- package/dist/core/model/identifyModel.d.ts.map +1 -1
- package/dist/core/model/index.d.ts.map +1 -1
- package/dist/core/query/paging.d.ts +2 -2
- package/dist/core/query/paging.d.ts.map +1 -1
- package/dist/core/query/query.d.ts +1 -1
- package/dist/core/query/query.d.ts.map +1 -1
- package/dist/core/subscription.d.ts +2 -0
- package/dist/core/subscription.d.ts.map +1 -1
- package/dist/core/tests/query/filtering.test.d.ts +2 -0
- package/dist/core/tests/query/filtering.test.d.ts.map +1 -0
- package/dist/core/tests/query/query.test.d.ts +2 -0
- package/dist/core/tests/query/query.test.d.ts.map +1 -0
- package/dist/core/transports/ws.d.ts +1 -1
- package/dist/core/transports/ws.d.ts.map +1 -1
- package/dist/external/api/createUserToken.d.ts +23 -0
- package/dist/external/api/createUserToken.d.ts.map +1 -0
- package/dist/external/api/index.d.ts +2 -0
- package/dist/external/api/index.d.ts.map +1 -0
- package/dist/feed/api/queryGlobalFeed.d.ts +4 -4
- package/dist/feed/api/queryGlobalFeed.d.ts.map +1 -1
- package/dist/file/api/createFile.d.ts +2 -1
- package/dist/file/api/createFile.d.ts.map +1 -1
- package/dist/file/api/createImage.d.ts +17 -0
- package/dist/file/api/createImage.d.ts.map +1 -0
- package/dist/file/api/createVideo.d.ts +1 -0
- package/dist/file/api/createVideo.d.ts.map +1 -1
- package/dist/file/api/getFile.d.ts +1 -1
- package/dist/file/api/index.d.ts +1 -0
- package/dist/file/api/index.d.ts.map +1 -1
- package/dist/follow/api/follow.d.ts.map +1 -1
- package/dist/follow/api/getFollowInfo.d.ts.map +1 -1
- package/dist/follow/api/queryFollowers.d.ts +4 -4
- package/dist/follow/api/queryFollowers.d.ts.map +1 -1
- package/dist/follow/api/queryFollowings.d.ts +4 -4
- package/dist/follow/api/queryFollowings.d.ts.map +1 -1
- package/dist/follow/api/utils.d.ts +4 -4
- package/dist/follow/api/utils.d.ts.map +1 -1
- package/dist/follow/events/utils.d.ts.map +1 -1
- package/dist/index.cjs.js +20229 -14222
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +20194 -14213
- package/dist/index.umd.js +4 -19
- package/dist/message/api/createMessage.d.ts +2 -2
- package/dist/message/api/createMessage.d.ts.map +1 -1
- package/dist/message/api/updateMessage.d.ts +2 -2
- package/dist/message/api/updateMessage.d.ts.map +1 -1
- package/dist/message/events/onMessageUpdated.d.ts.map +1 -1
- package/dist/poll/api/closePoll.d.ts +16 -0
- package/dist/poll/api/closePoll.d.ts.map +1 -0
- package/dist/poll/api/createPoll.d.ts +25 -0
- package/dist/poll/api/createPoll.d.ts.map +1 -0
- package/dist/poll/api/deletePoll.d.ts +16 -0
- package/dist/poll/api/deletePoll.d.ts.map +1 -0
- package/dist/poll/api/getPoll.d.ts +32 -0
- package/dist/poll/api/getPoll.d.ts.map +1 -0
- package/dist/poll/api/index.d.ts +6 -0
- package/dist/poll/api/index.d.ts.map +1 -0
- package/dist/poll/api/votePoll.d.ts +17 -0
- package/dist/poll/api/votePoll.d.ts.map +1 -0
- package/dist/poll/events/index.d.ts +3 -0
- package/dist/poll/events/index.d.ts.map +1 -0
- package/dist/poll/events/onPollDeleted.d.ts +17 -0
- package/dist/poll/events/onPollDeleted.d.ts.map +1 -0
- package/dist/poll/events/onPollUpdated.d.ts +17 -0
- package/dist/poll/events/onPollUpdated.d.ts.map +1 -0
- package/dist/poll/observers/index.d.ts +2 -0
- package/dist/poll/observers/index.d.ts.map +1 -0
- package/dist/poll/observers/observePoll.d.ts +18 -0
- package/dist/poll/observers/observePoll.d.ts.map +1 -0
- package/dist/post/api/approvePost.d.ts +17 -0
- package/dist/post/api/approvePost.d.ts.map +1 -0
- package/dist/post/api/declinePost.d.ts +17 -0
- package/dist/post/api/declinePost.d.ts.map +1 -0
- package/dist/post/api/getPost.d.ts +1 -1
- package/dist/post/api/index.d.ts +2 -0
- package/dist/post/api/index.d.ts.map +1 -1
- package/dist/post/api/queryPosts.d.ts +1 -12
- package/dist/post/api/queryPosts.d.ts.map +1 -1
- package/dist/post/observers/index.d.ts +1 -0
- package/dist/post/observers/index.d.ts.map +1 -1
- package/dist/post/observers/livePosts.d.ts +22 -0
- package/dist/post/observers/livePosts.d.ts.map +1 -0
- package/dist/post/observers/observePosts.d.ts.map +1 -1
- package/dist/post/tests/api/getPost.test.d.ts +2 -0
- package/dist/post/tests/api/getPost.test.d.ts.map +1 -0
- package/dist/post/tests/api/queryPosts.test.d.ts +2 -0
- package/dist/post/tests/api/queryPosts.test.d.ts.map +1 -0
- package/dist/reaction/api/index.d.ts +1 -0
- package/dist/reaction/api/index.d.ts.map +1 -1
- package/dist/reaction/api/queryReactions.d.ts +19 -0
- package/dist/reaction/api/queryReactions.d.ts.map +1 -0
- package/dist/reaction/events/index.d.ts +3 -0
- package/dist/reaction/events/index.d.ts.map +1 -1
- package/dist/reaction/events/onReactionAdded.d.ts.map +1 -1
- package/dist/reaction/events/onReactorAdded.d.ts +19 -0
- package/dist/reaction/events/onReactorAdded.d.ts.map +1 -0
- package/dist/reaction/events/onReactorRemoved.d.ts +19 -0
- package/dist/reaction/events/onReactorRemoved.d.ts.map +1 -0
- package/dist/reaction/observers/index.d.ts +2 -0
- package/dist/reaction/observers/index.d.ts.map +1 -0
- package/dist/reaction/observers/liveReactions.d.ts +22 -0
- package/dist/reaction/observers/liveReactions.d.ts.map +1 -0
- package/dist/reaction/utils/index.d.ts +1 -0
- package/dist/reaction/utils/index.d.ts.map +1 -1
- package/dist/reaction/utils/prepareMessagePayloadForCache.d.ts +3 -0
- package/dist/reaction/utils/prepareMessagePayloadForCache.d.ts.map +1 -0
- package/dist/report/api/createReport.d.ts.map +1 -1
- package/dist/report/api/deleteReport.d.ts.map +1 -1
- package/dist/role/api/queryRoles.d.ts +4 -4
- package/dist/role/api/queryRoles.d.ts.map +1 -1
- package/dist/stream/api/queryStreams.d.ts +6 -6
- package/dist/stream/api/queryStreams.d.ts.map +1 -1
- package/dist/user/api/updateUser.d.ts +1 -1
- package/dist/user/api/updateUser.d.ts.map +1 -1
- package/dist/user/events/index.d.ts +1 -0
- package/dist/user/events/index.d.ts.map +1 -1
- package/dist/user/events/onUserDeleted.d.ts +17 -0
- package/dist/user/events/onUserDeleted.d.ts.map +1 -0
- package/dist/user/observers/observeUser.d.ts +1 -1
- package/dist/user/observers/observeUser.d.ts.map +1 -1
- package/dist/utils/constants.d.ts +3 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/tests/client.d.ts +3 -0
- package/dist/utils/tests/client.d.ts.map +1 -0
- package/dist/utils/tests/dummy.d.ts +8 -0
- package/dist/utils/tests/dummy.d.ts.map +1 -0
- package/dist/utils/tests/index.d.ts +3 -0
- package/dist/utils/tests/index.d.ts.map +1 -0
- package/jest.config.ts +15 -0
- package/package.json +22 -17
- package/src/@types/core/events.ts +16 -10
- package/src/@types/core/live.ts +28 -0
- package/src/@types/core/model.ts +6 -0
- package/src/@types/core/paging.ts +1 -1
- package/src/@types/core/payload.ts +19 -7
- package/src/@types/domains/channel.ts +1 -2
- package/src/@types/domains/comment.ts +32 -0
- package/src/@types/domains/content.ts +7 -1
- package/src/@types/domains/follow.ts +3 -1
- package/src/@types/domains/message.ts +11 -1
- package/src/@types/domains/poll.ts +32 -0
- package/src/@types/domains/post.ts +38 -1
- package/src/@types/domains/reaction.ts +26 -9
- package/src/@types/domains/user.ts +2 -0
- package/src/@types/index.ts +3 -0
- package/src/category/api/getCategory.ts +45 -7
- package/src/category/api/queryCategories.ts +70 -13
- package/src/channel/api/addChannelMembers.ts +2 -1
- package/src/channel/api/banChannelMembers.ts +41 -0
- package/src/channel/api/deleteChannel.ts +0 -1
- package/src/channel/api/index.ts +3 -0
- package/src/channel/api/queryChannelMembers.ts +4 -4
- package/src/channel/api/queryChannels.ts +3 -0
- package/src/channel/api/removeChannelMembers.ts +2 -1
- package/src/channel/api/unbanChannelMembers.ts +41 -0
- package/src/channel/api/updateChannel.ts +1 -1
- package/src/channel/events/index.ts +2 -2
- package/src/channel/events/{onMemberAdded.ts → onChannelMemberAdded.ts} +8 -6
- package/src/channel/events/{onMemberRemoved.ts → onChannelMemberRemoved.ts} +13 -6
- package/src/channel/observers/observeChannel.ts +8 -4
- package/src/client/api/connectClient.ts +28 -16
- package/src/comment/api/queryComments.ts +8 -11
- package/src/comment/observers/index.ts +1 -0
- package/src/comment/observers/liveComments.ts +172 -0
- package/src/comment/observers/observeComments.ts +1 -11
- package/src/community/api/{addCommunityMembersRole.ts → addCommunityMembersRoles.ts} +11 -10
- package/src/community/api/index.ts +2 -3
- package/src/community/api/{removeCommunityMembersRole.ts → removeCommunityMembersRoles.ts} +11 -10
- package/src/core/model/idResolvers.ts +3 -0
- package/src/core/model/identifyModel.ts +21 -0
- package/src/core/model/index.ts +3 -0
- package/src/core/query/paging.ts +3 -3
- package/src/core/query/query.ts +32 -1
- package/src/core/subscription.ts +17 -4
- package/src/core/tests/query/filtering.test.ts +11 -0
- package/src/core/tests/query/query.test.ts +19 -0
- package/src/external/api/createUserToken.ts +43 -0
- package/src/external/api/index.ts +1 -0
- package/src/file/api/createFile.ts +6 -5
- package/src/file/api/createImage.ts +58 -0
- package/src/file/api/createVideo.ts +23 -18
- package/src/file/api/getFile.ts +1 -1
- package/src/file/api/index.ts +1 -0
- package/src/follow/api/acceptFollower.ts +1 -1
- package/src/follow/api/declineFollower.ts +1 -1
- package/src/follow/api/follow.ts +1 -4
- package/src/follow/api/getFollowInfo.ts +8 -5
- package/src/follow/api/queryFollowers.ts +5 -4
- package/src/follow/api/queryFollowings.ts +5 -4
- package/src/follow/api/unfollow.ts +1 -1
- package/src/follow/api/utils.ts +10 -10
- package/src/follow/events/utils.ts +9 -6
- package/src/index.ts +10 -0
- package/src/message/api/createMessage.ts +30 -8
- package/src/message/api/updateMessage.ts +2 -2
- package/src/message/events/onMessageUpdated.ts +9 -1
- package/src/poll/api/closePoll.ts +42 -0
- package/src/poll/api/createPoll.ts +45 -0
- package/src/poll/api/deletePoll.ts +39 -0
- package/src/poll/api/getPoll.ts +64 -0
- package/src/poll/api/index.ts +7 -0
- package/src/poll/api/votePoll.ts +44 -0
- package/src/poll/events/index.ts +2 -0
- package/src/poll/events/onPollDeleted.ts +31 -0
- package/src/poll/events/onPollUpdated.ts +31 -0
- package/src/poll/observers/index.ts +1 -0
- package/src/poll/observers/observePoll.ts +67 -0
- package/src/post/api/approvePost.ts +48 -0
- package/src/post/api/declinePost.ts +48 -0
- package/src/post/api/getPost.ts +1 -1
- package/src/post/api/index.ts +3 -0
- package/src/post/api/queryPosts.ts +3 -12
- package/src/post/observers/index.ts +1 -0
- package/src/post/observers/livePosts.ts +170 -0
- package/src/post/observers/observePosts.ts +1 -13
- package/src/post/tests/api/getPost.test.ts +88 -0
- package/src/post/tests/api/queryPosts.test.ts +23 -0
- package/src/reaction/api/index.ts +1 -0
- package/src/reaction/api/queryReactions.ts +52 -0
- package/src/reaction/events/index.ts +4 -0
- package/src/reaction/events/onReactionAdded.ts +4 -0
- package/src/reaction/events/onReactorAdded.ts +80 -0
- package/src/reaction/events/onReactorRemoved.ts +85 -0
- package/src/reaction/observers/index.ts +1 -0
- package/src/reaction/observers/liveReactions.ts +142 -0
- package/src/reaction/utils/index.ts +1 -0
- package/src/reaction/utils/prepareMessagePayloadForCache.ts +40 -0
- package/src/report/api/createReport.ts +7 -1
- package/src/report/api/deleteReport.ts +7 -1
- package/src/user/api/updateUser.ts +4 -1
- package/src/user/events/index.ts +1 -0
- package/src/user/events/onUserDeleted.ts +19 -0
- package/src/user/events/utils.ts +1 -1
- package/src/user/observers/observeUser.ts +9 -2
- package/src/utils/constants.ts +2 -0
- package/src/utils/env.ts +3 -1
- package/src/utils/tests/client.ts +5 -0
- package/src/utils/tests/dummy.ts +7 -0
- package/src/utils/tests/index.ts +2 -0
- package/tsconfig.json +23 -22
- package/dist/channel/events/onMemberAdded.d.ts +0 -17
- package/dist/channel/events/onMemberAdded.d.ts.map +0 -1
- package/dist/channel/events/onMemberRemoved.d.ts +0 -17
- package/dist/channel/events/onMemberRemoved.d.ts.map +0 -1
- package/dist/community/api/addCommunityMembersRole.d.ts +0 -18
- package/dist/community/api/addCommunityMembersRole.d.ts.map +0 -1
- package/dist/community/api/removeCommunityMembersRole.d.ts +0 -18
- package/dist/community/api/removeCommunityMembersRole.d.ts.map +0 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
import { getResolver } from '~/core/model';
|
|
3
|
+
import { getActiveClient } from '~/client/api';
|
|
4
|
+
import { pushToCache, pullFromCache } from '~/cache/api';
|
|
5
|
+
import {
|
|
6
|
+
createQuery,
|
|
7
|
+
runQuery,
|
|
8
|
+
queryOptions,
|
|
9
|
+
filterByPropEquality,
|
|
10
|
+
sortByFirstCreated,
|
|
11
|
+
sortByLastCreated,
|
|
12
|
+
} from '~/core/query';
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
COLLECTION_DEFAULT_CACHING_POLICY,
|
|
16
|
+
COLLECTION_DEFAULT_PAGINATION_LIMIT,
|
|
17
|
+
} from '~/utils/constants';
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
onCommentCreated,
|
|
21
|
+
onCommentUpdated,
|
|
22
|
+
onCommentDeleted,
|
|
23
|
+
onCommentFlagged,
|
|
24
|
+
onCommentUnflagged,
|
|
25
|
+
onCommentReactionAdded,
|
|
26
|
+
onCommentReactionRemoved,
|
|
27
|
+
} from '../events';
|
|
28
|
+
import { queryComments } from '../api';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* ```js
|
|
32
|
+
* import { liveComments } from '@amityco/ts-sdk'
|
|
33
|
+
*
|
|
34
|
+
* let comments = []
|
|
35
|
+
* const unsub = liveComments({
|
|
36
|
+
* referenceType: Amity.Comment['referenceType'];
|
|
37
|
+
* referenceId: Amity.Comment['referenceId'];
|
|
38
|
+
* }, response => merge(comments, response.data))
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* Observe all mutations on a list of {@link Amity.Comment} for a given target object
|
|
42
|
+
*
|
|
43
|
+
* @param referenceType the type of the target
|
|
44
|
+
* @param referenceId the ID of the target
|
|
45
|
+
* @param callback the function to call when new data are available
|
|
46
|
+
* @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the messages
|
|
47
|
+
*
|
|
48
|
+
* @category Comments Live Collection
|
|
49
|
+
*/
|
|
50
|
+
export const liveComments = (
|
|
51
|
+
params: Amity.CommentLiveCollection,
|
|
52
|
+
callback: Amity.LiveCollectionCallback<Amity.Comment>,
|
|
53
|
+
config?: Amity.LiveCollectionConfig,
|
|
54
|
+
): Amity.Unsubscriber => {
|
|
55
|
+
const { log, cache } = getActiveClient();
|
|
56
|
+
|
|
57
|
+
if (!cache) {
|
|
58
|
+
console.log('For using Live Collection feature you need to enable Cache!');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const timestamp = Date.now();
|
|
62
|
+
log(`liveComments(tmpid: ${timestamp}) > listen`);
|
|
63
|
+
|
|
64
|
+
const { limit: queryLimit, ...queryParams } = params;
|
|
65
|
+
|
|
66
|
+
const limit = queryLimit ?? COLLECTION_DEFAULT_PAGINATION_LIMIT;
|
|
67
|
+
const { policy = COLLECTION_DEFAULT_CACHING_POLICY } = config ?? {};
|
|
68
|
+
|
|
69
|
+
const disposers: Amity.Unsubscriber[] = [];
|
|
70
|
+
const cacheKey = [
|
|
71
|
+
'comment',
|
|
72
|
+
'collection',
|
|
73
|
+
{ referenceId: params.referenceType, referenceType: params.referenceId },
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
const responder = (data: Amity.CommentLiveCollectionCache) => {
|
|
77
|
+
let comments: Amity.Comment[] =
|
|
78
|
+
data.data
|
|
79
|
+
.map(commentId => pullFromCache<Amity.Comment>(['comment', 'get', commentId])!)
|
|
80
|
+
.filter(Boolean)
|
|
81
|
+
.map(({ data }) => data) ?? [];
|
|
82
|
+
|
|
83
|
+
comments = filterByPropEquality(comments, 'isDeleted', params.isDeleted);
|
|
84
|
+
|
|
85
|
+
const sortBy = params.sortBy ? params.sortBy : 'lastCreated';
|
|
86
|
+
|
|
87
|
+
comments = comments.sort(sortBy === 'lastCreated' ? sortByLastCreated : sortByFirstCreated);
|
|
88
|
+
|
|
89
|
+
callback({
|
|
90
|
+
onNextPage: onFetch,
|
|
91
|
+
data: comments,
|
|
92
|
+
hasNextPage: !!data.params?.page,
|
|
93
|
+
loading: data.loading,
|
|
94
|
+
error: data.error,
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const realtimeRouter = (comment: Amity.Comment, action: Amity.CommentActionType) => {
|
|
99
|
+
const collection = pullFromCache<Amity.CommentLiveCollectionCache>(cacheKey)?.data;
|
|
100
|
+
|
|
101
|
+
if (
|
|
102
|
+
params.referenceId !== comment.referenceId ||
|
|
103
|
+
params.referenceType !== comment.referenceType ||
|
|
104
|
+
!collection
|
|
105
|
+
)
|
|
106
|
+
return;
|
|
107
|
+
|
|
108
|
+
if (action === 'onCreate') {
|
|
109
|
+
collection.data = [...new Set([comment.commentId, ...collection.data])];
|
|
110
|
+
} else if (action === 'onDelete') {
|
|
111
|
+
collection.data = collection.data.filter(p => p !== comment.commentId);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
pushToCache(cacheKey, collection);
|
|
115
|
+
|
|
116
|
+
responder(collection);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const onFetch = () => {
|
|
120
|
+
const collection = pullFromCache<Amity.CommentLiveCollectionCache>(cacheKey)?.data;
|
|
121
|
+
|
|
122
|
+
const comments = collection?.data ?? [];
|
|
123
|
+
|
|
124
|
+
if (comments.length > 0 && !collection?.params?.page) return;
|
|
125
|
+
|
|
126
|
+
const query = createQuery(queryComments, {
|
|
127
|
+
...queryParams,
|
|
128
|
+
page: collection?.params?.page ?? { limit },
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
runQuery(
|
|
132
|
+
query,
|
|
133
|
+
({ data: result, error, loading, prevPage, nextPage }) => {
|
|
134
|
+
// depend on sortBy value we have two different pagination type
|
|
135
|
+
const page = queryParams.sortBy ? nextPage : prevPage;
|
|
136
|
+
|
|
137
|
+
const data = {
|
|
138
|
+
loading,
|
|
139
|
+
error,
|
|
140
|
+
params: { page },
|
|
141
|
+
data: comments,
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
if (result) {
|
|
145
|
+
data.data = [...new Set([...comments, ...result.map(getResolver('comment'))])];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
pushToCache(cacheKey, data);
|
|
149
|
+
|
|
150
|
+
responder(data);
|
|
151
|
+
},
|
|
152
|
+
queryOptions(policy),
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
disposers.push(
|
|
157
|
+
onCommentCreated(comment => realtimeRouter(comment, 'onCreate')),
|
|
158
|
+
onCommentUpdated(comment => realtimeRouter(comment, 'onUpdate')),
|
|
159
|
+
onCommentDeleted(comment => realtimeRouter(comment, 'onDelete')),
|
|
160
|
+
onCommentFlagged(comment => realtimeRouter(comment, 'onFlagged')),
|
|
161
|
+
onCommentUnflagged(comment => realtimeRouter(comment, 'onUnflagged')),
|
|
162
|
+
onCommentReactionAdded(comment => realtimeRouter(comment, 'onReactionAdded')),
|
|
163
|
+
onCommentReactionRemoved(comment => realtimeRouter(comment, 'onReactionRemoved')),
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
onFetch();
|
|
167
|
+
|
|
168
|
+
return () => {
|
|
169
|
+
log(`liveComments(tmpid: ${timestamp}) > dispose`);
|
|
170
|
+
disposers.forEach(fn => fn());
|
|
171
|
+
};
|
|
172
|
+
};
|
|
@@ -48,17 +48,7 @@ export const observeComments = (
|
|
|
48
48
|
|
|
49
49
|
const disposers: Amity.Unsubscriber[] = [];
|
|
50
50
|
|
|
51
|
-
const router = (
|
|
52
|
-
comment: Amity.Comment,
|
|
53
|
-
action:
|
|
54
|
-
| 'onCreate'
|
|
55
|
-
| 'onUpdate'
|
|
56
|
-
| 'onDelete'
|
|
57
|
-
| 'onFlagged'
|
|
58
|
-
| 'onUnflagged'
|
|
59
|
-
| 'onReactionAdded'
|
|
60
|
-
| 'onReactionRemoved',
|
|
61
|
-
) => {
|
|
51
|
+
const router = (comment: Amity.Comment, action: Exclude<Amity.CommentActionType, 'onFetch'>) => {
|
|
62
52
|
if (comment.referenceId !== postId) return;
|
|
63
53
|
|
|
64
54
|
if (callback instanceof Function) return callback(comment);
|
|
@@ -4,31 +4,31 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* ```js
|
|
7
|
-
* import {
|
|
8
|
-
* const updated = await
|
|
7
|
+
* import { addCommunityMembersRoles } from '@amityco/ts-sdk'
|
|
8
|
+
* const updated = await addCommunityMembersRoles(communityId, ['foo'], ['bar'])
|
|
9
9
|
* ```
|
|
10
10
|
*
|
|
11
|
-
* Adds
|
|
11
|
+
* Adds a list of {@link Amity.Role} to a list of {@link Amity.User} on a {@link Amity.Community}
|
|
12
12
|
*
|
|
13
13
|
* @param communityId The ID of the {@link Amity.Community} to perform
|
|
14
|
-
* @param
|
|
14
|
+
* @param roleIds Array of IDs of the {@link Amity.Role} to apply
|
|
15
15
|
* @param userId Array of IDs of the {@link Amity.User} to perform
|
|
16
16
|
* @returns A success boolean if the {@link Amity.Role} were added to list of {@link Amity.User} in the {@link Amity.Community}
|
|
17
17
|
*
|
|
18
18
|
* @category Community API
|
|
19
19
|
* @async
|
|
20
20
|
*/
|
|
21
|
-
export const
|
|
21
|
+
export const addCommunityMembersRoles = async (
|
|
22
22
|
communityId: Amity.Community['communityId'],
|
|
23
|
-
|
|
23
|
+
roleIds: Amity.Role['roleId'][],
|
|
24
24
|
userIds: Amity.User['userId'][],
|
|
25
25
|
): Promise<boolean> => {
|
|
26
26
|
const client = getActiveClient();
|
|
27
|
-
client.log('community/
|
|
27
|
+
client.log('community/addCommunityMembersRoles', communityId, roleIds, userIds);
|
|
28
28
|
|
|
29
29
|
const { data } = await client.http.post<Amity.CommunityMembershipPayload>(
|
|
30
|
-
`/api/
|
|
31
|
-
{ communityId,
|
|
30
|
+
`/api/v4/communities/${communityId}/users/roles`,
|
|
31
|
+
{ communityId, roles: roleIds, userIds },
|
|
32
32
|
);
|
|
33
33
|
|
|
34
34
|
if (client.cache) ingestInCache(data);
|
|
@@ -36,6 +36,7 @@ export const addCommunityMembersRole = async (
|
|
|
36
36
|
const { communityUsers } = data;
|
|
37
37
|
return !!communityUsers.find(
|
|
38
38
|
communityUser =>
|
|
39
|
-
communityUser.communityId === communityId &&
|
|
39
|
+
communityUser.communityId === communityId &&
|
|
40
|
+
roleIds.some(role => communityUser.roles.includes(role)),
|
|
40
41
|
);
|
|
41
42
|
};
|
|
@@ -12,9 +12,8 @@ export * from './leaveCommunity';
|
|
|
12
12
|
export * from './queryCommunityMembers';
|
|
13
13
|
export * from './addCommunityMembers';
|
|
14
14
|
export * from './removeCommunityMembers';
|
|
15
|
-
|
|
16
|
-
export * from './
|
|
17
|
-
export * from './removeCommunityMembersRole';
|
|
15
|
+
export * from './addCommunityMembersRoles';
|
|
16
|
+
export * from './removeCommunityMembersRoles';
|
|
18
17
|
|
|
19
18
|
export * from './getTopTrendingCommunities';
|
|
20
19
|
export * from './getRecommendedCommunities';
|
|
@@ -4,31 +4,31 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* ```js
|
|
7
|
-
* import {
|
|
8
|
-
* const updated = await
|
|
7
|
+
* import { removeCommunityMembersRoles } from '@amityco/ts-sdk'
|
|
8
|
+
* const updated = await removeCommunityMembersRoles(communityId, ['foo'], ['bar'])
|
|
9
9
|
* ```
|
|
10
10
|
*
|
|
11
|
-
* Removes
|
|
11
|
+
* Removes a list of {@link Amity.Role} from a list of {@link Amity.User} on a {@link Amity.Community}
|
|
12
12
|
*
|
|
13
13
|
* @param communityId The ID of the {@link Amity.Community} to perform
|
|
14
|
-
* @param
|
|
14
|
+
* @param roleIds Array of IDs of the {@link Amity.Role} to apply
|
|
15
15
|
* @param userId Array of IDs of the {@link Amity.User} to perform
|
|
16
16
|
* @returns A success boolean if the {@link Amity.Role} were removed from list of {@link Amity.User} in the {@link Amity.Community}
|
|
17
17
|
*
|
|
18
18
|
* @category Community API
|
|
19
19
|
* @async
|
|
20
20
|
*/
|
|
21
|
-
export const
|
|
21
|
+
export const removeCommunityMembersRoles = async (
|
|
22
22
|
communityId: Amity.Community['communityId'],
|
|
23
|
-
|
|
23
|
+
roleIds: Amity.Role['roleId'][],
|
|
24
24
|
userIds: Amity.User['userId'][],
|
|
25
25
|
): Promise<boolean> => {
|
|
26
26
|
const client = getActiveClient();
|
|
27
|
-
client.log('community/
|
|
27
|
+
client.log('community/removeCommunityMembersRoles', communityId, roleIds, userIds);
|
|
28
28
|
|
|
29
29
|
const { data } = await client.http.delete<Amity.CommunityMembershipPayload>(
|
|
30
|
-
`/api/
|
|
31
|
-
{ data: { communityId,
|
|
30
|
+
`/api/v4/communities/${communityId}/users/roles`,
|
|
31
|
+
{ data: { communityId, roles: roleIds, userIds } },
|
|
32
32
|
);
|
|
33
33
|
|
|
34
34
|
if (client.cache) ingestInCache(data);
|
|
@@ -36,6 +36,7 @@ export const removeCommunityMembersRole = async (
|
|
|
36
36
|
const { communityUsers } = data;
|
|
37
37
|
return !!communityUsers.find(
|
|
38
38
|
communityUser =>
|
|
39
|
-
communityUser.communityId === communityId &&
|
|
39
|
+
communityUser.communityId === communityId &&
|
|
40
|
+
!roleIds.some(role => communityUser.roles.includes(role)),
|
|
40
41
|
);
|
|
41
42
|
};
|
|
@@ -19,9 +19,12 @@ const idResolvers: Resolvers = {
|
|
|
19
19
|
message: ({ messageId }) => messageId,
|
|
20
20
|
|
|
21
21
|
community: ({ communityId }) => communityId,
|
|
22
|
+
category: ({ categoryId }) => categoryId,
|
|
22
23
|
communityUsers: ({ communityId, userId }) => `${communityId}#${userId}`,
|
|
23
24
|
post: ({ postId }) => postId,
|
|
24
25
|
comment: ({ commentId }) => commentId,
|
|
26
|
+
poll: ({ pollId }) => pollId,
|
|
27
|
+
reaction: ({ reactionId }) => reactionId,
|
|
25
28
|
|
|
26
29
|
stream: ({ streamId }) => streamId,
|
|
27
30
|
|
|
@@ -27,9 +27,12 @@ const CRITERIAS: Criterias = {
|
|
|
27
27
|
channelUsers: ['channelId', 'userId', 'membership'],
|
|
28
28
|
message: ['messageId'],
|
|
29
29
|
community: ['communityId', 'onlyAdminCanPost'],
|
|
30
|
+
category: ['categoryId'],
|
|
30
31
|
communityUsers: ['userId', 'communityId', 'communityMembership'],
|
|
31
32
|
post: ['postId', 'feedId'],
|
|
32
33
|
comment: ['commentId', 'referenceId'],
|
|
34
|
+
poll: ['pollId'],
|
|
35
|
+
reaction: ['reactionId'],
|
|
33
36
|
stream: ['streamId'],
|
|
34
37
|
follow: ['from', 'to'],
|
|
35
38
|
followCount: ['userId', 'followerCount'],
|
|
@@ -54,3 +57,21 @@ export const identifyModel = (model: Record<string, unknown>) => {
|
|
|
54
57
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
55
58
|
return criterias.find(([_, keys]) => hasKeys(model, keys))?.[0];
|
|
56
59
|
};
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* Identify the modal key for a model
|
|
63
|
+
* Used to get args for optimistic updates
|
|
64
|
+
* Example: createMessage: get messageId on optimistic message creation
|
|
65
|
+
*
|
|
66
|
+
* @param model to be recognized
|
|
67
|
+
* @returns model key array if one if found or undefined
|
|
68
|
+
*/
|
|
69
|
+
export const identifyModelKey = (model: Record<string, unknown>): string | undefined => {
|
|
70
|
+
const modalKey = identifyModel(model);
|
|
71
|
+
|
|
72
|
+
if (!modalKey) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return CRITERIAS[modalKey]?.[0];
|
|
77
|
+
};
|
package/src/core/model/index.ts
CHANGED
|
@@ -15,10 +15,13 @@ export const PAYLOAD2MODEL: Record<string, Amity.Domain> = {
|
|
|
15
15
|
messages: 'message',
|
|
16
16
|
|
|
17
17
|
communities: 'community',
|
|
18
|
+
categories: 'category',
|
|
18
19
|
communityUsers: 'communityUsers',
|
|
19
20
|
posts: 'post',
|
|
20
21
|
postChildren: 'post',
|
|
21
22
|
comments: 'comment',
|
|
23
|
+
polls: 'poll',
|
|
24
|
+
reactions: 'reaction',
|
|
22
25
|
videoStreamings: 'stream',
|
|
23
26
|
|
|
24
27
|
follows: 'follow',
|
package/src/core/query/paging.ts
CHANGED
|
@@ -80,17 +80,17 @@ export const toToken = (
|
|
|
80
80
|
"before" or "after" value. if that would change,
|
|
81
81
|
we'd need to move toward a more simple: `!paging.before`
|
|
82
82
|
*/
|
|
83
|
-
if (!Number.isNaN(paging?.before!)) {
|
|
83
|
+
if (!Number.isNaN(Number(paging?.before!))) {
|
|
84
84
|
payload = {
|
|
85
85
|
before: paging.before,
|
|
86
86
|
last: paging.limit,
|
|
87
87
|
};
|
|
88
|
-
} else if (!Number.isNaN(paging?.after!)) {
|
|
88
|
+
} else if (!Number.isNaN(Number(paging?.after!))) {
|
|
89
89
|
payload = {
|
|
90
90
|
after: paging.after,
|
|
91
91
|
first: paging.limit,
|
|
92
92
|
};
|
|
93
|
-
} else if (!Number.isNaN(paging?.limit!)) {
|
|
93
|
+
} else if (!Number.isNaN(Number(paging?.limit!))) {
|
|
94
94
|
payload = {
|
|
95
95
|
last: paging.limit,
|
|
96
96
|
};
|
package/src/core/query/query.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable no-use-before-define */
|
|
2
2
|
import { isPaged } from './paging';
|
|
3
|
+
import { identifyModelKey } from '~/core/model';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Type guard to check and cast that a given async function is has the ".locally" property
|
|
@@ -201,7 +202,37 @@ export const runQuery = <Args extends any[], Returned extends any>(
|
|
|
201
202
|
);
|
|
202
203
|
}
|
|
203
204
|
|
|
204
|
-
|
|
205
|
+
let optimisticArgs = args;
|
|
206
|
+
/* get args for optimistic method calls
|
|
207
|
+
*
|
|
208
|
+
* On optimistic updates, the modal key for the update needs to be passed to
|
|
209
|
+
* the server so as to avoid duplicate modal creation
|
|
210
|
+
*
|
|
211
|
+
* ex: on creating a new message pass the modalKey is messageId, pass this
|
|
212
|
+
* id onto the server so that a duplicate with seperate messageId is not
|
|
213
|
+
* created.
|
|
214
|
+
*/
|
|
215
|
+
if (isMutator(func)) {
|
|
216
|
+
// @ts-ignore
|
|
217
|
+
const modelKey = local && local.data && identifyModelKey(local.data);
|
|
218
|
+
if (modelKey) {
|
|
219
|
+
/*
|
|
220
|
+
* modal key is only required for create as update and delete queries pass
|
|
221
|
+
* the modal key in the param itself
|
|
222
|
+
* For update & delete the first argument is always an id which is of type
|
|
223
|
+
* string, whereas for create the first and only argument is the param object
|
|
224
|
+
*
|
|
225
|
+
* When creating an AmityObject optimistically we need to pass the modal key
|
|
226
|
+
* on to the server. ex: for create message modal key will be 'messageId`
|
|
227
|
+
*/
|
|
228
|
+
if (typeof args[0] !== 'string') {
|
|
229
|
+
// @ts-ignore
|
|
230
|
+
optimisticArgs = [{ ...args[0], [modelKey]: local.data[modelKey] }];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
func(...optimisticArgs)
|
|
205
236
|
.then(fresh => {
|
|
206
237
|
// @ts-ignore i know.
|
|
207
238
|
// isLocal(local) && syncInCache(local, fresh)
|
package/src/core/subscription.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getActiveClient } from '~/client/api';
|
|
1
|
+
import { getActiveClient } from '~/client/api/activeClient';
|
|
2
2
|
import { ASCError } from '~/core/errors';
|
|
3
3
|
import { proxyMqttEvents } from '~/core/events';
|
|
4
4
|
import { getActiveUser } from '~/client/api/activeUser';
|
|
@@ -12,7 +12,7 @@ export enum SubscriptionLevels {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
const getCommunityUserTopic = (
|
|
15
|
-
|
|
15
|
+
path: Amity.Subscribable['path'],
|
|
16
16
|
level?: SubscriptionLevels,
|
|
17
17
|
): string => {
|
|
18
18
|
switch (level) {
|
|
@@ -30,12 +30,16 @@ const getCommunityUserTopic = (
|
|
|
30
30
|
export const getCommunityTopic = (
|
|
31
31
|
{ path }: Amity.Subscribable,
|
|
32
32
|
level: Exclude<SubscriptionLevels, SubscriptionLevels.USER> = SubscriptionLevels.COMMUNITY,
|
|
33
|
-
): string => getCommunityUserTopic(
|
|
33
|
+
): string => getCommunityUserTopic(path, level);
|
|
34
34
|
|
|
35
35
|
export const getUserTopic = (
|
|
36
36
|
{ path }: Amity.Subscribable,
|
|
37
37
|
level: Exclude<SubscriptionLevels, SubscriptionLevels.COMMUNITY> = SubscriptionLevels.USER,
|
|
38
|
-
): string =>
|
|
38
|
+
): string =>
|
|
39
|
+
getCommunityUserTopic(
|
|
40
|
+
level === SubscriptionLevels.USER ? path : path.replace(/^(\w*)/, '$1/social'),
|
|
41
|
+
level,
|
|
42
|
+
);
|
|
39
43
|
|
|
40
44
|
export const getPostTopic = (
|
|
41
45
|
{ path }: Amity.Subscribable,
|
|
@@ -69,6 +73,15 @@ export const getMyFollowingsTopic = (): string => {
|
|
|
69
73
|
return `${networkId}/membership/+/${user._id}/+`;
|
|
70
74
|
};
|
|
71
75
|
|
|
76
|
+
/** @hidden */
|
|
77
|
+
export const getNetworkTopic = (): string => {
|
|
78
|
+
const user = getActiveUser();
|
|
79
|
+
|
|
80
|
+
const [networkId] = user.path.split('/user/');
|
|
81
|
+
|
|
82
|
+
return networkId;
|
|
83
|
+
};
|
|
84
|
+
|
|
72
85
|
let mqttAccessToken: string;
|
|
73
86
|
let mqttUserId: string;
|
|
74
87
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { filterByPropEquality } from '~/core/query';
|
|
2
|
+
|
|
3
|
+
describe('Core/Query/Filtering', () => {
|
|
4
|
+
test('check filterByPropEquality', () => {
|
|
5
|
+
const prop = 'prop';
|
|
6
|
+
const collection = [{ [prop]: 'value' }];
|
|
7
|
+
|
|
8
|
+
expect(filterByPropEquality(collection, prop, 'value')).toStrictEqual(collection);
|
|
9
|
+
expect(filterByPropEquality(collection, prop, 'otherValue')).toStrictEqual([]);
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { isFetcher } from '~/core/query';
|
|
2
|
+
|
|
3
|
+
type isFetcherMockType = jest.Mock<any, any> & {
|
|
4
|
+
locally?: jest.Mock<any, any>;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
describe('Core/Query/Query', () => {
|
|
8
|
+
const isFetcherMock: isFetcherMockType = jest.fn();
|
|
9
|
+
|
|
10
|
+
test('isFetcher without locally', () => {
|
|
11
|
+
expect(isFetcher(isFetcherMock)).toBe(false);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('isFetcher with locally', () => {
|
|
15
|
+
isFetcherMock.locally = jest.fn();
|
|
16
|
+
|
|
17
|
+
expect(isFetcher(isFetcherMock)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createHttpTransport } from '~/core/transports';
|
|
2
|
+
import { getDeviceInfo, getDeviceId } from '~/core/device';
|
|
3
|
+
import { API_REGIONS, computeUrl } from '~/client/utils/endpoints';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Retrieves accessToken info to use in Beta services
|
|
7
|
+
*
|
|
8
|
+
* @param apiKey for the Http Client instance
|
|
9
|
+
* @param apiRegion endpoint to connect to
|
|
10
|
+
* @param params The token parameters
|
|
11
|
+
* @param params.userId The userId to use to issue a token
|
|
12
|
+
* @param params.displayName The user's displayName
|
|
13
|
+
* @param params.authToken The authentication token - necessary when network option is set to secure
|
|
14
|
+
* @return An accessToken info object for the given userId
|
|
15
|
+
*
|
|
16
|
+
* @category External API
|
|
17
|
+
* @hidden
|
|
18
|
+
*/
|
|
19
|
+
export const createUserToken = async (
|
|
20
|
+
apiKey: string,
|
|
21
|
+
apiRegion: typeof API_REGIONS[keyof typeof API_REGIONS],
|
|
22
|
+
params: {
|
|
23
|
+
userId: Amity.User['userId'];
|
|
24
|
+
displayName?: Amity.User['displayName'];
|
|
25
|
+
authToken?: string;
|
|
26
|
+
},
|
|
27
|
+
) => {
|
|
28
|
+
const deviceId = getDeviceId();
|
|
29
|
+
const deviceInfo = await getDeviceInfo();
|
|
30
|
+
const http = createHttpTransport(computeUrl('http', apiRegion));
|
|
31
|
+
|
|
32
|
+
const { data } = await http.post<Amity.Tokens>(
|
|
33
|
+
'/api/v3/sessions',
|
|
34
|
+
{
|
|
35
|
+
...params,
|
|
36
|
+
deviceId,
|
|
37
|
+
deviceInfo: { ...deviceInfo, model: 'token management API on TS-SDK' },
|
|
38
|
+
},
|
|
39
|
+
{ headers: { 'X-API-Key': apiKey } },
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return { accessToken: data.accessToken };
|
|
43
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './createUserToken';
|
|
@@ -11,6 +11,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
|
11
11
|
* Creates an {@link Amity.File}
|
|
12
12
|
*
|
|
13
13
|
* @param formData The data necessary to create a new {@link Amity.File}
|
|
14
|
+
* @param onProgress The callback to track the upload progress
|
|
14
15
|
* @returns The newly created {@link Amity.File}
|
|
15
16
|
*
|
|
16
17
|
* @category File API
|
|
@@ -19,19 +20,19 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
|
19
20
|
export const createFile = async <T extends Amity.FileType = any>(
|
|
20
21
|
formData: FormData,
|
|
21
22
|
onProgress?: (percent: number) => void,
|
|
22
|
-
): Promise<Amity.Cached<Amity.File>> => {
|
|
23
|
+
): Promise<Amity.Cached<Amity.File[]>> => {
|
|
23
24
|
const client = getActiveClient();
|
|
24
25
|
client.log('file/createFile', formData);
|
|
25
26
|
|
|
26
|
-
if (!formData.getAll('
|
|
27
|
-
throw new Error('The formData object must have a `
|
|
27
|
+
if (!formData.getAll('files').length)
|
|
28
|
+
throw new Error('The formData object must have a `files` key.');
|
|
28
29
|
|
|
29
30
|
const headers =
|
|
30
31
|
'getHeaders' in formData
|
|
31
32
|
? (formData as any).getHeaders()
|
|
32
33
|
: { 'content-type': 'multipart/form-data' };
|
|
33
34
|
|
|
34
|
-
const { data } = await client.http.post<Amity.CreateFilePayload<T>>('/api/
|
|
35
|
+
const { data } = await client.http.post<Amity.CreateFilePayload<T>>('/api/v4/files', formData, {
|
|
35
36
|
headers,
|
|
36
37
|
onUploadProgress({ loaded, total }) {
|
|
37
38
|
onProgress && onProgress(Math.round((loaded * 100) / total));
|
|
@@ -45,7 +46,7 @@ export const createFile = async <T extends Amity.FileType = any>(
|
|
|
45
46
|
if (client.cache) ingestInCache({ files: data }, { cachedAt });
|
|
46
47
|
|
|
47
48
|
return {
|
|
48
|
-
data
|
|
49
|
+
data,
|
|
49
50
|
cachedAt,
|
|
50
51
|
};
|
|
51
52
|
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api';
|
|
2
|
+
|
|
3
|
+
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* ```js
|
|
7
|
+
* import { createImage } from '@amityco/ts-sdk'
|
|
8
|
+
* const created = await createImage(formData)
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Creates an {@link Amity.File<'image'>}
|
|
12
|
+
*
|
|
13
|
+
* @param formData The data necessary to create a new {@link Amity.File<'image'>}
|
|
14
|
+
* @param onProgress The callback to track the upload progress
|
|
15
|
+
* @returns The newly created {@link Amity.File<'image'>}
|
|
16
|
+
*
|
|
17
|
+
* @category File API
|
|
18
|
+
* @async
|
|
19
|
+
*/
|
|
20
|
+
export const createImage = async (
|
|
21
|
+
formData: FormData,
|
|
22
|
+
onProgress?: (percent: number) => void,
|
|
23
|
+
): Promise<Amity.Cached<Amity.File<'image'>[]>> => {
|
|
24
|
+
const client = getActiveClient();
|
|
25
|
+
client.log('file/createImage', formData);
|
|
26
|
+
|
|
27
|
+
if (!formData.getAll('files').length)
|
|
28
|
+
throw new Error('The formData object must have a `files` key.');
|
|
29
|
+
|
|
30
|
+
const headers =
|
|
31
|
+
'getHeaders' in formData
|
|
32
|
+
? (formData as any).getHeaders()
|
|
33
|
+
: { 'content-type': 'multipart/form-data' };
|
|
34
|
+
|
|
35
|
+
const { data } = await client.http.post<Amity.CreateFilePayload<'image'>>(
|
|
36
|
+
'/api/v4/images',
|
|
37
|
+
formData,
|
|
38
|
+
{
|
|
39
|
+
headers,
|
|
40
|
+
onUploadProgress({ loaded, total }) {
|
|
41
|
+
onProgress && onProgress(Math.round((loaded * 100) / total));
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// API-FIX: payload should be serialized properly
|
|
47
|
+
// const { files } = data
|
|
48
|
+
|
|
49
|
+
const cachedAt = client.cache && Date.now();
|
|
50
|
+
if (client.cache) ingestInCache({ files: data }, { cachedAt });
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
data,
|
|
54
|
+
cachedAt,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// TODO: consider doing local creation with URL.createObjectURL()
|