@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.
Files changed (172) hide show
  1. package/.env +26 -26
  2. package/dist/@types/core/model.d.ts +4 -0
  3. package/dist/@types/core/model.d.ts.map +1 -1
  4. package/dist/@types/core/payload.d.ts +17 -6
  5. package/dist/@types/core/payload.d.ts.map +1 -1
  6. package/dist/@types/domains/channel.d.ts +8 -0
  7. package/dist/@types/domains/channel.d.ts.map +1 -1
  8. package/dist/@types/domains/comment.d.ts +5 -4
  9. package/dist/@types/domains/comment.d.ts.map +1 -1
  10. package/dist/@types/domains/community.d.ts +32 -8
  11. package/dist/@types/domains/community.d.ts.map +1 -1
  12. package/dist/@types/domains/group.d.ts +13 -7
  13. package/dist/@types/domains/group.d.ts.map +1 -1
  14. package/dist/@types/domains/pin.d.ts +22 -0
  15. package/dist/@types/domains/pin.d.ts.map +1 -0
  16. package/dist/@types/domains/pinnedPost.d.ts +28 -0
  17. package/dist/@types/domains/pinnedPost.d.ts.map +1 -0
  18. package/dist/@types/domains/poll.d.ts +3 -1
  19. package/dist/@types/domains/poll.d.ts.map +1 -1
  20. package/dist/@types/domains/post.d.ts +6 -5
  21. package/dist/@types/domains/post.d.ts.map +1 -1
  22. package/dist/@types/domains/stream.d.ts +2 -1
  23. package/dist/@types/domains/stream.d.ts.map +1 -1
  24. package/dist/@types/domains/user.d.ts +34 -6
  25. package/dist/@types/domains/user.d.ts.map +1 -1
  26. package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberLiveCollectionController.d.ts.map +1 -1
  27. package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberPaginationController.d.ts +3 -2
  28. package/dist/channelRepository/channelMembership/observers/getMembers/ChannelMemberPaginationController.d.ts.map +1 -1
  29. package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberLiveCollectionController.d.ts +14 -0
  30. package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberLiveCollectionController.d.ts.map +1 -0
  31. package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberPaginationController.d.ts +14 -0
  32. package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberPaginationController.d.ts.map +1 -0
  33. package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberQueryStreamController.d.ts +14 -0
  34. package/dist/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberQueryStreamController.d.ts.map +1 -0
  35. package/dist/channelRepository/channelMembership/observers/searchMembers/index.d.ts +2 -0
  36. package/dist/channelRepository/channelMembership/observers/searchMembers/index.d.ts.map +1 -0
  37. package/dist/channelRepository/channelMembership/observers/searchMembers/searchMembers.d.ts +21 -0
  38. package/dist/channelRepository/channelMembership/observers/searchMembers/searchMembers.d.ts.map +1 -0
  39. package/dist/channelRepository/observers/getChannels/ChannelPaginationController.d.ts +3 -3
  40. package/dist/channelRepository/utils/prepareChannelPayload.d.ts.map +1 -1
  41. package/dist/channelRepository/utils/tests/prepareChannelPayload.test.d.ts +1 -1
  42. package/dist/channelRepository/utils/tests/prepareChannelPayload.test.d.ts.map +1 -1
  43. package/dist/communityRepository/communityMembership/observers/getMembers/CommunityMembersLiveCollectionController.d.ts.map +1 -1
  44. package/dist/communityRepository/communityMembership/observers/searchMembers/SearchCommunityMembersLiveCollectionController.d.ts.map +1 -1
  45. package/dist/communityRepository/utils/payload.d.ts +2 -6
  46. package/dist/communityRepository/utils/payload.d.ts.map +1 -1
  47. package/dist/core/model/idResolvers.d.ts.map +1 -1
  48. package/dist/core/model/index.d.ts.map +1 -1
  49. package/dist/group/utils/withUser.d.ts +13 -0
  50. package/dist/group/utils/withUser.d.ts.map +1 -1
  51. package/dist/index.cjs.js +957 -614
  52. package/dist/index.esm.js +880 -537
  53. package/dist/index.umd.js +4 -4
  54. package/dist/pollRepository/observers/observePoll.d.ts +1 -1
  55. package/dist/pollRepository/observers/observePoll.d.ts.map +1 -1
  56. package/dist/postRepository/internalApi/index.d.ts +1 -12
  57. package/dist/postRepository/internalApi/index.d.ts.map +1 -1
  58. package/dist/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.d.ts +14 -0
  59. package/dist/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.d.ts.map +1 -0
  60. package/dist/postRepository/observers/getPinnedPosts/PinnedPostPaginationController.d.ts +13 -0
  61. package/dist/postRepository/observers/getPinnedPosts/PinnedPostPaginationController.d.ts.map +1 -0
  62. package/dist/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.d.ts +9 -0
  63. package/dist/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.d.ts.map +1 -0
  64. package/dist/postRepository/observers/getPinnedPosts.d.ts +12 -0
  65. package/dist/postRepository/observers/getPinnedPosts.d.ts.map +1 -0
  66. package/dist/postRepository/observers/index.d.ts +1 -0
  67. package/dist/postRepository/observers/index.d.ts.map +1 -1
  68. package/dist/postRepository/utils/payload.d.ts.map +1 -1
  69. package/dist/report/api/createReport.d.ts +1 -2
  70. package/dist/report/api/createReport.d.ts.map +1 -1
  71. package/dist/report/api/deleteReport.d.ts +1 -2
  72. package/dist/report/api/deleteReport.d.ts.map +1 -1
  73. package/dist/report/api/isReportedByMe.d.ts +1 -2
  74. package/dist/report/api/isReportedByMe.d.ts.map +1 -1
  75. package/dist/streamRepository/observers/getStreams/GetStreamsPageController.d.ts +1 -1
  76. package/dist/userRepository/api/flagUser.d.ts.map +1 -1
  77. package/dist/userRepository/api/getUser.d.ts.map +1 -1
  78. package/dist/userRepository/api/getUserByIds.d.ts.map +1 -1
  79. package/dist/userRepository/api/queryBlockedUsers.d.ts.map +1 -1
  80. package/dist/userRepository/api/queryUsers.d.ts.map +1 -1
  81. package/dist/userRepository/api/unflagUser.d.ts.map +1 -1
  82. package/dist/userRepository/api/updateUser.d.ts.map +1 -1
  83. package/dist/userRepository/events/utils.d.ts.map +1 -1
  84. package/dist/userRepository/internalApi/getUser.d.ts.map +1 -1
  85. package/dist/userRepository/internalApi/queryUsers.d.ts.map +1 -1
  86. package/dist/userRepository/observers/enums.d.ts +8 -0
  87. package/dist/userRepository/observers/enums.d.ts.map +1 -0
  88. package/dist/userRepository/observers/getUsers/UserLiveCollectionController.d.ts +14 -0
  89. package/dist/userRepository/observers/getUsers/UserLiveCollectionController.d.ts.map +1 -0
  90. package/dist/userRepository/observers/getUsers/UserPaginationController.d.ts +5 -0
  91. package/dist/userRepository/observers/getUsers/UserPaginationController.d.ts.map +1 -0
  92. package/dist/userRepository/observers/getUsers/UserQueryStreamController.d.ts +15 -0
  93. package/dist/userRepository/observers/getUsers/UserQueryStreamController.d.ts.map +1 -0
  94. package/dist/userRepository/observers/getUsers.d.ts +0 -1
  95. package/dist/userRepository/observers/getUsers.d.ts.map +1 -1
  96. package/dist/userRepository/observers/searchUserByDisplayName/SearchUserLiveCollectionController.d.ts +14 -0
  97. package/dist/userRepository/observers/searchUserByDisplayName/SearchUserLiveCollectionController.d.ts.map +1 -0
  98. package/dist/userRepository/observers/searchUserByDisplayName/SearchUserPaginationController.d.ts +5 -0
  99. package/dist/userRepository/observers/searchUserByDisplayName/SearchUserPaginationController.d.ts.map +1 -0
  100. package/dist/userRepository/observers/searchUserByDisplayName/SearchUserQueryStreamController.d.ts +15 -0
  101. package/dist/userRepository/observers/searchUserByDisplayName/SearchUserQueryStreamController.d.ts.map +1 -0
  102. package/dist/userRepository/observers/searchUserByDisplayName.d.ts.map +1 -1
  103. package/dist/userRepository/utils/index.d.ts +3 -0
  104. package/dist/userRepository/utils/index.d.ts.map +1 -0
  105. package/dist/utils/linkedObject/index.d.ts +2 -1
  106. package/dist/utils/linkedObject/index.d.ts.map +1 -1
  107. package/dist/utils/linkedObject/pinnedPostLinkedObject.d.ts +2 -0
  108. package/dist/utils/linkedObject/pinnedPostLinkedObject.d.ts.map +1 -0
  109. package/dist/utils/tests/dummy/channel.d.ts +12 -12
  110. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  111. package/dist/utils/tests/dummy/community.d.ts +2 -2
  112. package/dist/utils/tests/dummy/user.d.ts +10 -2
  113. package/dist/utils/tests/dummy/user.d.ts.map +1 -1
  114. package/package.json +1 -1
  115. package/src/@types/core/model.ts +6 -0
  116. package/src/@types/core/payload.ts +17 -7
  117. package/src/@types/domains/channel.ts +13 -0
  118. package/src/@types/domains/comment.ts +6 -4
  119. package/src/@types/domains/community.ts +40 -12
  120. package/src/@types/domains/group.ts +14 -6
  121. package/src/@types/domains/pin.ts +27 -0
  122. package/src/@types/domains/pinnedPost.ts +35 -0
  123. package/src/@types/domains/poll.ts +5 -1
  124. package/src/@types/domains/post.ts +7 -5
  125. package/src/@types/domains/stream.ts +3 -1
  126. package/src/@types/domains/user.ts +49 -6
  127. package/src/channelRepository/channelMembership/observers/getMembers/ChannelMemberLiveCollectionController.ts +6 -0
  128. package/src/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberLiveCollectionController.ts +142 -0
  129. package/src/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberPaginationController.ts +28 -0
  130. package/src/channelRepository/channelMembership/observers/searchMembers/SearchChannelMemberQueryStreamController.ts +112 -0
  131. package/src/channelRepository/channelMembership/observers/searchMembers/index.ts +1 -0
  132. package/src/channelRepository/channelMembership/observers/searchMembers/searchMembers.ts +111 -0
  133. package/src/channelRepository/utils/prepareChannelPayload.ts +8 -4
  134. package/src/communityRepository/communityMembership/observers/getMembers/CommunityMembersLiveCollectionController.ts +6 -0
  135. package/src/communityRepository/communityMembership/observers/searchMembers/SearchCommunityMembersLiveCollectionController.ts +6 -0
  136. package/src/communityRepository/observers/getCommunities/CommunitiesLiveCollectionController.ts +3 -3
  137. package/src/communityRepository/utils/payload.ts +23 -58
  138. package/src/core/model/idResolvers.ts +3 -0
  139. package/src/core/model/index.ts +3 -0
  140. package/src/group/utils/withUser.ts +33 -0
  141. package/src/postRepository/internalApi/index.ts +1 -16
  142. package/src/postRepository/observers/getPinnedPosts/PinnedPostLiveCollectionController.ts +104 -0
  143. package/src/postRepository/observers/getPinnedPosts/PinnedPostPaginationController.ts +23 -0
  144. package/src/postRepository/observers/getPinnedPosts/PinnedPostQueryStreamController.ts +61 -0
  145. package/src/postRepository/observers/getPinnedPosts.ts +41 -0
  146. package/src/postRepository/observers/index.ts +1 -0
  147. package/src/postRepository/utils/payload.ts +23 -7
  148. package/src/report/api/createReport.ts +100 -31
  149. package/src/report/api/deleteReport.ts +100 -31
  150. package/src/report/api/isReportedByMe.ts +72 -11
  151. package/src/userRepository/api/flagUser.ts +5 -2
  152. package/src/userRepository/api/getUser.ts +4 -43
  153. package/src/userRepository/api/getUserByIds.ts +5 -2
  154. package/src/userRepository/api/queryBlockedUsers.ts +6 -6
  155. package/src/userRepository/api/queryUsers.ts +11 -87
  156. package/src/userRepository/api/unflagUser.ts +5 -2
  157. package/src/userRepository/api/updateUser.ts +5 -11
  158. package/src/userRepository/events/utils.ts +4 -1
  159. package/src/userRepository/internalApi/getUser.ts +12 -16
  160. package/src/userRepository/internalApi/queryUsers.ts +7 -4
  161. package/src/userRepository/observers/enums.ts +7 -0
  162. package/src/userRepository/observers/getUsers/UserLiveCollectionController.ts +131 -0
  163. package/src/userRepository/observers/getUsers/UserPaginationController.ts +25 -0
  164. package/src/userRepository/observers/getUsers/UserQueryStreamController.ts +82 -0
  165. package/src/userRepository/observers/getUsers.ts +7 -137
  166. package/src/userRepository/observers/searchUserByDisplayName/SearchUserLiveCollectionController.ts +116 -0
  167. package/src/userRepository/observers/searchUserByDisplayName/SearchUserPaginationController.ts +25 -0
  168. package/src/userRepository/observers/searchUserByDisplayName/SearchUserQueryStreamController.ts +82 -0
  169. package/src/userRepository/observers/searchUserByDisplayName.ts +25 -1
  170. package/src/userRepository/utils/index.ts +13 -0
  171. package/src/utils/linkedObject/index.ts +2 -0
  172. 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 { withUsers } from '~/group/utils/withUser';
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 { getUserMessageFeedMakers } from '~/marker/api/getUserMessageFeedMarkers';
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'>[] = withUsers(rawPayload.channelUsers);
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
  }
