@amityco/ts-sdk 0.0.1-beta.37 → 0.0.1-beta.39

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 (251) hide show
  1. package/.eslintrc.json +3 -5
  2. package/dist/@types/core/events.d.ts +1 -0
  3. package/dist/@types/core/events.d.ts.map +1 -1
  4. package/dist/@types/core/model.d.ts +2 -0
  5. package/dist/@types/core/model.d.ts.map +1 -1
  6. package/dist/@types/domains/category.d.ts +7 -0
  7. package/dist/@types/domains/category.d.ts.map +1 -1
  8. package/dist/@types/domains/channel.d.ts +2 -2
  9. package/dist/@types/domains/channel.d.ts.map +1 -1
  10. package/dist/@types/domains/community.d.ts +12 -0
  11. package/dist/@types/domains/community.d.ts.map +1 -1
  12. package/dist/@types/domains/feed.d.ts +1 -2
  13. package/dist/@types/domains/feed.d.ts.map +1 -1
  14. package/dist/@types/domains/message.d.ts +1 -1
  15. package/dist/@types/domains/message.d.ts.map +1 -1
  16. package/dist/@types/domains/post.d.ts +1 -1
  17. package/dist/@types/domains/post.d.ts.map +1 -1
  18. package/dist/@types/domains/user.d.ts +8 -0
  19. package/dist/@types/domains/user.d.ts.map +1 -1
  20. package/dist/@types/global.d.ts +5 -0
  21. package/dist/@types/global.d.ts.map +1 -1
  22. package/dist/category/api/queryCategories.d.ts +1 -5
  23. package/dist/category/api/queryCategories.d.ts.map +1 -1
  24. package/dist/category/observers/index.d.ts +2 -0
  25. package/dist/category/observers/index.d.ts.map +1 -0
  26. package/dist/category/observers/liveCategories.d.ts +18 -0
  27. package/dist/category/observers/liveCategories.d.ts.map +1 -0
  28. package/dist/category/observers/tests/liveCategories.test.d.ts +2 -0
  29. package/dist/category/observers/tests/liveCategories.test.d.ts.map +1 -0
  30. package/dist/channel/api/tests/getChannels.test.d.ts +2 -0
  31. package/dist/channel/api/tests/getChannels.test.d.ts.map +1 -0
  32. package/dist/channel/api/tests/leaveChannel.test.d.ts +2 -0
  33. package/dist/channel/api/tests/leaveChannel.test.d.ts.map +1 -0
  34. package/dist/channel/observers/liveChannel.d.ts.map +1 -1
  35. package/dist/channel/observers/liveChannels.d.ts.map +1 -1
  36. package/dist/client/api/accessTokenExpiryWatcher.d.ts +4 -1
  37. package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -1
  38. package/dist/client/api/connectClient.d.ts.map +1 -1
  39. package/dist/client/api/getToken.d.ts +3 -1
  40. package/dist/client/api/getToken.d.ts.map +1 -1
  41. package/dist/client/utils/setClientToken.d.ts +3 -3
  42. package/dist/comment/api/deleteComment.d.ts.map +1 -1
  43. package/dist/comment/api/getComment.d.ts.map +1 -1
  44. package/dist/comment/observers/index.d.ts +1 -0
  45. package/dist/comment/observers/index.d.ts.map +1 -1
  46. package/dist/comment/observers/liveComment.d.ts +21 -0
  47. package/dist/comment/observers/liveComment.d.ts.map +1 -0
  48. package/dist/comment/observers/tests/liveComment.test.d.ts +2 -0
  49. package/dist/comment/observers/tests/liveComment.test.d.ts.map +1 -0
  50. package/dist/community/api/queryCommunities.d.ts +1 -10
  51. package/dist/community/api/queryCommunities.d.ts.map +1 -1
  52. package/dist/community/events/index.d.ts +1 -0
  53. package/dist/community/events/index.d.ts.map +1 -1
  54. package/dist/community/events/onCommunityUserChanged.d.ts +17 -0
  55. package/dist/community/events/onCommunityUserChanged.d.ts.map +1 -0
  56. package/dist/community/events/utils.d.ts +1 -0
  57. package/dist/community/events/utils.d.ts.map +1 -1
  58. package/dist/community/observers/index.d.ts +1 -0
  59. package/dist/community/observers/index.d.ts.map +1 -1
  60. package/dist/community/observers/liveCommunities.d.ts +20 -0
  61. package/dist/community/observers/liveCommunities.d.ts.map +1 -0
  62. package/dist/community/observers/tests/liveCommunities.test.d.ts +2 -0
  63. package/dist/community/observers/tests/liveCommunities.test.d.ts.map +1 -0
  64. package/dist/core/events.d.ts +3 -3
  65. package/dist/core/events.d.ts.map +1 -1
  66. package/dist/core/model/idResolvers.d.ts.map +1 -1
  67. package/dist/core/model/identifyModel.d.ts.map +1 -1
  68. package/dist/core/model/index.d.ts.map +1 -1
  69. package/dist/core/query/filtering.d.ts +10 -0
  70. package/dist/core/query/filtering.d.ts.map +1 -1
  71. package/dist/core/query/paging.d.ts +2 -2
  72. package/dist/core/query/paging.d.ts.map +1 -1
  73. package/dist/core/query/sorting.d.ts +6 -0
  74. package/dist/core/query/sorting.d.ts.map +1 -1
  75. package/dist/core/query/tests/paging.test.d.ts +2 -0
  76. package/dist/core/query/tests/paging.test.d.ts.map +1 -0
  77. package/dist/core/transports/http.d.ts +0 -5
  78. package/dist/core/transports/http.d.ts.map +1 -1
  79. package/dist/file/api/test/createImage.test.d.ts +2 -0
  80. package/dist/file/api/test/createImage.test.d.ts.map +1 -0
  81. package/dist/file/api/test/createVideo.test.d.ts +2 -0
  82. package/dist/file/api/test/createVideo.test.d.ts.map +1 -0
  83. package/dist/index.cjs.js +607 -252
  84. package/dist/index.d.ts +1 -0
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.esm.js +599 -251
  87. package/dist/index.umd.js +4 -4
  88. package/dist/message/api/queryMessages.d.ts +2 -2
  89. package/dist/message/api/queryMessages.d.ts.map +1 -1
  90. package/dist/message/observers/liveMessage.d.ts.map +1 -1
  91. package/dist/post/observers/index.d.ts +1 -0
  92. package/dist/post/observers/index.d.ts.map +1 -1
  93. package/dist/post/observers/livePost.d.ts +21 -0
  94. package/dist/post/observers/livePost.d.ts.map +1 -0
  95. package/dist/post/observers/livePosts.d.ts +2 -2
  96. package/dist/post/observers/livePosts.d.ts.map +1 -1
  97. package/dist/post/observers/tests/livePost.test.d.ts +2 -0
  98. package/dist/post/observers/tests/livePost.test.d.ts.map +1 -0
  99. package/dist/report/api/createReport.d.ts.map +1 -1
  100. package/dist/report/api/deleteReport.d.ts.map +1 -1
  101. package/dist/report/api/tests/createReport.test.d.ts +2 -0
  102. package/dist/report/api/tests/createReport.test.d.ts.map +1 -0
  103. package/dist/report/api/tests/deleteReport.test.d.ts +2 -0
  104. package/dist/report/api/tests/deleteReport.test.d.ts.map +1 -0
  105. package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts +2 -0
  106. package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts.map +1 -0
  107. package/dist/subChannel/api/tests/getSubChannel.test.d.ts +2 -0
  108. package/dist/subChannel/api/tests/getSubChannel.test.d.ts.map +1 -0
  109. package/dist/subChannel/api/tests/getSubChannels.test.d.ts +2 -0
  110. package/dist/subChannel/api/tests/getSubChannels.test.d.ts.map +1 -0
  111. package/dist/subChannel/api/tests/updateSubChannel.test.d.ts +2 -0
  112. package/dist/subChannel/api/tests/updateSubChannel.test.d.ts.map +1 -0
  113. package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
  114. package/dist/user/api/queryUsers.d.ts +1 -6
  115. package/dist/user/api/queryUsers.d.ts.map +1 -1
  116. package/dist/user/api/tests/updateUser.test.d.ts +2 -0
  117. package/dist/user/api/tests/updateUser.test.d.ts.map +1 -0
  118. package/dist/user/observers/index.d.ts +1 -0
  119. package/dist/user/observers/index.d.ts.map +1 -1
  120. package/dist/user/observers/liveUser.d.ts.map +1 -1
  121. package/dist/user/observers/liveUsers.d.ts +18 -0
  122. package/dist/user/observers/liveUsers.d.ts.map +1 -0
  123. package/dist/user/observers/tests/liveUsers.test.d.ts +2 -0
  124. package/dist/user/observers/tests/liveUsers.test.d.ts.map +1 -0
  125. package/dist/utils/liveObject.d.ts +2 -0
  126. package/dist/utils/liveObject.d.ts.map +1 -0
  127. package/dist/utils/tests/dummy/category.d.ts +64 -0
  128. package/dist/utils/tests/dummy/category.d.ts.map +1 -0
  129. package/dist/utils/tests/dummy/channel.d.ts +50 -0
  130. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  131. package/dist/utils/tests/dummy/community.d.ts +132 -0
  132. package/dist/utils/tests/dummy/community.d.ts.map +1 -1
  133. package/dist/utils/tests/dummy/feed.d.ts +21 -0
  134. package/dist/utils/tests/dummy/feed.d.ts.map +1 -0
  135. package/dist/utils/tests/dummy/file.d.ts +3 -0
  136. package/dist/utils/tests/dummy/file.d.ts.map +1 -1
  137. package/dist/utils/tests/dummy/index.d.ts +2 -0
  138. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  139. package/dist/utils/tests/dummy/post.d.ts +11 -0
  140. package/dist/utils/tests/dummy/post.d.ts.map +1 -1
  141. package/dist/utils/tests/dummy/subChannel.d.ts +0 -20
  142. package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
  143. package/dist/utils/tests/dummy/user.d.ts +81 -0
  144. package/dist/utils/tests/dummy/user.d.ts.map +1 -1
  145. package/dist/utils/tests/liveObject.test.d.ts +2 -0
  146. package/dist/utils/tests/liveObject.test.d.ts.map +1 -0
  147. package/package.json +4 -4
  148. package/src/@types/core/events.ts +1 -0
  149. package/src/@types/core/model.ts +4 -0
  150. package/src/@types/domains/category.ts +13 -0
  151. package/src/@types/domains/channel.ts +2 -2
  152. package/src/@types/domains/community.ts +25 -0
  153. package/src/@types/domains/feed.ts +1 -3
  154. package/src/@types/domains/message.ts +4 -1
  155. package/src/@types/domains/post.ts +1 -1
  156. package/src/@types/domains/user.ts +14 -0
  157. package/src/@types/global.ts +5 -0
  158. package/src/cache/api/tests/ingestInCache.test.ts +2 -0
  159. package/src/category/api/queryCategories.ts +3 -5
  160. package/src/category/observers/index.ts +1 -0
  161. package/src/category/observers/liveCategories.ts +141 -0
  162. package/src/category/observers/tests/liveCategories.test.ts +147 -0
  163. package/src/channel/api/tests/createChannel.test.ts +30 -6
  164. package/src/channel/api/tests/getChannel.test.ts +3 -1
  165. package/src/channel/api/tests/getChannels.test.ts +97 -0
  166. package/src/channel/api/tests/joinChannel.test.ts +62 -3
  167. package/src/channel/api/tests/leaveChannel.test.ts +90 -0
  168. package/src/channel/api/tests/queryChannels.test.ts +38 -1
  169. package/src/channel/observers/liveChannel.ts +8 -80
  170. package/src/channel/observers/liveChannels.ts +29 -24
  171. package/src/client/api/accessTokenExpiryWatcher.ts +7 -5
  172. package/src/client/api/connectClient.ts +0 -2
  173. package/src/client/api/tests/accessTokenExpiryWatcher.test.ts +8 -5
  174. package/src/comment/api/deleteComment.ts +5 -5
  175. package/src/comment/api/getComment.ts +8 -3
  176. package/src/comment/observers/index.ts +1 -0
  177. package/src/comment/observers/liveComment.ts +43 -0
  178. package/src/comment/observers/tests/liveComment.test.ts +95 -0
  179. package/src/community/api/queryCommunities.ts +3 -10
  180. package/src/community/api/test/addCommunityMember.test.ts +14 -2
  181. package/src/community/api/test/joinCommunity.test.ts +14 -2
  182. package/src/community/api/test/leaveCommunity.test.ts +11 -1
  183. package/src/community/api/test/removeCommunityMembers.test.ts +11 -1
  184. package/src/community/events/index.ts +1 -0
  185. package/src/community/events/onCommunityUserChanged.ts +20 -0
  186. package/src/community/events/test/onCommunityJoined.test.ts +1 -1
  187. package/src/community/events/test/onCommunityUserAdded.test.ts +1 -1
  188. package/src/community/events/test/onCommunityUserBanned.test.ts +1 -1
  189. package/src/community/events/test/onCommunityUserUnbaned.test.ts +1 -1
  190. package/src/community/events/test/utils.test.ts +52 -3
  191. package/src/community/events/utils.ts +49 -0
  192. package/src/community/observers/index.ts +1 -0
  193. package/src/community/observers/liveCommunities.ts +188 -0
  194. package/src/community/observers/tests/liveCommunities.test.ts +284 -0
  195. package/src/core/model/idResolvers.ts +2 -0
  196. package/src/core/model/identifyModel.ts +1 -0
  197. package/src/core/model/index.ts +2 -0
  198. package/src/core/query/filtering.ts +33 -3
  199. package/src/core/query/paging.ts +5 -4
  200. package/src/core/query/sorting.ts +8 -0
  201. package/src/core/query/tests/paging.test.ts +66 -0
  202. package/src/core/transports/http.ts +17 -13
  203. package/src/core/transports/test/http.test.ts +49 -60
  204. package/src/file/api/createFile.ts +1 -1
  205. package/src/file/api/createImage.ts +1 -1
  206. package/src/file/api/createVideo.ts +1 -1
  207. package/src/file/api/test/createImage.test.ts +69 -0
  208. package/src/file/api/test/createVideo.test.ts +81 -0
  209. package/src/index.ts +1 -0
  210. package/src/message/api/queryMessages.ts +7 -7
  211. package/src/message/api/tests/queryMessages.test.ts +6 -6
  212. package/src/message/observers/liveMessage.ts +11 -83
  213. package/src/message/tests/observers/liveMessage.test.ts +1 -143
  214. package/src/message/tests/observers/liveMessages.test.ts +4 -4
  215. package/src/post/observers/index.ts +1 -0
  216. package/src/post/observers/livePost.ts +47 -0
  217. package/src/post/observers/livePosts.ts +14 -22
  218. package/src/post/observers/tests/livePost.test.ts +97 -0
  219. package/src/post/observers/tests/livePosts.test.ts +65 -8
  220. package/src/report/api/createReport.ts +1 -6
  221. package/src/report/api/deleteReport.ts +2 -6
  222. package/src/report/api/tests/createReport.test.ts +93 -0
  223. package/src/report/api/tests/deleteReport.test.ts +93 -0
  224. package/src/stream/api/tests/createStream.test.ts +3 -11
  225. package/src/stream/api/tests/deleteStream.test.ts +5 -3
  226. package/src/subChannel/api/tests/createSubChannel.test.ts +21 -14
  227. package/src/subChannel/api/tests/deleteSubChannel.test.ts +112 -0
  228. package/src/subChannel/api/tests/getSubChannel.test.ts +97 -0
  229. package/src/subChannel/api/tests/getSubChannels.test.ts +97 -0
  230. package/src/subChannel/api/tests/updateSubChannel.test.ts +86 -0
  231. package/src/subChannel/observers/liveSubChannel.ts +6 -56
  232. package/src/subChannel/observers/tests/liveSubChannel.test.ts +0 -82
  233. package/src/user/api/queryUsers.ts +1 -6
  234. package/src/user/api/tests/updateUser.test.ts +60 -0
  235. package/src/user/observers/index.ts +1 -0
  236. package/src/user/observers/liveUser.ts +9 -61
  237. package/src/user/observers/liveUsers.ts +162 -0
  238. package/src/user/observers/tests/liveUsers.test.ts +202 -0
  239. package/src/user/tests/observers/liveUser.test.ts +1 -154
  240. package/src/utils/liveObject.ts +86 -0
  241. package/src/utils/tests/dummy/category.ts +57 -0
  242. package/src/utils/tests/dummy/channel.ts +52 -1
  243. package/src/utils/tests/dummy/community.ts +94 -0
  244. package/src/utils/tests/dummy/feed.ts +13 -0
  245. package/src/utils/tests/dummy/file.ts +32 -0
  246. package/src/utils/tests/dummy/index.ts +3 -0
  247. package/src/utils/tests/dummy/post.ts +62 -47
  248. package/src/utils/tests/dummy/stream.ts +73 -73
  249. package/src/utils/tests/dummy/subChannel.ts +0 -22
  250. package/src/utils/tests/dummy/user.ts +57 -0
  251. package/src/utils/tests/liveObject.test.ts +172 -0
