@amityco/ts-sdk 6.29.2 → 6.29.3-9895419.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/.env +26 -26
- package/dist/@types/core/model.d.ts +4 -0
- package/dist/@types/core/model.d.ts.map +1 -1
- package/dist/@types/core/payload.d.ts +17 -6
- package/dist/@types/core/payload.d.ts.map +1 -1
- package/dist/@types/domains/channel.d.ts +8 -0
- package/dist/@types/domains/channel.d.ts.map +1 -1
- package/dist/@types/domains/comment.d.ts +5 -4
- package/dist/@types/domains/comment.d.ts.map +1 -1
- package/dist/@types/domains/community.d.ts +32 -8
- package/dist/@types/domains/community.d.ts.map +1 -1
- package/dist/@types/domains/group.d.ts +13 -7
- package/dist/@types/domains/group.d.ts.map +1 -1
- package/dist/@types/domains/pin.d.ts +22 -0
- package/dist/@types/domains/pin.d.ts.map +1 -0
- package/dist/@types/domains/pinnedPost.d.ts +28 -0
- package/dist/@types/domains/pinnedPost.d.ts.map +1 -0
- package/dist/@types/domains/poll.d.ts +3 -1
- package/dist/@types/domains/poll.d.ts.map +1 -1
- package/dist/@types/domains/post.d.ts +6 -5
- package/dist/@types/domains/post.d.ts.map +1 -1
- package/dist/@types/domains/stream.d.ts +2 -1
- package/dist/@types/domains/stream.d.ts.map +1 -1
- package/dist/@types/domains/user.d.ts +34 -6
- package/dist/@types/domains/user.d.ts.map +1 -1
- package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberLiveCollectionController.d.ts.map +1 -1
- package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberPaginationController.d.ts +3 -2
- package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberPaginationController.d.ts.map +1 -1
- package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberLiveCollectionController.d.ts +14 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberLiveCollectionController.d.ts.map +1 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberPaginationController.d.ts +14 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberPaginationController.d.ts.map +1 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberQueryStreamController.d.ts +14 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberQueryStreamController.d.ts.map +1 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/index.d.ts +2 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/index.d.ts.map +1 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/searchMembers.d.ts +21 -0
- package/dist/channelRepository/channelMembership/observers/searchMembers/searchMembers.d.ts.map +1 -0
- package/dist/channelRepository/observers/getChannels/ChannelPaginationController.d.ts +3 -3
- package/dist/channelRepository/utils/prepareChannelPayload.d.ts.map +1 -1
- package/dist/channelRepository/utils/tests/prepareChannelPayload.test.d.ts +1 -1
- package/dist/channelRepository/utils/tests/prepareChannelPayload.test.d.ts.map +1 -1
- package/dist/communityRepository/communityMembership/observers/getMembers/CommunityMembersLiveCollectionController.d.ts.map +1 -1
- package/dist/communityRepository/communityMembership/observers/searchMembers/SearchCommunityMembersLiveCollectionController.d.ts.map +1 -1
- package/dist/communityRepository/utils/payload.d.ts +2 -6
- package/dist/communityRepository/utils/payload.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/group/utils/withUser.d.ts +13 -0
- package/dist/group/utils/withUser.d.ts.map +1 -1
- package/dist/index.cjs.js +957 -614
- package/dist/index.esm.js +880 -537
- package/dist/index.umd.js +4 -4
- package/dist/pollRepository/observers/observePoll.d.ts +1 -1
- package/dist/pollRepository/observers/observePoll.d.ts.map +1 -1
- package/dist/postRepository/internalApi/index.d.ts +1 -12
- package/dist/postRepository/internalApi/index.d.ts.map +1 -1
- package/dist/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.d.ts +14 -0
- package/dist/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.d.ts.map +1 -0
- package/dist/postRepository/observers/getPinnedPosts/PinnedPostPaginationController.d.ts +13 -0
- package/dist/postRepository/observers/getPinnedPosts/PinnedPostPaginationController.d.ts.map +1 -0
- package/dist/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.d.ts +9 -0
- package/dist/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.d.ts.map +1 -0
- package/dist/postRepository/observers/getPinnedPosts.d.ts +12 -0
- package/dist/postRepository/observers/getPinnedPosts.d.ts.map +1 -0
- package/dist/postRepository/observers/index.d.ts +1 -0
- package/dist/postRepository/observers/index.d.ts.map +1 -1
- package/dist/postRepository/utils/payload.d.ts.map +1 -1
- package/dist/report/api/createReport.d.ts +1 -2
- package/dist/report/api/createReport.d.ts.map +1 -1
- package/dist/report/api/deleteReport.d.ts +1 -2
- package/dist/report/api/deleteReport.d.ts.map +1 -1
- package/dist/report/api/isReportedByMe.d.ts +1 -2
- package/dist/report/api/isReportedByMe.d.ts.map +1 -1
- package/dist/streamRepository/observers/getStreams/GetStreamsPageController.d.ts +1 -1
- package/dist/userRepository/api/flagUser.d.ts.map +1 -1
- package/dist/userRepository/api/getUser.d.ts.map +1 -1
- package/dist/userRepository/api/getUserByIds.d.ts.map +1 -1
- package/dist/userRepository/api/queryBlockedUsers.d.ts.map +1 -1
- package/dist/userRepository/api/queryUsers.d.ts.map +1 -1
- package/dist/userRepository/api/unflagUser.d.ts.map +1 -1
- package/dist/userRepository/api/updateUser.d.ts.map +1 -1
- package/dist/userRepository/events/utils.d.ts.map +1 -1
- package/dist/userRepository/internalApi/getUser.d.ts.map +1 -1
- package/dist/userRepository/internalApi/queryUsers.d.ts.map +1 -1
- package/dist/userRepository/observers/enums.d.ts +8 -0
- package/dist/userRepository/observers/enums.d.ts.map +1 -0
- package/dist/userRepository/observers/getUsers/UserLiveCollectionController.d.ts +14 -0
- package/dist/userRepository/observers/getUsers/UserLiveCollectionController.d.ts.map +1 -0
- package/dist/userRepository/observers/getUsers/UserPaginationController.d.ts +5 -0
- package/dist/userRepository/observers/getUsers/UserPaginationController.d.ts.map +1 -0
- package/dist/userRepository/observers/getUsers/UserQueryStreamController.d.ts +15 -0
- package/dist/userRepository/observers/getUsers/UserQueryStreamController.d.ts.map +1 -0
- package/dist/userRepository/observers/getUsers.d.ts +0 -1
- package/dist/userRepository/observers/getUsers.d.ts.map +1 -1
- package/dist/userRepository/observers/searchUserByDisplayName/SearchUserLiveCollectionController.d.ts +14 -0
- package/dist/userRepository/observers/searchUserByDisplayName/SearchUserLiveCollectionController.d.ts.map +1 -0
- package/dist/userRepository/observers/searchUserByDisplayName/SearchUserPaginationController.d.ts +5 -0
- package/dist/userRepository/observers/searchUserByDisplayName/SearchUserPaginationController.d.ts.map +1 -0
- package/dist/userRepository/observers/searchUserByDisplayName/SearchUserQueryStreamController.d.ts +15 -0
- package/dist/userRepository/observers/searchUserByDisplayName/SearchUserQueryStreamController.d.ts.map +1 -0
- package/dist/userRepository/observers/searchUserByDisplayName.d.ts.map +1 -1
- package/dist/userRepository/utils/index.d.ts +3 -0
- package/dist/userRepository/utils/index.d.ts.map +1 -0
- package/dist/utils/linkedObject/index.d.ts +2 -1
- package/dist/utils/linkedObject/index.d.ts.map +1 -1
- package/dist/utils/linkedObject/pinnedPostLinkedObject.d.ts +2 -0
- package/dist/utils/linkedObject/pinnedPostLinkedObject.d.ts.map +1 -0
- package/dist/utils/tests/dummy/channel.d.ts +12 -12
- package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
- package/dist/utils/tests/dummy/community.d.ts +2 -2
- package/dist/utils/tests/dummy/user.d.ts +10 -2
- package/dist/utils/tests/dummy/user.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/@types/core/model.ts +6 -0
- package/src/@types/core/payload.ts +17 -7
- package/src/@types/domains/channel.ts +13 -0
- package/src/@types/domains/comment.ts +6 -4
- package/src/@types/domains/community.ts +40 -12
- package/src/@types/domains/group.ts +14 -6
- package/src/@types/domains/pin.ts +27 -0
- package/src/@types/domains/pinnedPost.ts +35 -0
- package/src/@types/domains/poll.ts +5 -1
- package/src/@types/domains/post.ts +7 -5
- package/src/@types/domains/stream.ts +3 -1
- package/src/@types/domains/user.ts +49 -6
- package/src/channelRepository/channelMembership/observers/getMembers/ChannelMemberLiveCollectionController.ts +6 -0
- package/src/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberLiveCollectionController.ts +142 -0
- package/src/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberPaginationController.ts +28 -0
- package/src/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberQueryStreamController.ts +112 -0
- package/src/channelRepository/channelMembership/observers/searchMembers/index.ts +1 -0
- package/src/channelRepository/channelMembership/observers/searchMembers/searchMembers.ts +111 -0
- package/src/channelRepository/utils/prepareChannelPayload.ts +8 -4
- package/src/communityRepository/communityMembership/observers/getMembers/CommunityMembersLiveCollectionController.ts +6 -0
- package/src/communityRepository/communityMembership/observers/searchMembers/SearchCommunityMembersLiveCollectionController.ts +6 -0
- package/src/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.ts +3 -3
- package/src/communityRepository/utils/payload.ts +23 -58
- package/src/core/model/idResolvers.ts +3 -0
- package/src/core/model/index.ts +3 -0
- package/src/group/utils/withUser.ts +33 -0
- package/src/postRepository/internalApi/index.ts +1 -16
- package/src/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.ts +104 -0
- package/src/postRepository/observers/getPinnedPosts/PinnedPostPaginationController.ts +23 -0
- package/src/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.ts +61 -0
- package/src/postRepository/observers/getPinnedPosts.ts +41 -0
- package/src/postRepository/observers/index.ts +1 -0
- package/src/postRepository/utils/payload.ts +23 -7
- package/src/report/api/createReport.ts +100 -31
- package/src/report/api/deleteReport.ts +100 -31
- package/src/report/api/isReportedByMe.ts +72 -11
- package/src/userRepository/api/flagUser.ts +5 -2
- package/src/userRepository/api/getUser.ts +4 -43
- package/src/userRepository/api/getUserByIds.ts +5 -2
- package/src/userRepository/api/queryBlockedUsers.ts +6 -6
- package/src/userRepository/api/queryUsers.ts +11 -87
- package/src/userRepository/api/unflagUser.ts +5 -2
- package/src/userRepository/api/updateUser.ts +5 -11
- package/src/userRepository/events/utils.ts +4 -1
- package/src/userRepository/internalApi/getUser.ts +12 -16
- package/src/userRepository/internalApi/queryUsers.ts +7 -4
- package/src/userRepository/observers/enums.ts +7 -0
- package/src/userRepository/observers/getUsers/UserLiveCollectionController.ts +131 -0
- package/src/userRepository/observers/getUsers/UserPaginationController.ts +25 -0
- package/src/userRepository/observers/getUsers/UserQueryStreamController.ts +82 -0
- package/src/userRepository/observers/getUsers.ts +7 -137
- package/src/userRepository/observers/searchUserByDisplayName/SearchUserLiveCollectionController.ts +116 -0
- package/src/userRepository/observers/searchUserByDisplayName/SearchUserPaginationController.ts +25 -0
- package/src/userRepository/observers/searchUserByDisplayName/SearchUserQueryStreamController.ts +82 -0
- package/src/userRepository/observers/searchUserByDisplayName.ts +25 -1
- package/src/userRepository/utils/index.ts +13 -0
- package/src/utils/linkedObject/index.ts +2 -0
- package/src/utils/linkedObject/pinnedPostLinkedObject.ts +28 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
|
|
3
|
+
import { PaginationController } from '~/core/liveCollection/PaginationController';
|
|
4
|
+
import { COLLECTION_DEFAULT_PAGINATION_LIMIT } from '~/utils/constants';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* TODO: handle cache receive cache option, and cache policy
|
|
8
|
+
* TODO: check if querybyIds is supported
|
|
9
|
+
*/
|
|
10
|
+
export class SearchChannelMemberPaginationController extends PaginationController<
|
|
11
|
+
'channelUser',
|
|
12
|
+
Amity.ChannelMembersLiveCollection
|
|
13
|
+
> {
|
|
14
|
+
async getRequest(queryParams: Amity.ChannelMembersLiveCollection, token: string | undefined) {
|
|
15
|
+
const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT, ...params } = queryParams;
|
|
16
|
+
const options = token ? { token } : { limit };
|
|
17
|
+
|
|
18
|
+
const { data: queryResponse } = await this.http.get<
|
|
19
|
+
Amity.ChannelMembershipPayload & Amity.Pagination
|
|
20
|
+
>(`/api/v4/channels/${encodeURIComponent(params.channelId)}/users`, {
|
|
21
|
+
params: {
|
|
22
|
+
...params,
|
|
23
|
+
options,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
return queryResponse;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
import { QueryStreamController } from '~/core/liveCollection/QueryStreamController';
|
|
3
|
+
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
4
|
+
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
5
|
+
import { getResolver } from '~/core/model';
|
|
6
|
+
import { getActiveClient } from '~/client';
|
|
7
|
+
|
|
8
|
+
export class SearchChannelMemberQueryStreamController extends QueryStreamController<
|
|
9
|
+
Amity.ChannelMembershipPayload,
|
|
10
|
+
Amity.SearchChannelMembersLiveCollection
|
|
11
|
+
> {
|
|
12
|
+
private notifyChange: (params: Amity.LiveCollectionNotifyParams) => void;
|
|
13
|
+
|
|
14
|
+
private preparePayload: (
|
|
15
|
+
response: Amity.ChannelMembershipPayload,
|
|
16
|
+
) => Promise<Amity.ProcessedChannelPayload>;
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
query: Amity.SearchChannelMembersLiveCollection,
|
|
20
|
+
cacheKey: string[],
|
|
21
|
+
notifyChange: (params: Amity.LiveCollectionNotifyParams) => void,
|
|
22
|
+
preparePayload: (
|
|
23
|
+
response: Amity.ChannelMembershipPayload,
|
|
24
|
+
) => Promise<Amity.ProcessedChannelPayload>,
|
|
25
|
+
) {
|
|
26
|
+
super(query, cacheKey);
|
|
27
|
+
this.notifyChange = notifyChange;
|
|
28
|
+
this.preparePayload = preparePayload;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async saveToMainDB(response: Amity.ChannelMembershipPayload) {
|
|
32
|
+
const processedPayload = await this.preparePayload(response);
|
|
33
|
+
|
|
34
|
+
const client = getActiveClient();
|
|
35
|
+
const cachedAt = client.cache && Date.now();
|
|
36
|
+
|
|
37
|
+
if (client.cache) {
|
|
38
|
+
ingestInCache(processedPayload, { cachedAt });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
appendToQueryStream(
|
|
43
|
+
response: Amity.ChannelPayload & Partial<Amity.Pagination>,
|
|
44
|
+
direction: Amity.LiveCollectionPageDirection,
|
|
45
|
+
refresh = false,
|
|
46
|
+
) {
|
|
47
|
+
if (refresh) {
|
|
48
|
+
pushToCache(this.cacheKey, {
|
|
49
|
+
data: response.channelUsers.map(({ channelId, userId }) =>
|
|
50
|
+
getResolver('channelUsers')({ channelId, userId }),
|
|
51
|
+
),
|
|
52
|
+
});
|
|
53
|
+
} else {
|
|
54
|
+
const collection = pullFromCache<Amity.ChannelMembersLiveCollectionCache>(
|
|
55
|
+
this.cacheKey,
|
|
56
|
+
)?.data;
|
|
57
|
+
|
|
58
|
+
const channelUsers = collection?.data ?? [];
|
|
59
|
+
|
|
60
|
+
pushToCache(this.cacheKey, {
|
|
61
|
+
...collection,
|
|
62
|
+
data: [
|
|
63
|
+
...new Set([
|
|
64
|
+
...channelUsers,
|
|
65
|
+
...response.channelUsers.map(({ channelId, userId }) =>
|
|
66
|
+
getResolver('channelUsers')({ channelId, userId }),
|
|
67
|
+
),
|
|
68
|
+
]),
|
|
69
|
+
],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
reactor(action: string) {
|
|
75
|
+
return (channel: Amity.InternalChannel, channelMember: Amity.Membership<'channel'>) => {
|
|
76
|
+
if (this.query.channelId !== channelMember.channelId) return;
|
|
77
|
+
|
|
78
|
+
const collection = pullFromCache<Amity.ChannelMembersLiveCollectionCache>(
|
|
79
|
+
this.cacheKey,
|
|
80
|
+
)?.data;
|
|
81
|
+
if (!collection) return;
|
|
82
|
+
|
|
83
|
+
const channelMemberCacheId = getResolver('channelUsers')({
|
|
84
|
+
channelId: this.query.channelId,
|
|
85
|
+
userId: channelMember.userId,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
if (channelMember.membership === 'none') {
|
|
89
|
+
collection.data = collection.data.filter(m => m !== channelMemberCacheId);
|
|
90
|
+
} else if (!collection.data.includes(channelMemberCacheId)) {
|
|
91
|
+
collection.data = [channelMemberCacheId, ...collection.data];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
pushToCache(this.cacheKey, collection);
|
|
95
|
+
this.notifyChange({ origin: Amity.LiveDataOrigin.EVENT, loading: false });
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
subscribeRTE(
|
|
100
|
+
createSubscriber: {
|
|
101
|
+
fn: (
|
|
102
|
+
reactor: (
|
|
103
|
+
channel: Amity.InternalChannel,
|
|
104
|
+
channelMember: Amity.Membership<'channel'>,
|
|
105
|
+
) => void,
|
|
106
|
+
) => Amity.Unsubscriber;
|
|
107
|
+
action: string;
|
|
108
|
+
}[],
|
|
109
|
+
) {
|
|
110
|
+
return createSubscriber.map(subscriber => subscriber.fn(this.reactor(subscriber.action)));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './searchMembers';
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
import { getActiveClient } from '~/client/api';
|
|
3
|
+
import {
|
|
4
|
+
filterByPropIntersection,
|
|
5
|
+
filterBySearchTerm,
|
|
6
|
+
sortByFirstCreated,
|
|
7
|
+
sortByLastCreated,
|
|
8
|
+
} from '~/core/query';
|
|
9
|
+
import { ENABLE_CACHE_MESSAGE } from '~/utils/constants';
|
|
10
|
+
import { dropFromCache } from '~/cache/api';
|
|
11
|
+
import { SearchChannelMemberLiveCollectionController } from './SearchChannelMemberLiveCollectionController';
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Exported for testing
|
|
15
|
+
* @hidden
|
|
16
|
+
*/
|
|
17
|
+
export const applyFilter = <T extends Amity.Membership<'channel'>>(
|
|
18
|
+
data: T[],
|
|
19
|
+
params: Amity.ChannelMembersLiveCollection,
|
|
20
|
+
): T[] => {
|
|
21
|
+
let channelMembers = filterByPropIntersection(data, 'roles', params.roles);
|
|
22
|
+
|
|
23
|
+
if (params.memberships) {
|
|
24
|
+
/*
|
|
25
|
+
* even though membership includes muted as a possible value
|
|
26
|
+
* when querying the server.
|
|
27
|
+
* Muted is specified under seperarte property namely isMuted
|
|
28
|
+
* Hence why I've seperately checked for it's equality
|
|
29
|
+
*/
|
|
30
|
+
channelMembers = channelMembers.filter(member => {
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
if (params.memberships.includes('muted') && member.isMuted) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
return params.memberships.includes(member.membership);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (params.search) {
|
|
42
|
+
// eslint-disable-next-line no-console
|
|
43
|
+
console.warn(
|
|
44
|
+
'`search` param will be deprecated in the next major release. If you want to search channel members by displayName, Please use `searchMembers()` instead.',
|
|
45
|
+
);
|
|
46
|
+
channelMembers = filterBySearchTerm(channelMembers, params.search);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// sort, 'lastCreated' is the default sort order
|
|
50
|
+
const sortBy = params.sortBy ? params.sortBy : 'lastCreated';
|
|
51
|
+
channelMembers = channelMembers.sort(
|
|
52
|
+
sortBy === 'lastCreated' ? sortByLastCreated : sortByFirstCreated,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
return channelMembers;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/* begin_public_function
|
|
59
|
+
id: channel.member.query
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* ```js
|
|
63
|
+
* import { searchChannelMembers } from '@amityco/ts-sdk'
|
|
64
|
+
*
|
|
65
|
+
* let channelMembers = []
|
|
66
|
+
* const unsub = searchChannelMembers({
|
|
67
|
+
* channelId: Amity.Channel['channelId'],
|
|
68
|
+
* }, response => merge(channelMembers, response.data))
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* Observe all mutations on a list of {@link Amity.ChannelUser}s
|
|
72
|
+
*
|
|
73
|
+
* @param params for querying channel users
|
|
74
|
+
* @param callback the function to call when new data are available
|
|
75
|
+
* @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the channel users
|
|
76
|
+
*
|
|
77
|
+
* @category Channel Live Collection
|
|
78
|
+
*/
|
|
79
|
+
export const searchMembers = (
|
|
80
|
+
params: Amity.SearchChannelMembersLiveCollection,
|
|
81
|
+
callback: Amity.LiveCollectionCallback<Amity.Membership<'channel'>>,
|
|
82
|
+
config?: Amity.LiveCollectionConfig,
|
|
83
|
+
) => {
|
|
84
|
+
const { log, cache } = getActiveClient();
|
|
85
|
+
|
|
86
|
+
if (!cache) {
|
|
87
|
+
// eslint-disable-next-line no-console
|
|
88
|
+
console.log(ENABLE_CACHE_MESSAGE);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const timestamp = Date.now();
|
|
92
|
+
log(`searchChannelMembers(tmpid: ${timestamp}) > listen`);
|
|
93
|
+
|
|
94
|
+
const searchChannelMemberLiveCollection = new SearchChannelMemberLiveCollectionController(
|
|
95
|
+
params,
|
|
96
|
+
callback,
|
|
97
|
+
);
|
|
98
|
+
const disposers = searchChannelMemberLiveCollection.startSubscription();
|
|
99
|
+
|
|
100
|
+
const cacheKey = searchChannelMemberLiveCollection.getCacheKey();
|
|
101
|
+
|
|
102
|
+
disposers.push(() => {
|
|
103
|
+
dropFromCache(cacheKey);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return () => {
|
|
107
|
+
log(`searchChannelMembers(tmpid: ${timestamp}) > dispose`);
|
|
108
|
+
disposers.forEach(fn => fn());
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
/* end_public_function */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
2
|
-
import {
|
|
2
|
+
import { convertRawMembershipToMembership } from '~/group/utils/withUser';
|
|
3
3
|
import { getChannelMarkers } from '~/marker/api/getChannelMarkers';
|
|
4
4
|
|
|
5
5
|
import { updateChannelMessagePreviewCache } from '~/messagePreview/utils';
|
|
@@ -7,8 +7,7 @@ import { getActiveClient } from '~/client/api/activeClient';
|
|
|
7
7
|
import { pullFromCache } from '~/cache/api/pullFromCache';
|
|
8
8
|
import { getSubChannelsUnreadCount } from './getSubChannelsUnreadCount';
|
|
9
9
|
import { getChannelIsMentioned } from './getChannelIsMentioned';
|
|
10
|
-
import {
|
|
11
|
-
import { persistUnreadCountInfo } from '~/marker/utils/persistUnreadCountInfo';
|
|
10
|
+
import { convertRawUserToInternalUser } from '~/userRepository/utils';
|
|
12
11
|
|
|
13
12
|
export const MARKER_INCLUDED_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
|
|
14
13
|
export const isUnreadCountSupport = ({ type }: Pick<Amity.RawChannel, 'type'>) =>
|
|
@@ -99,12 +98,17 @@ export const prepareChannelPayload = async (
|
|
|
99
98
|
);
|
|
100
99
|
|
|
101
100
|
// user marker to channel users
|
|
102
|
-
const channelUsers: Amity.Membership<'channel'>[] =
|
|
101
|
+
const channelUsers: Amity.Membership<'channel'>[] = rawPayload.channelUsers.map(channelUser => {
|
|
102
|
+
return convertRawMembershipToMembership<'channel'>(channelUser);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const users = rawPayload.users.map(convertRawUserToInternalUser);
|
|
103
106
|
|
|
104
107
|
const { messageFeedsInfo, messagePreviews, ...restRawPayload } = rawPayload;
|
|
105
108
|
|
|
106
109
|
return {
|
|
107
110
|
...restRawPayload,
|
|
111
|
+
users,
|
|
108
112
|
channels,
|
|
109
113
|
channelUsers,
|
|
110
114
|
};
|
|
@@ -128,6 +128,12 @@ export class CommunityMembersLiveCollectionController extends LiveCollectionCont
|
|
|
128
128
|
communityMembers = filterBySearchTerm(communityMembers, this.query.search);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
if (typeof this.query.includeDeleted === 'boolean') {
|
|
132
|
+
communityMembers = communityMembers.filter(
|
|
133
|
+
({ user }) => user?.isDeleted === this.query.includeDeleted,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
131
137
|
switch (this.query.sortBy) {
|
|
132
138
|
case 'firstCreated':
|
|
133
139
|
communityMembers = communityMembers.sort(sortByFirstCreated);
|
|
@@ -125,6 +125,12 @@ export class SearchCommunityMembersLiveCollectionController extends LiveCollecti
|
|
|
125
125
|
communityMembers = filterBySearchTerm(communityMembers, this.query.search);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
+
if (typeof this.query.includeDeleted === 'boolean') {
|
|
129
|
+
communityMembers = communityMembers.filter(
|
|
130
|
+
({ user }) => user?.isDeleted === this.query.includeDeleted,
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
128
134
|
return communityMembers;
|
|
129
135
|
}
|
|
130
136
|
}
|
package/src/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.ts
CHANGED
|
@@ -136,11 +136,11 @@ export class CommunityLiveCollectionController extends LiveCollectionController<
|
|
|
136
136
|
if (!this.query.displayName) {
|
|
137
137
|
const sortFn = (() => {
|
|
138
138
|
switch (this.query.sortBy) {
|
|
139
|
-
case
|
|
139
|
+
case Amity.CommunitySortByEnum.FirstCreated:
|
|
140
140
|
return sortByFirstCreated;
|
|
141
|
-
case
|
|
141
|
+
case Amity.CommunitySortByEnum.LastCreated:
|
|
142
142
|
return sortByLastCreated;
|
|
143
|
-
case
|
|
143
|
+
case Amity.CommunitySortByEnum.DisplayName:
|
|
144
144
|
return sortByDisplayName;
|
|
145
145
|
default:
|
|
146
146
|
return sortByLastCreated;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { CommunityPostSettingMaps, DefaultCommunityPostSetting } from '~/@types';
|
|
2
|
-
import { pullFromCache } from '~/cache/api';
|
|
3
|
-
import { withUsers } from '~/group/utils';
|
|
4
2
|
import { updateMembershipStatus } from './communityWithMembership';
|
|
5
3
|
|
|
6
4
|
const getMatchPostSetting = (value: {
|
|
@@ -14,31 +12,8 @@ const getMatchPostSetting = (value: {
|
|
|
14
12
|
value.onlyAdminCanPost === CommunityPostSettingMaps[key].onlyAdminCanPost,
|
|
15
13
|
) ?? DefaultCommunityPostSetting;
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
) => {
|
|
20
|
-
if (!communityUsers) return communityUsers;
|
|
21
|
-
|
|
22
|
-
const result: {
|
|
23
|
-
[key: string]: Amity.RawMembership<'community'>;
|
|
24
|
-
} = {};
|
|
25
|
-
|
|
26
|
-
communityUsers.forEach(user => {
|
|
27
|
-
result[`${user.userId}#${user.communityId}`] = user;
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
return result;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
export const convertCommunityPayload = (rawPayload: {
|
|
34
|
-
communities: Amity.RawCommunity[];
|
|
35
|
-
communityUsers: Amity.RawMembership<'community'>[];
|
|
36
|
-
}): {
|
|
37
|
-
communities: Amity.Community[];
|
|
38
|
-
communityUsers: Amity.Membership<'community'>[];
|
|
39
|
-
} => {
|
|
40
|
-
// Unpack community payload by mapping payload field to postSetting value.
|
|
41
|
-
const communities = rawPayload.communities.map<Amity.Community>(
|
|
15
|
+
export function addPostSetting({ communities }: { communities: Amity.RawCommunity[] }) {
|
|
16
|
+
return communities.map<Amity.Community>(
|
|
42
17
|
({ needApprovalOnPostCreation, onlyAdminCanPost, ...restCommunityPayload }) => ({
|
|
43
18
|
postSetting: getMatchPostSetting({
|
|
44
19
|
needApprovalOnPostCreation,
|
|
@@ -47,44 +22,34 @@ export const convertCommunityPayload = (rawPayload: {
|
|
|
47
22
|
...restCommunityPayload,
|
|
48
23
|
}),
|
|
49
24
|
);
|
|
50
|
-
|
|
51
|
-
const mergeCommunityUsers = communities.reduce<{
|
|
52
|
-
[key: string]: Amity.RawMembership<'community'>;
|
|
53
|
-
}>((acc, { communityId }) => {
|
|
54
|
-
const users = pullFromCache<Amity.RawMembership<'community'>[]>([
|
|
55
|
-
'communityUsers',
|
|
56
|
-
'collection',
|
|
57
|
-
communityId,
|
|
58
|
-
])?.data;
|
|
59
|
-
|
|
60
|
-
if (!users) return acc;
|
|
61
|
-
|
|
62
|
-
return {
|
|
63
|
-
...convertCommunityUsersToUniqueObject(users),
|
|
64
|
-
...acc,
|
|
65
|
-
};
|
|
66
|
-
}, convertCommunityUsersToUniqueObject(rawPayload.communityUsers));
|
|
67
|
-
|
|
68
|
-
const communityUsers = withUsers(Object.values(mergeCommunityUsers));
|
|
69
|
-
|
|
70
|
-
const communityWithMembershipStatus = updateMembershipStatus(communities, communityUsers);
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
...rawPayload,
|
|
74
|
-
communities: communityWithMembershipStatus,
|
|
75
|
-
communityUsers,
|
|
76
|
-
};
|
|
77
|
-
};
|
|
25
|
+
}
|
|
78
26
|
|
|
79
27
|
export const prepareCommunityPayload = (
|
|
80
28
|
rawPayload: Amity.CommunityPayload,
|
|
81
29
|
): Amity.ProcessedCommunityPayload => {
|
|
82
|
-
const { communities
|
|
30
|
+
const communitiesWithPostSetting = addPostSetting({ communities: rawPayload.communities });
|
|
31
|
+
|
|
32
|
+
// map users with community
|
|
33
|
+
const mappedCommunityUsers: Array<Amity.Membership<'community'>> = rawPayload.communityUsers.map(
|
|
34
|
+
communityUser => {
|
|
35
|
+
const user = rawPayload.users.find(user => user.userId === communityUser.userId)!;
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
...communityUser,
|
|
39
|
+
user,
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const communityWithMembershipStatus = updateMembershipStatus(
|
|
45
|
+
communitiesWithPostSetting,
|
|
46
|
+
mappedCommunityUsers,
|
|
47
|
+
);
|
|
83
48
|
|
|
84
49
|
return {
|
|
85
50
|
...rawPayload,
|
|
86
|
-
communities,
|
|
87
|
-
communityUsers,
|
|
51
|
+
communities: communityWithMembershipStatus,
|
|
52
|
+
communityUsers: mappedCommunityUsers,
|
|
88
53
|
};
|
|
89
54
|
};
|
|
90
55
|
|
package/src/core/model/index.ts
CHANGED
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
import { pullFromCache } from '~/cache/api/pullFromCache';
|
|
2
2
|
import { getActiveClient } from '~/client/api/activeClient';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Attach user object to membership model
|
|
6
|
+
* - If cache is not enabled, set user to undefined ({..., user: undefined})
|
|
7
|
+
* - If user object is not found in cache, set user to undefined
|
|
8
|
+
* ({..., user: undefined})
|
|
9
|
+
* - If a user is found in the cache, it attaches the user from the cache
|
|
10
|
+
* ({..., user: { userId, displayName,... }})
|
|
11
|
+
*
|
|
12
|
+
* @param member The membership model object
|
|
13
|
+
* @returns The membership model object that is already mapped to user
|
|
14
|
+
* @hidden
|
|
15
|
+
*/
|
|
16
|
+
export const convertRawMembershipToMembership = <T extends Amity.GroupType>(
|
|
17
|
+
member: Amity.RawMembership<T>,
|
|
18
|
+
): Amity.Membership<T> => {
|
|
19
|
+
return {
|
|
20
|
+
...member,
|
|
21
|
+
get user() {
|
|
22
|
+
const client = getActiveClient();
|
|
23
|
+
|
|
24
|
+
if (!client.cache) return undefined;
|
|
25
|
+
|
|
26
|
+
const userCache = pullFromCache<Amity.InternalUser>(['user', 'get', member.userId])?.data;
|
|
27
|
+
|
|
28
|
+
if (!userCache) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return userCache;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
4
37
|
/**
|
|
5
38
|
* Attach user object to membership model
|
|
6
39
|
* - If cache is not enabled, set user to undefined ({..., user: undefined})
|
|
@@ -1,16 +1 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
|
|
3
|
-
export * from './createPost';
|
|
4
|
-
export * from './updatePost';
|
|
5
|
-
export * from './editPost';
|
|
6
|
-
|
|
7
|
-
export * from './deletePost';
|
|
8
|
-
export * from './softDeletePost';
|
|
9
|
-
export * from './hardDeletePost';
|
|
10
|
-
|
|
11
|
-
export * from './approvePost';
|
|
12
|
-
export * from './declinePost';
|
|
13
|
-
|
|
14
|
-
export * from './flagPost';
|
|
15
|
-
export * from './unflagPost';
|
|
16
|
-
export * from './isPostFlaggedByMe';
|
|
1
|
+
export * from './getPost';
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import hash from 'object-hash';
|
|
2
|
+
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
3
|
+
import { PinnedPostPaginationController } from './PinnedPostPaginationController';
|
|
4
|
+
import { PinnedPostQueryStreamController } from './PinnedPostQueryStreamController';
|
|
5
|
+
import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
|
|
6
|
+
import { isNonNullable } from '~/utils';
|
|
7
|
+
import { LinkedObject } from '~/utils/linkedObject';
|
|
8
|
+
import { sortByLastCreated } from '~/core/query';
|
|
9
|
+
|
|
10
|
+
export class PinnedPostLiveCollectionController extends LiveCollectionController<
|
|
11
|
+
'pinnedPost',
|
|
12
|
+
Amity.PinnedPostLiveCollection,
|
|
13
|
+
Amity.PinnedPost,
|
|
14
|
+
PinnedPostPaginationController
|
|
15
|
+
> {
|
|
16
|
+
private queryStreamController: PinnedPostQueryStreamController;
|
|
17
|
+
|
|
18
|
+
private query: Amity.PinnedPostLiveCollection;
|
|
19
|
+
|
|
20
|
+
constructor(
|
|
21
|
+
query: Amity.PinnedPostLiveCollection,
|
|
22
|
+
callback: Amity.LiveCollectionCallback<Amity.PinnedPost>,
|
|
23
|
+
) {
|
|
24
|
+
const queryStreamId = hash(query);
|
|
25
|
+
const cacheKey = ['pinnedPosts', 'collection', queryStreamId];
|
|
26
|
+
const paginationController = new PinnedPostPaginationController(query);
|
|
27
|
+
|
|
28
|
+
super(paginationController, queryStreamId, cacheKey, callback);
|
|
29
|
+
|
|
30
|
+
this.query = query;
|
|
31
|
+
this.queryStreamController = new PinnedPostQueryStreamController(
|
|
32
|
+
this.query,
|
|
33
|
+
this.cacheKey,
|
|
34
|
+
this.notifyChange.bind(this),
|
|
35
|
+
response => response,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
this.callback = callback.bind(this);
|
|
39
|
+
this.loadPage({ initial: true });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected setup() {
|
|
43
|
+
const collection = pullFromCache<Amity.PostLiveCollectionCache>(this.cacheKey)?.data;
|
|
44
|
+
if (!collection) {
|
|
45
|
+
pushToCache(this.cacheKey, {
|
|
46
|
+
data: [],
|
|
47
|
+
params: {},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
protected async persistModel(queryPayload: Amity.PinnedPostPayload & Amity.Pagination) {
|
|
53
|
+
await this.queryStreamController.saveToMainDB(queryPayload);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected persistQueryStream({
|
|
57
|
+
response,
|
|
58
|
+
direction,
|
|
59
|
+
refresh,
|
|
60
|
+
}: Amity.LiveCollectionPersistQueryStreamParams<'pinnedPost'>) {
|
|
61
|
+
this.queryStreamController.appendToQueryStream(response, direction, refresh);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// eslint-disable-next-line class-methods-use-this
|
|
65
|
+
startSubscription() {
|
|
66
|
+
return [] as Amity.Unsubscriber[];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
|
|
70
|
+
const collection = pullFromCache<Amity.PinnedPostLiveCollectionCache>(this.cacheKey)?.data;
|
|
71
|
+
if (!collection) return;
|
|
72
|
+
|
|
73
|
+
let data = (
|
|
74
|
+
collection.data
|
|
75
|
+
.map(id => pullFromCache<Amity.InternalPin>(['pin', 'get', id])!)
|
|
76
|
+
.filter(isNonNullable)
|
|
77
|
+
.map(({ data }) => data) ?? []
|
|
78
|
+
).map(LinkedObject.pinnedPost);
|
|
79
|
+
|
|
80
|
+
data = this.applyFilter(data);
|
|
81
|
+
|
|
82
|
+
if (!this.shouldNotify(data) && origin === 'event') return;
|
|
83
|
+
|
|
84
|
+
this.callback({
|
|
85
|
+
data,
|
|
86
|
+
loading,
|
|
87
|
+
error,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private applyFilter(data: Amity.PinnedPost[]) {
|
|
92
|
+
let pinnedPost = data;
|
|
93
|
+
switch (this.query.sortBy) {
|
|
94
|
+
case 'lastCreated':
|
|
95
|
+
pinnedPost = pinnedPost.sort(({ post: postA }, { post: postB }) =>
|
|
96
|
+
sortByLastCreated({ createdAt: postA?.createdAt! }, { createdAt: postB?.createdAt! }),
|
|
97
|
+
);
|
|
98
|
+
break;
|
|
99
|
+
default:
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
return pinnedPost;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PaginationController } from '~/core/liveCollection/PaginationController';
|
|
2
|
+
import { COLLECTION_DEFAULT_PAGINATION_LIMIT } from '~/utils/constants';
|
|
3
|
+
|
|
4
|
+
export class PinnedPostPaginationController extends PaginationController<
|
|
5
|
+
'pinnedPost',
|
|
6
|
+
Amity.PinnedPostLiveCollection
|
|
7
|
+
> {
|
|
8
|
+
async getRequest(queryParams: Amity.PinnedPostLiveCollection, token: string | undefined) {
|
|
9
|
+
const { limit = COLLECTION_DEFAULT_PAGINATION_LIMIT, ...params } = queryParams;
|
|
10
|
+
|
|
11
|
+
const { communityId, placement } = params;
|
|
12
|
+
|
|
13
|
+
const path = placement
|
|
14
|
+
? `/api/v1/pinned-posts/communities/${communityId}/${placement}`
|
|
15
|
+
: `/api/v1/pinned-posts/communities/${communityId}`;
|
|
16
|
+
|
|
17
|
+
const { data: queryResponse } = await this.http.get<Amity.PinnedPostPayload & Amity.Pagination>(
|
|
18
|
+
path,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
return queryResponse;
|
|
22
|
+
}
|
|
23
|
+
}
|