@@ -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 'firstCreated':
139
+ case Amity.CommunitySortByEnum.FirstCreated:
140
140
  return sortByFirstCreated;
141
- case 'lastCreated':
141
+ case Amity.CommunitySortByEnum.LastCreated:
142
142
  return sortByLastCreated;
143
- case 'displayName':
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
- const convertCommunityUsersToUniqueObject = (
18
- communityUsers: Amity.RawMembership<'community'>[],
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, communityUsers } = convertCommunityPayload(rawPayload);
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
 
@@ -56,6 +56,9 @@ const idResolvers: Resolvers = {
56
56
 
57
57
  ad: ({ adId }) => adId,
58
58
  advertiser: ({ advertiserId }) => advertiserId,
59
+
60
+ pin: ({ referenceId }) => referenceId,
61
+ pinTarget: ({ targetId }) => targetId,
59
62
  };
60
63
 
61
64
  /**
@@ -49,6 +49,9 @@ export const PAYLOAD2MODEL: Record<string, Amity.Domain> = {
49
49
  feeds: 'feed',
50
50
  ads: 'ad',
51
51
  advertisers: 'advertiser',
52
+
53
+ pinTargets: 'pinTarget',
54
+ pins: 'pin',
52
55
  };
53
56
 
54
57
  /** hidden */
@@ -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 './getPostByIds';
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
+ }