@@ -1,6 +1,4 @@
1
- import { ASCApiError } from '~/core/errors';
2
1
  import { disableCache, enableCache } from '~/cache/api';
3
- import { LIVE_OBJECT_ENABLE_CACHE_MESSAGE } from '~/utils/constants';
4
2
  import {
5
3
  client,
6
4
  connectClient,
@@ -29,161 +27,10 @@ describe('liveUser', () => {
29
27
  await disconnectClient();
30
28
  });
31
29
 
32
- beforeEach(async () => {
33
- enableCache();
34
- });
30
+ beforeEach(enableCache);
35
31
 
36
32
  afterEach(disableCache);
37
33
 
38
- test('it should show user if cache not enabled', () => {
39
- /*
40
- * NOTE: at the time of writing this test cache is diabled by default, but
41
- * there is a proposal to enable cache by default. So I'm disabling cache
42
- * here to ensure cache is disabled
43
- */
44
- disableCache();
45
-
46
- const callback = jest.fn();
47
- jest.spyOn(global.console, 'log');
48
- client.http.get = jest.fn();
49
-
50
- // call liveUser check if mocked console get's called with the correct
51
- // user
52
- client.use();
53
- liveUser(defaultUser.userId, callback);
54
-
55
- expect(console.log).toBeCalledWith(LIVE_OBJECT_ENABLE_CACHE_MESSAGE);
56
- });
57
-
58
- test('it should return user live object', async () => {
59
- const snapshot = getSnapshot();
60
-
61
- // mock response of queryUsers and validate
62
- const callback = jest.fn();
63
- client.http.get = jest.fn().mockResolvedValue(userQueryResponse);
64
-
65
- liveUser(defaultUser.userId, callback);
66
-
67
- expect(callback).toHaveBeenCalledTimes(1);
68
-
69
- // check if cache data returned (should be empty)
70
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
71
-
72
- await pause();
73
-
74
- expect(callback).toHaveBeenCalledTimes(2);
75
-
76
- snapshot.loading = false;
77
- snapshot.data = defaultUser;
78
-
79
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
80
- });
81
-
82
- test('it should return error on api failure', async () => {
83
- const snapshot = getSnapshot();
84
- const error = new ASCApiError(
85
- 'server error!',
86
- Amity.ServerError.ITEM_NOT_FOUND,
87
- Amity.ErrorLevel.ERROR,
88
- );
89
-
90
- // mock response of queryUsers and validate
91
- const callback = jest.fn();
92
- client.http.get = jest.fn().mockRejectedValue(error);
93
-
94
- liveUser(defaultUser.userId, callback);
95
-
96
- expect(callback).toHaveBeenCalledTimes(1);
97
-
98
- // check if cache data returned (should be empty)
99
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
100
-
101
- await pause();
102
-
103
- expect(callback).toHaveBeenCalledTimes(2);
104
-
105
- snapshot.error = error;
106
- snapshot.loading = false;
107
- expect(callback).toHaveBeenLastCalledWith(expect.objectContaining(snapshot));
108
- });
109
-
110
- test('it should terminate updates on api failure', async () => {
111
- const snapshot = getSnapshot();
112
- const error = new ASCApiError(
113
- 'server error!',
114
- Amity.ServerError.ITEM_NOT_FOUND,
115
- Amity.ErrorLevel.ERROR,
116
- );
117
-
118
- // mock response of queryUsers and validate
119
- const callback = jest.fn();
120
- client.http.get = jest.fn().mockRejectedValue(error);
121
-
122
- liveUser(defaultUser.userId, callback);
123
-
124
- expect(callback).toHaveBeenCalledTimes(1);
125
-
126
- // check if cache data returned (should be empty)
127
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
128
-
129
- await pause();
130
-
131
- expect(callback).toHaveBeenCalledTimes(2);
132
-
133
- snapshot.error = error;
134
- snapshot.loading = false;
135
- expect(callback).toHaveBeenLastCalledWith(expect.objectContaining(snapshot));
136
-
137
- const updatedAt = new Date(defaultUser?.updatedAt ?? new Date());
138
- updatedAt.setDate(updatedAt.getDate() + 7);
139
-
140
- const updatedUser = {
141
- ...defaultUser,
142
- updatedAt: updatedAt.toISOString(),
143
- };
144
- client.emitter.emit('user.updated', { users: [updatedUser], files: [] });
145
-
146
- delete snapshot.error;
147
- snapshot.loading = false;
148
- snapshot.data = updatedUser;
149
- expect(callback).not.toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
150
- });
151
-
152
- test('it should not return updates on obtain once!', async () => {
153
- const snapshot = getSnapshot();
154
-
155
- // mock response of queryUsers and validate
156
- const callback = jest.fn();
157
- client.http.get = jest.fn().mockResolvedValue(userQueryResponse);
158
-
159
- const unsub = liveUser(defaultUser.userId, callback);
160
-
161
- expect(callback).toHaveBeenCalledTimes(1);
162
-
163
- // check if cache data returned (should be empty)
164
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
165
-
166
- await pause();
167
-
168
- expect(callback).toHaveBeenCalledTimes(2);
169
-
170
- unsub();
171
-
172
- const updatedAt = new Date(defaultUser?.updatedAt ?? new Date());
173
- updatedAt.setDate(updatedAt.getDate() + 7);
174
-
175
- const updatedUser = {
176
- ...defaultUser,
177
- updatedAt: updatedAt.toISOString(),
178
- };
179
- client.emitter.emit('user.updated', { users: [updatedUser], files: [] });
180
-
181
- delete snapshot.error;
182
- snapshot.loading = false;
183
- snapshot.data = updatedUser;
184
- expect(callback).not.toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
185
- });
186
-
187
34
  const events: [string, keyof Amity.Events][] = [
188
35
  ['it should return updated user on onFetch', 'user.fetched'],
189
36
  ['it should return updated user on onUpdate', 'user.updated'],
@@ -0,0 +1,86 @@
1
+ import { getActiveClient } from '~/client/api';
2
+ import {
3
+ LIVE_OBJECT_ENABLE_CACHE_MESSAGE,
4
+ UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
5
+ UNSYNCED_OBJECT_CACHED_AT_VALUE,
6
+ } from '~/utils/constants';
7
+ import { hasUpdates } from '~/core/model';
8
+ import { createQuery, runQuery } from '~/core/query';
9
+ import { ASCApiError } from '~/core/errors';
10
+
11
+ export const liveObject = <
12
+ T extends Exclude<Amity.Model[Amity.Domain], Amity.Reaction | Amity.FollowCount>,
13
+ K extends keyof T,
14
+ >(
15
+ id: T[K],
16
+ callback: Amity.LiveObjectCallback<T>,
17
+ key: K,
18
+ fetcher: (id: T[K]) => Promise<Amity.Cached<T>>,
19
+ eventHandlers: Array<(callback: Amity.Listener<T>) => Amity.Unsubscriber>,
20
+ ): Amity.Unsubscriber => {
21
+ const { cache } = getActiveClient();
22
+
23
+ if (!cache) {
24
+ console.log(LIVE_OBJECT_ENABLE_CACHE_MESSAGE);
25
+ }
26
+
27
+ let model: T;
28
+ let isUnsyncedModel = false; // for messages
29
+ const disposers: Amity.Unsubscriber[] = [];
30
+
31
+ const dispatcher = (data: Amity.LiveObject<T>) => {
32
+ model = data.data;
33
+ callback(data);
34
+ };
35
+
36
+ const realtimeRouter = (eventModel: T) => {
37
+ if (id !== eventModel[key]) {
38
+ return;
39
+ }
40
+
41
+ if (model && !hasUpdates(model, eventModel)) {
42
+ return;
43
+ }
44
+
45
+ dispatcher({ loading: false, data: eventModel, origin: 'event' });
46
+ };
47
+
48
+ const onFetch = () => {
49
+ // @ts-ignore
50
+ const query = createQuery(fetcher, id, true);
51
+
52
+ runQuery(query, ({ error, data, loading, origin, cachedAt }) => {
53
+ if (cachedAt === UNSYNCED_OBJECT_CACHED_AT_VALUE) {
54
+ dispatcher({
55
+ // @ts-ignore
56
+ data,
57
+ origin,
58
+ loading: false,
59
+ error: new ASCApiError(
60
+ UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
61
+ Amity.ClientError.DISALOOW_UNSYNCED_OBJECT,
62
+ Amity.ErrorLevel.ERROR,
63
+ ),
64
+ });
65
+
66
+ isUnsyncedModel = true;
67
+ disposers.forEach(fn => fn());
68
+ } else if (!isUnsyncedModel) {
69
+ // @ts-ignore
70
+ dispatcher({ loading, data, origin, error });
71
+ }
72
+
73
+ if (error) {
74
+ disposers.forEach(fn => fn());
75
+ }
76
+ });
77
+ };
78
+
79
+ disposers.push(...eventHandlers.map(fn => fn(realtimeRouter)));
80
+
81
+ onFetch();
82
+
83
+ return () => {
84
+ disposers.forEach(fn => fn());
85
+ };
86
+ };
@@ -0,0 +1,57 @@
1
+ export const category11 = {
2
+ name: 'a-hello',
3
+ updatedAt: '2022-11-25T04:19:34.446Z',
4
+ createdAt: '2022-11-25T04:19:34.446Z',
5
+ isDeleted: false,
6
+ categoryId: '2ddea5ad242d0a2bd5dc5be8ae9fc8c2',
7
+ };
8
+
9
+ export const category12 = {
10
+ name: 'b-testing-category',
11
+ updatedAt: '2022-11-25T03:56:06.238Z',
12
+ createdAt: '2022-11-25T03:56:06.238Z',
13
+ isDeleted: false,
14
+ categoryId: '88d175da65cbfeb39b81e722b322430e',
15
+ };
16
+
17
+ export const category13 = {
18
+ name: 'c-deleted-category',
19
+ updatedAt: '2022-11-25T03:56:06.238Z',
20
+ createdAt: '2022-11-25T03:56:06.238Z',
21
+ isDeleted: true,
22
+ categoryId: '88d175da65cbfeb39b81e722b322430d',
23
+ };
24
+
25
+ export const category21 = {
26
+ name: 'a-0asd',
27
+ updatedAt: '2022-11-25T04:18:59.180Z',
28
+ createdAt: '2022-11-25T04:18:59.180Z',
29
+ isDeleted: false,
30
+ categoryId: '10051d82a1f371c6be3a8f4a4654b8a1',
31
+ };
32
+
33
+ export const category22 = {
34
+ name: 'b-A Category',
35
+ updatedAt: '2022-11-25T03:56:29.037Z',
36
+ createdAt: '2022-11-25T03:56:29.037Z',
37
+ isDeleted: false,
38
+ categoryId: '639942c6b2f121bed3901cf4a4c296e7',
39
+ };
40
+
41
+ export const categoryQueryResponse = {
42
+ data: {
43
+ categories: [category11, category12, category13],
44
+ paging: {
45
+ next: 'eyJza2lwIjoxMCwibGltaXQiOjEwfQ==',
46
+ },
47
+ },
48
+ };
49
+
50
+ export const categoryQueryResponsePage2 = {
51
+ data: {
52
+ categories: [category21, category22],
53
+ paging: {
54
+ next: 'eyJza2lwIjoxMCwibGltaXQiOjEwfQ==',
55
+ },
56
+ },
57
+ };
@@ -6,6 +6,7 @@ export function generateRawChannel(params?: Partial<Amity.ChannelRaw>): Amity.Ch
6
6
 
7
7
  return {
8
8
  _id: `${channelId}-internalId`,
9
+ lastActivity: '',
9
10
  channelId,
10
11
  createdAt: date,
11
12
  isDeleted: false,
@@ -54,7 +55,13 @@ export const mockPage = {
54
55
  },
55
56
  };
56
57
 
57
- export const channelRaw1: Amity.ChannelRaw = generateRawChannel();
58
+ export const channelRaw1: Amity.ChannelRaw = generateRawChannel({ type: 'community' });
59
+
60
+ export const channelRawLive1: Amity.ChannelRaw = generateRawChannel({ type: 'live' });
61
+
62
+ export const channelRawConversation1: Amity.ChannelRaw = generateRawChannel({
63
+ type: 'conversation',
64
+ });
58
65
 
59
66
  export const channelRaw2: Amity.ChannelRaw = generateRawChannel({
60
67
  channelId: 'channelId12',
@@ -132,6 +139,16 @@ export const channelQueryResponse = {
132
139
  },
133
140
  };
134
141
 
142
+ export const getChannelsResponse = {
143
+ data: {
144
+ channels: [channelRaw1, channelRaw2, channelRaw3],
145
+ channelUsers: [],
146
+ files: [],
147
+ users: [],
148
+ ...mockPage,
149
+ },
150
+ };
151
+
135
152
  export const channelQueryResponsePage2 = {
136
153
  data: {
137
154
  channels: [channelRaw3],
@@ -142,6 +159,26 @@ export const channelQueryResponsePage2 = {
142
159
  },
143
160
  };
144
161
 
162
+ export const channelTagQueryResponse = {
163
+ data: {
164
+ channels: [channelRaw2],
165
+ channelUsers: [],
166
+ files: [],
167
+ users: [],
168
+ ...mockPage,
169
+ },
170
+ };
171
+
172
+ export const channelExcludeTagQueryResponse = {
173
+ data: {
174
+ channels: [channelRaw1, channelRaw3],
175
+ channelUsers: [],
176
+ files: [],
177
+ users: [],
178
+ ...mockPage,
179
+ },
180
+ };
181
+
145
182
  export const channelUserQueryResponse = {
146
183
  data: {
147
184
  channels: [channelRaw1],
@@ -191,3 +228,17 @@ export const channelPayload = {
191
228
  users: [user14, user11],
192
229
  files: [file11],
193
230
  };
231
+
232
+ export const liveChannelPayload = {
233
+ channels: [channelRawLive1],
234
+ channelUsers: [rawChannelUserWithRole, rawMutedChannelUser],
235
+ users: [user14, user11],
236
+ files: [file11],
237
+ };
238
+
239
+ export const conversationChannelPayload = {
240
+ channels: [channelRawConversation1],
241
+ channelUsers: [rawChannelUserWithRole, rawMutedChannelUser],
242
+ users: [user14, user11],
243
+ files: [file11],
244
+ };
@@ -106,3 +106,97 @@ export const communityUserModel = [
106
106
  { ...communityUser11, user: user11 },
107
107
  { ...communityUser12, user: user12 },
108
108
  ];
109
+
110
+ export const communityRaw1 = {
111
+ path: '631f16be1e440400da5663b0/social/community/63c8e023d2474637568ece5e',
112
+ isOfficial: false,
113
+ isPublic: true,
114
+ onlyAdminCanPost: false,
115
+ postsCount: 0,
116
+ membersCount: 1,
117
+ moderatorMemberCount: 1,
118
+ updatedAt: '2023-01-19T06:16:03.818Z',
119
+ createdAt: '2023-01-19T06:16:03.818Z',
120
+ isDeleted: true,
121
+ needApprovalOnPostCreation: false,
122
+ displayName: 'community 1',
123
+ tags: ['test-community-tag'],
124
+ metadata: {},
125
+ hasFlaggedComment: false,
126
+ hasFlaggedPost: true,
127
+ communityId: '63c8e023d2474637568ece5e',
128
+ channelId: '63c8e023d2474637568ece5e',
129
+ userId: user11.userId,
130
+ isJoined: true,
131
+ avatarFileId: '',
132
+ categoryIds: ['test-category-id'],
133
+ };
134
+
135
+ export const communityRaw2 = {
136
+ path: '631f16be1e440400da5663b0/social/community/63c8cd098309f85d2ec7dad7',
137
+ isOfficial: false,
138
+ isPublic: true,
139
+ onlyAdminCanPost: false,
140
+ postsCount: 0,
141
+ membersCount: 1,
142
+ moderatorMemberCount: 1,
143
+ updatedAt: '2023-01-19T04:54:57.078Z',
144
+ createdAt: '2023-01-19T04:54:33.716Z',
145
+ isDeleted: false,
146
+ needApprovalOnPostCreation: false,
147
+ displayName: 'new community ....1',
148
+ tags: [],
149
+ metadata: {},
150
+ hasFlaggedComment: false,
151
+ hasFlaggedPost: false,
152
+ communityId: '63c8cd098309f85d2ec7dad7',
153
+ channelId: '63c8cd098309f85d2ec7dad7',
154
+ userId: user12.userId,
155
+ isJoined: false,
156
+ avatarFileId: '',
157
+ categoryIds: [],
158
+ };
159
+
160
+ export const communityQueryResponse = {
161
+ data: {
162
+ communities: [communityRaw1, communityRaw2],
163
+ communityUsers: [communityUser11],
164
+ categories: [
165
+ {
166
+ name: '$testing category',
167
+ metadata: {},
168
+ updatedAt: '2022-11-25T03:56:06.238Z',
169
+ createdAt: '2022-11-25T03:56:06.238Z',
170
+ isDeleted: false,
171
+ categoryId: '88d175da65cbfeb39b81e722b322430d',
172
+ },
173
+ ],
174
+ users: [user11, user12],
175
+ feeds: [],
176
+ paging: {
177
+ next: 'eyJza2lwIjoxMCwibGltaXQiOjEwfQ==',
178
+ },
179
+ },
180
+ };
181
+
182
+ export const communityQueryResponsePage2 = {
183
+ data: {
184
+ communities: [communityRaw1],
185
+ communityUsers: [communityUser11],
186
+ categories: [
187
+ {
188
+ name: '$testing category',
189
+ metadata: {},
190
+ updatedAt: '2022-11-25T03:56:06.238Z',
191
+ createdAt: '2022-11-25T03:56:06.238Z',
192
+ isDeleted: false,
193
+ categoryId: '88d175da65cbfeb39b81e722b322430d',
194
+ },
195
+ ],
196
+ users: [user11, user12],
197
+ feeds: [],
198
+ paging: {
199
+ next: 'eyJza2lwIjoxMCwibGltaXQiOjEwfQ==',
200
+ },
201
+ },
202
+ };
@@ -0,0 +1,13 @@
1
+ export const feed11 = {
2
+ targetType: 'community',
3
+ targetId: '6396a419becb56760a7b0bb9',
4
+ feedType: 'published',
5
+ feedId: '16708167935683a5eb158a39f40ffbdd49b7f70dc9bfd',
6
+ postCount: 4,
7
+ createdAt: '2022-12-12T03:46:33.557Z',
8
+ updatedAt: '2022-12-12T05:51:37.927Z',
9
+ };
10
+
11
+ export const feedPayload = {
12
+ feeds: [feed11],
13
+ };
@@ -1,3 +1,5 @@
1
+ import MockFormData from 'form-data';
2
+
1
3
  export const file11: Amity.File<'image'> = {
2
4
  fileId: 'file-Id',
3
5
  fileUrl: 'https://fileUrl.com/test-file',
@@ -18,3 +20,33 @@ export const file11: Amity.File<'image'> = {
18
20
  },
19
21
  },
20
22
  };
23
+
24
+ export const file12: Amity.File<'video'> = {
25
+ fileId: 'file-Id-12',
26
+ feedType: 'post',
27
+ status: 'uploaded',
28
+ fileUrl: 'https://fileUrl.com/test-file',
29
+ type: 'video',
30
+ createdAt: '2023-01-20T18:37:19.583Z',
31
+ updatedAt: '2023-01-20T18:37:19.583Z',
32
+ attributes: {
33
+ name: 'test.mp4',
34
+ extension: 'mp4',
35
+ size: '3652304',
36
+ mimeType: 'video/mp4',
37
+ metadata: {},
38
+ },
39
+ };
40
+
41
+ export const createFileFormData = () => {
42
+ const fd = new MockFormData() as unknown as FormData;
43
+ fd.append('files', 'file');
44
+ fd.getAll = jest.fn().mockImplementation(() => ['file']);
45
+ return fd;
46
+ };
47
+
48
+ export const createEmptyFormData = () => {
49
+ const fd = new MockFormData() as unknown as FormData;
50
+ fd.getAll = jest.fn().mockImplementation(() => []);
51
+ return fd;
52
+ };
@@ -18,5 +18,8 @@ export * from './message';
18
18
  export * from './token';
19
19
  export * from './member';
20
20
  export * from './community';
21
+ export * from './category';
21
22
 
22
23
  export * from './stream';
24
+
25
+ export * from './feed';
@@ -1,52 +1,64 @@
1
- import { user11, file11, communityUser11, date } from '.';
1
+ import { user11, file11, date, feed11 } from '.';
2
2
  import { encodeJson } from '..';
3
3
 
4
- export const post11: Amity.Post = {
5
- path: '',
6
- feedId: '',
7
- children: [],
8
- comments: [],
9
- flagCount: 0,
10
- reactions: {},
11
- hashFlag: null,
12
- editedAt: date,
13
- createdAt: date,
14
- commentsCount: 0,
15
- reactionsCount: 0,
16
- postId: 'postId11',
17
- targetType: 'user',
18
- parentId: 'postId12',
19
- data: { text: 'post11' },
20
- targetId: user11.userId,
21
- hasFlaggedComment: false,
22
- hasFlaggedChildren: false,
23
- postedUserId: user11.userId,
24
- };
4
+ export function generatePost(params?: Partial<Amity.Post>): Amity.Post {
5
+ return {
6
+ children: [],
7
+ comments: [],
8
+ commentsCount: 0,
9
+ createdAt: date,
10
+ data: { text: 'post11' },
11
+ editedAt: date,
12
+ feedId: '',
13
+ flagCount: 0,
14
+ hashFlag: null,
15
+ hasFlaggedComment: false,
16
+ hasFlaggedChildren: false,
17
+ parentId: 'postId12',
18
+ path: '',
19
+ postedUserId: user11.userId,
20
+ postId: 'postId11',
21
+ isDeleted: false,
22
+ reactions: {},
23
+ reactionsCount: 0,
24
+ targetId: user11.userId,
25
+ targetType: 'user',
26
+ updatedAt: date,
27
+ ...params,
28
+ };
29
+ }
25
30
 
26
- export const comment11: Amity.Comment = {
27
- path: '',
28
- referenceType: 'post',
29
- dataType: 'text',
30
- rootId: 'test',
31
- data: {
32
- text: 'yellow new world',
33
- },
34
- childrenNumber: 0,
35
- isDeleted: false,
36
- editedAt: '2022-10-31T05:57:45.661Z',
37
- updatedAt: '2022-10-31T05:57:45.670Z',
38
- createdAt: '2022-10-31T05:57:45.661Z',
39
- segmentNumber: 2,
40
- commentId: 'comment11',
41
- userId: 'test',
42
- referenceId: post11.postId,
43
- flagCount: 0,
44
- hashFlag: null,
45
- children: [],
46
- mentionees: [],
47
- reactions: {},
48
- reactionsCount: 0,
49
- };
31
+ export function generateComment(params?: Partial<Amity.Comment>): Amity.Comment {
32
+ return {
33
+ path: '',
34
+ referenceType: 'post',
35
+ dataType: 'text',
36
+ rootId: 'test',
37
+ data: {
38
+ text: 'yellow new world',
39
+ },
40
+ childrenNumber: 0,
41
+ isDeleted: false,
42
+ editedAt: '2022-10-31T05:57:45.661Z',
43
+ updatedAt: '2022-10-31T05:57:45.670Z',
44
+ createdAt: '2022-10-31T05:57:45.661Z',
45
+ segmentNumber: 2,
46
+ commentId: 'comment11',
47
+ userId: 'test',
48
+ referenceId: 'postId11',
49
+ flagCount: 0,
50
+ hashFlag: null,
51
+ children: [],
52
+ mentionees: [],
53
+ reactions: {},
54
+ reactionsCount: 0,
55
+ ...params,
56
+ };
57
+ }
58
+
59
+ export const post11: Amity.Post = generatePost();
60
+
61
+ export const comment11: Amity.Comment = generateComment();
50
62
 
51
63
  export const post12: Amity.Post = {
52
64
  ...post11,
@@ -62,6 +74,7 @@ export const post14: Amity.Post = {
62
74
  ...post11,
63
75
  postId: 'post14',
64
76
  targetType: 'community',
77
+ feedId: 'feedId',
65
78
  isDeleted: false,
66
79
  children: [],
67
80
  };
@@ -71,6 +84,7 @@ export const post15: Amity.Post = {
71
84
  postId: 'post15',
72
85
  isDeleted: true,
73
86
  children: [post11.postId],
87
+ feedId: 'feedId',
74
88
  targetType: 'community',
75
89
  tags: ['test_tag'],
76
90
  };
@@ -117,8 +131,9 @@ export const postQueryResponse = {
117
131
 
118
132
  export const postQueryResponsePage2 = {
119
133
  data: {
120
- posts: [post14, post15, post16],
134
+ posts: [post14, post15],
121
135
  files: [],
136
+ feeds: [{ ...feed11, feedType: 'reviewing', targetId: post14.targetId, feedId: post14.feedId }],
122
137
  paging: {
123
138
  next: nextPage,
124
139
  },