@amityco/ts-sdk 0.0.1-beta.43.1 → 0.0.1-beta.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/category/api/queryCategories.d.ts.map +1 -1
- package/dist/comment/api/queryComments.d.ts.map +1 -1
- package/dist/community/api/queryCommunities.d.ts.map +1 -1
- package/dist/core/query/filtering.d.ts +10 -0
- package/dist/core/query/filtering.d.ts.map +1 -1
- package/dist/index.cjs.js +82 -60
- package/dist/index.esm.js +82 -61
- package/dist/index.umd.js +4 -4
- package/dist/message/api/queryMessages.d.ts +1 -17
- package/dist/message/api/queryMessages.d.ts.map +1 -1
- package/dist/message/utils/prepareMessagePayload.d.ts.map +1 -1
- package/dist/post/api/queryPosts.d.ts.map +1 -1
- package/dist/post/observers/livePosts.d.ts.map +1 -1
- package/dist/subChannel/api/querySubChannels.d.ts.map +1 -1
- package/dist/utils/inferIsDeleted.d.ts +2 -0
- package/dist/utils/inferIsDeleted.d.ts.map +1 -0
- package/dist/utils/tests/inferIsDeleted.test.d.ts +2 -0
- package/dist/utils/tests/inferIsDeleted.test.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/category/api/queryCategories.ts +3 -1
- package/src/category/observers/liveCategories.ts +1 -1
- package/src/category/observers/tests/liveCategories.test.ts +7 -5
- package/src/channel/api/tests/removeChannelMembers.test.ts +3 -4
- package/src/channel/observers/tests/liveChannels.test.ts +6 -6
- package/src/client/api/connectClient.ts +1 -1
- package/src/comment/api/queryComments.ts +3 -1
- package/src/comment/observers/liveComments.ts +1 -1
- package/src/community/api/queryCommunities.ts +2 -1
- package/src/community/api/test/queryCommunity.test.ts +2 -2
- package/src/community/observers/liveCommunities.ts +1 -1
- package/src/community/observers/tests/liveCommunities.test.ts +7 -7
- package/src/core/query/filtering.ts +38 -0
- package/src/message/api/queryMessages.ts +15 -50
- package/src/message/api/tests/queryMessages.test.ts +2 -37
- package/src/message/observers/liveMessages.ts +2 -2
- package/src/message/tests/observers/liveMessage.test.ts +1 -1
- package/src/message/tests/observers/liveMessages.test.ts +1 -1
- package/src/message/utils/prepareMessagePayload.ts +3 -1
- package/src/post/api/queryPosts.ts +3 -1
- package/src/post/observers/livePosts.ts +7 -2
- package/src/post/observers/tests/livePosts.test.ts +10 -4
- package/src/subChannel/api/querySubChannels.ts +3 -1
- package/src/subChannel/observers/liveSubChannels.ts +1 -1
- package/src/utils/inferIsDeleted.ts +16 -0
- package/src/utils/tests/inferIsDeleted.test.ts +15 -0
|
@@ -12,21 +12,5 @@
|
|
|
12
12
|
* @category Message API
|
|
13
13
|
* @async
|
|
14
14
|
*/
|
|
15
|
-
export declare const queryMessages:
|
|
16
|
-
(query: Amity.QueryMessages): Promise<Amity.Cached<Amity.Paged<Amity.Message, Amity.Page<string>>>>;
|
|
17
|
-
/**
|
|
18
|
-
* ```js
|
|
19
|
-
* import { queryMessages } from '@amityco/ts-sdk'
|
|
20
|
-
* const messages = queryMessages.locally!({ channelId })
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* Queries a paginable list of {@link Amity.Message} objects from cache
|
|
24
|
-
*
|
|
25
|
-
* @param query The query parameters
|
|
26
|
-
* @returns A page of {@link Amity.Message} objects
|
|
27
|
-
*
|
|
28
|
-
* @category Message API
|
|
29
|
-
*/
|
|
30
|
-
locally(query: Parameters<typeof queryMessages>[0]): Amity.Cached<Amity.Paged<Amity.Message, Amity.Page<string>>> | undefined;
|
|
31
|
-
};
|
|
15
|
+
export declare const queryMessages: (query: Amity.QueryMessages) => Promise<Amity.Cached<Amity.Paged<Amity.Message, Amity.Page<string>>>>;
|
|
32
16
|
//# sourceMappingURL=queryMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryMessages.d.ts","sourceRoot":"","sources":["../../../src/message/api/queryMessages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queryMessages.d.ts","sourceRoot":"","sources":["../../../src/message/api/queryMessages.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,UACjB,MAAM,aAAa,KACzB,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CA0CtE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareMessagePayload.d.ts","sourceRoot":"","sources":["../../../src/message/utils/prepareMessagePayload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prepareMessagePayload.d.ts","sourceRoot":"","sources":["../../../src/message/utils/prepareMessagePayload.ts"],"names":[],"mappings":"AA4BA,wBAAgB,cAAc,CAC5B,OAAO,EAAE,KAAK,CAAC,UAAU,EACzB,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,GAC3B,KAAK,CAAC,OAAO,CA8Df;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,GAC3B,KAAK,CAAC,OAAO,CASf;AAED,eAAO,MAAM,qBAAqB,YACvB,MAAM,cAAc,KAC5B,QAAQ,MAAM,uBAAuB,CAsBvC,CAAC;AAEF,aAAK,gBAAgB,GAAG,IAAI,CAC1B,KAAK,CAAC,aAAa,EAInB,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,gBAAgB,CAC/D,GAAG;IACF,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,YAAY,EACZ,UAAU,EACV,GAAG,IAAI,EACR,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAE9C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,cAAc,EACd,GAAG,IAAI,EACR,EAAE,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAiBxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryPosts.d.ts","sourceRoot":"","sources":["../../../src/post/api/queryPosts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queryPosts.d.ts","sourceRoot":"","sources":["../../../src/post/api/queryPosts.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU;YACd,MAAM,UAAU,GACtB,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;IAmDhE;;;;;;;;;;;;OAYG;mBAEM,WAAW,iBAAiB,CAAC,CAAC,CAAC,CAAC,GACtC,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS;CAlBlE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"livePosts.d.ts","sourceRoot":"","sources":["../../../src/post/observers/livePosts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"livePosts.d.ts","sourceRoot":"","sources":["../../../src/post/observers/livePosts.ts"],"names":[],"mappings":"AAoCA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,SAAS,WACZ,MAAM,kBAAkB,YACtB,MAAM,sBAAsB,CAAC,MAAM,IAAI,CAAC,WACzC,MAAM,oBAAoB,KAClC,MAAM,YAoIR,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"querySubChannels.d.ts","sourceRoot":"","sources":["../../../src/subChannel/api/querySubChannels.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"querySubChannels.d.ts","sourceRoot":"","sources":["../../../src/subChannel/api/querySubChannels.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB;YACpB,MAAM,gBAAgB,GAC5B,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC;IA4CvD;;;;;;;;;;;;OAYG;mBAEM,WAAW,uBAAuB,CAAC,CAAC,CAAC,CAAC,GAC5C,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC,GAAG,SAAS;CAlBzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inferIsDeleted.d.ts","sourceRoot":"","sources":["../../src/utils/inferIsDeleted.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,cAAc,oBAAqB,OAAO,KAAG,OAAO,GAAG,SACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inferIsDeleted.test.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/inferIsDeleted.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -6,6 +6,8 @@ import { pullFromCache, pushToCache } from '~/cache/api';
|
|
|
6
6
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
7
7
|
import { getResolver } from '~/core/model';
|
|
8
8
|
|
|
9
|
+
import { inferIsDeleted } from '~/utils/inferIsDeleted';
|
|
10
|
+
|
|
9
11
|
/* begin_public_function
|
|
10
12
|
id: community.category.query
|
|
11
13
|
*/
|
|
@@ -36,7 +38,7 @@ export const queryCategories = async (
|
|
|
36
38
|
{
|
|
37
39
|
params: {
|
|
38
40
|
...params,
|
|
39
|
-
isDeleted: includeDeleted
|
|
41
|
+
isDeleted: inferIsDeleted(includeDeleted),
|
|
40
42
|
options: {
|
|
41
43
|
token: toToken(page, 'skiplimit'),
|
|
42
44
|
},
|
|
@@ -22,7 +22,9 @@ const getSnapshot = (params?: Record<string, any>) => {
|
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
const params = { includeDeleted: true };
|
|
26
|
+
|
|
27
|
+
describe('live Categories', () => {
|
|
26
28
|
beforeAll(connectClient);
|
|
27
29
|
afterAll(disconnectClient);
|
|
28
30
|
|
|
@@ -37,7 +39,7 @@ describe('live Caategories', () => {
|
|
|
37
39
|
const callback = jest.fn();
|
|
38
40
|
client.http.get = jest.fn().mockResolvedValue(categoryQueryResponse);
|
|
39
41
|
|
|
40
|
-
liveCategories(
|
|
42
|
+
liveCategories(params, callback);
|
|
41
43
|
await pause();
|
|
42
44
|
|
|
43
45
|
expect(callback).toHaveBeenCalledTimes(2);
|
|
@@ -57,9 +59,9 @@ describe('live Caategories', () => {
|
|
|
57
59
|
const callback = jest.fn();
|
|
58
60
|
client.http.get = jest.fn().mockResolvedValue(categoryQueryResponse);
|
|
59
61
|
|
|
60
|
-
liveCategories(
|
|
62
|
+
liveCategories(params, () => undefined);
|
|
61
63
|
await pause();
|
|
62
|
-
liveCategories(
|
|
64
|
+
liveCategories(params, callback);
|
|
63
65
|
await pause();
|
|
64
66
|
|
|
65
67
|
expect(callback).toHaveBeenCalledTimes(2);
|
|
@@ -116,7 +118,7 @@ describe('live Caategories', () => {
|
|
|
116
118
|
.mockResolvedValue(categoryQueryResponse)
|
|
117
119
|
.mockResolvedValueOnce(categoryQueryResponsePage2);
|
|
118
120
|
|
|
119
|
-
liveCategories(
|
|
121
|
+
liveCategories(params, callback);
|
|
120
122
|
await pause();
|
|
121
123
|
|
|
122
124
|
expect(callback).toHaveBeenCalled();
|
|
@@ -91,11 +91,10 @@ describe('removeChannelMembers', () => {
|
|
|
91
91
|
await pause();
|
|
92
92
|
|
|
93
93
|
/*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
94
|
+
* Removed assertion for checking what the callback was called with as it's
|
|
95
|
+
* impossible to guarantee the order in which the events will be fired
|
|
96
96
|
*/
|
|
97
|
-
expect(callback).
|
|
98
|
-
expect(callback).toHaveBeenNthCalledWith(2, channel1, channelUser3);
|
|
97
|
+
expect(callback).toHaveBeenCalledTimes(2);
|
|
99
98
|
|
|
100
99
|
unsub();
|
|
101
100
|
});
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
client,
|
|
10
10
|
connectClient,
|
|
11
11
|
convertRawChannelPayload,
|
|
12
|
+
convertChannelFromRaw,
|
|
12
13
|
disconnectClient,
|
|
13
14
|
generateRawChannel,
|
|
14
15
|
generateRawMessage,
|
|
@@ -20,7 +21,6 @@ import {
|
|
|
20
21
|
} from '~/utils/tests';
|
|
21
22
|
|
|
22
23
|
import { liveChannels } from '../liveChannels';
|
|
23
|
-
import { convertFromRaw } from '../../utils';
|
|
24
24
|
import * as getChannelMarkers from '../../../marker/api/getChannelMarkers';
|
|
25
25
|
|
|
26
26
|
const getSnapshot = (params?: Record<string, any>) => {
|
|
@@ -99,17 +99,17 @@ describe('liveChannels', () => {
|
|
|
99
99
|
channelId: 'deleted-channel-id',
|
|
100
100
|
isDeleted: true,
|
|
101
101
|
});
|
|
102
|
-
const deletedChannel =
|
|
102
|
+
const deletedChannel = convertChannelFromRaw(rawDeletedChannel);
|
|
103
103
|
const rawTaggedChannel = generateRawChannel({
|
|
104
104
|
channelId: 'tagged-channel-id',
|
|
105
105
|
tags: ['tag1', 'tag2'],
|
|
106
106
|
});
|
|
107
|
-
const taggedChannel =
|
|
107
|
+
const taggedChannel = convertChannelFromRaw(rawTaggedChannel);
|
|
108
108
|
const rawTaggedChannel2 = generateRawChannel({
|
|
109
109
|
channelId: 'tagged-channel-id-2',
|
|
110
110
|
tags: ['tag2'],
|
|
111
111
|
});
|
|
112
|
-
const taggedChannel2 =
|
|
112
|
+
const taggedChannel2 = convertChannelFromRaw(rawTaggedChannel2);
|
|
113
113
|
|
|
114
114
|
const filters: [string, Amity.ChannelLiveCollection, Amity.Channel[]][] = [
|
|
115
115
|
['deleted', { isDeleted: false }, [channel1, taggedChannel, taggedChannel2]],
|
|
@@ -200,13 +200,13 @@ describe('liveChannels', () => {
|
|
|
200
200
|
'it should add new channel to collection onCreate',
|
|
201
201
|
'channel.created',
|
|
202
202
|
rawNewChannel,
|
|
203
|
-
[
|
|
203
|
+
[convertChannelFromRaw(rawNewChannel), channel1, channel2],
|
|
204
204
|
],
|
|
205
205
|
[
|
|
206
206
|
'it should add new channel to collection onJoin',
|
|
207
207
|
'channel.joined',
|
|
208
208
|
rawNewChannel,
|
|
209
|
-
[
|
|
209
|
+
[convertChannelFromRaw(rawNewChannel), channel1, channel2],
|
|
210
210
|
],
|
|
211
211
|
[
|
|
212
212
|
'it should update channel in collection onUpdate',
|
|
@@ -5,6 +5,8 @@ import { pullFromCache, pushToCache } from '~/cache/api';
|
|
|
5
5
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
6
6
|
import { getResolver } from '~/core/model';
|
|
7
7
|
|
|
8
|
+
import { inferIsDeleted } from '~/utils/inferIsDeleted';
|
|
9
|
+
|
|
8
10
|
/* begin_public_function
|
|
9
11
|
id: comment.query
|
|
10
12
|
*/
|
|
@@ -44,7 +46,7 @@ export const queryComments = async (
|
|
|
44
46
|
{
|
|
45
47
|
params: {
|
|
46
48
|
...params,
|
|
47
|
-
isDeleted: includeDeleted
|
|
49
|
+
isDeleted: inferIsDeleted(includeDeleted),
|
|
48
50
|
// filterByParentId, API-FIX: backend does not support this boolean LOL. what the hell seriously.
|
|
49
51
|
options,
|
|
50
52
|
},
|
|
@@ -5,6 +5,7 @@ import { pushToCache } from '~/cache/api';
|
|
|
5
5
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
6
6
|
import { getResolver } from '~/core/model';
|
|
7
7
|
|
|
8
|
+
import { inferIsDeleted } from '~/utils/inferIsDeleted';
|
|
8
9
|
import { prepareCommunityPayload } from '../utils';
|
|
9
10
|
|
|
10
11
|
/* begin_public_function
|
|
@@ -43,7 +44,7 @@ export const queryCommunities = async (
|
|
|
43
44
|
{
|
|
44
45
|
params: {
|
|
45
46
|
...restParams,
|
|
46
|
-
isDeleted: includeDeleted
|
|
47
|
+
isDeleted: inferIsDeleted(includeDeleted),
|
|
47
48
|
keyword: displayName,
|
|
48
49
|
filter: membership,
|
|
49
50
|
options: {
|
|
@@ -89,14 +89,14 @@ describe('queryCommunities', () => {
|
|
|
89
89
|
expect(mockFn.mock.lastCall[1].params.isDeleted).toBe(false);
|
|
90
90
|
});
|
|
91
91
|
|
|
92
|
-
test('it should set isDeleted to
|
|
92
|
+
test('it should set isDeleted to false if includeDeleted is undefined', async () => {
|
|
93
93
|
const mockFn = jest.fn();
|
|
94
94
|
client.http.get = mockFn.mockResolvedValue(resolvedGetValue);
|
|
95
95
|
|
|
96
96
|
await queryCommunities(queryCriteriaWithoutPage);
|
|
97
97
|
|
|
98
98
|
expect(mockFn.mock.lastCall).toHaveLength(2);
|
|
99
|
-
expect(mockFn.mock.lastCall[1].params.isDeleted).
|
|
99
|
+
expect(mockFn.mock.lastCall[1].params.isDeleted).toBe(false);
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
102
|
|
|
@@ -78,7 +78,7 @@ export const liveCommunities = (
|
|
|
78
78
|
|
|
79
79
|
communities = filterByPropEquality(communities, 'displayName', params.displayName);
|
|
80
80
|
|
|
81
|
-
if (params.includeDeleted
|
|
81
|
+
if (!params.includeDeleted) {
|
|
82
82
|
communities = filterByPropEquality(communities, 'isDeleted', false);
|
|
83
83
|
}
|
|
84
84
|
|
|
@@ -39,7 +39,7 @@ describe('liveCommunities', () => {
|
|
|
39
39
|
const callback = jest.fn();
|
|
40
40
|
client.http.get = jest.fn().mockResolvedValue(communityQueryResponse);
|
|
41
41
|
|
|
42
|
-
liveCommunities({}, callback);
|
|
42
|
+
liveCommunities({ includeDeleted: true }, callback);
|
|
43
43
|
await pause();
|
|
44
44
|
|
|
45
45
|
expect(callback).toHaveBeenCalledTimes(2);
|
|
@@ -59,9 +59,9 @@ describe('liveCommunities', () => {
|
|
|
59
59
|
const callback = jest.fn();
|
|
60
60
|
client.http.get = jest.fn().mockResolvedValue(communityQueryResponse);
|
|
61
61
|
|
|
62
|
-
liveCommunities({}, () => undefined);
|
|
62
|
+
liveCommunities({ includeDeleted: true }, () => undefined);
|
|
63
63
|
await pause();
|
|
64
|
-
liveCommunities({}, callback);
|
|
64
|
+
liveCommunities({ includeDeleted: true }, callback);
|
|
65
65
|
await pause();
|
|
66
66
|
|
|
67
67
|
expect(callback).toHaveBeenCalledTimes(2);
|
|
@@ -86,9 +86,9 @@ describe('liveCommunities', () => {
|
|
|
86
86
|
|
|
87
87
|
const filters: [string, Amity.CommunityLiveCollection, Amity.Community[]][] = [
|
|
88
88
|
['not deleted', { includeDeleted: false }, [community2]],
|
|
89
|
-
['categoryId', { categoryId: 'test-category-id' }, [community1]],
|
|
90
|
-
['displayName', { displayName: 'community 1' }, [community1]],
|
|
91
|
-
['tagged', { tags: ['test-community-tag'] }, [community1]],
|
|
89
|
+
['categoryId', { categoryId: 'test-category-id', includeDeleted: true }, [community1]],
|
|
90
|
+
['displayName', { displayName: 'community 1', includeDeleted: true }, [community1]],
|
|
91
|
+
['tagged', { tags: ['test-community-tag'], includeDeleted: true }, [community1]],
|
|
92
92
|
];
|
|
93
93
|
|
|
94
94
|
test.each(filters)('it should filter by %s communities', async (filter, params, expected) => {
|
|
@@ -121,7 +121,7 @@ describe('liveCommunities', () => {
|
|
|
121
121
|
.mockResolvedValue(communityQueryResponse)
|
|
122
122
|
.mockResolvedValueOnce(communityQueryResponsePage2);
|
|
123
123
|
|
|
124
|
-
liveCommunities({}, callback);
|
|
124
|
+
liveCommunities({ includeDeleted: true }, callback);
|
|
125
125
|
await pause();
|
|
126
126
|
|
|
127
127
|
expect(callback).toHaveBeenCalled();
|
|
@@ -136,3 +136,41 @@ export const filterByCommunityMembership = <T extends Amity.Community>(
|
|
|
136
136
|
return !communityUser || communityUser.communityMembership !== 'none';
|
|
137
137
|
});
|
|
138
138
|
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Filter a post collection by dataType
|
|
142
|
+
*
|
|
143
|
+
* @param collection the post to filter
|
|
144
|
+
* @param dataTypes of the post to be filtered by
|
|
145
|
+
* @returns a filtered collection with items only matching the criteria
|
|
146
|
+
*
|
|
147
|
+
* @hidden
|
|
148
|
+
*/
|
|
149
|
+
export const filterByPostDataTypes = <T extends Amity.Post>(
|
|
150
|
+
collection: T[],
|
|
151
|
+
dataTypes: Amity.PostLiveCollection['dataTypes'],
|
|
152
|
+
): T[] => {
|
|
153
|
+
const filteredPosts: T[] = [];
|
|
154
|
+
|
|
155
|
+
collection.forEach(c => {
|
|
156
|
+
/*
|
|
157
|
+
* A text post with no children is just a text post
|
|
158
|
+
*/
|
|
159
|
+
if (c.dataType === 'text' && !c.children.length) return;
|
|
160
|
+
|
|
161
|
+
if (c.children.length) {
|
|
162
|
+
const childPost = pullFromCache<Amity.Post>(['post', 'get', c.children[0]])?.data;
|
|
163
|
+
|
|
164
|
+
if (childPost && dataTypes?.includes(childPost?.dataType)) {
|
|
165
|
+
// @ts-ignore
|
|
166
|
+
filteredPosts.push(childPost);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (dataTypes?.includes(c.dataType)) filteredPosts.push(c);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
return filteredPosts;
|
|
176
|
+
};
|
|
@@ -2,7 +2,9 @@ import { getActiveClient } from '~/client/api';
|
|
|
2
2
|
|
|
3
3
|
import { fireEvent } from '~/core/events';
|
|
4
4
|
import { toPageRaw } from '~/core/query';
|
|
5
|
-
import {
|
|
5
|
+
import { pushToCache } from '~/cache/api';
|
|
6
|
+
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
7
|
+
import { getResolver } from '~/core/model';
|
|
6
8
|
import { convertQueryParams, prepareMessagePayload } from '../utils';
|
|
7
9
|
|
|
8
10
|
/* begin_public_function
|
|
@@ -47,12 +49,18 @@ export const queryMessages = async (
|
|
|
47
49
|
|
|
48
50
|
const cachedAt = client.cache && Date.now();
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
if (client.cache) {
|
|
53
|
+
/*
|
|
54
|
+
* queryMessages.locally is unsupported for messages as message list updates
|
|
55
|
+
* frequently and leads to bugs when user switches between channels, i.e. when
|
|
56
|
+
* the public function (live messages) calls unmount. The list fetched on
|
|
57
|
+
* after from the cache is stale.
|
|
58
|
+
*/
|
|
59
|
+
ingestInCache(data, { cachedAt });
|
|
60
|
+
|
|
61
|
+
const cacheKey = ['message', 'query', params as Amity.Serializable];
|
|
62
|
+
pushToCache(cacheKey, { messages: messages.map(getResolver('message')), paging });
|
|
63
|
+
}
|
|
56
64
|
|
|
57
65
|
fireEvent('local.message.fetched', { messages });
|
|
58
66
|
|
|
@@ -62,46 +70,3 @@ export const queryMessages = async (
|
|
|
62
70
|
return { data: messages, cachedAt, prevPage, nextPage };
|
|
63
71
|
};
|
|
64
72
|
/* end_public_function */
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* ```js
|
|
68
|
-
* import { queryMessages } from '@amityco/ts-sdk'
|
|
69
|
-
* const messages = queryMessages.locally!({ channelId })
|
|
70
|
-
* ```
|
|
71
|
-
*
|
|
72
|
-
* Queries a paginable list of {@link Amity.Message} objects from cache
|
|
73
|
-
*
|
|
74
|
-
* @param query The query parameters
|
|
75
|
-
* @returns A page of {@link Amity.Message} objects
|
|
76
|
-
*
|
|
77
|
-
* @category Message API
|
|
78
|
-
*/
|
|
79
|
-
queryMessages.locally = (
|
|
80
|
-
query: Parameters<typeof queryMessages>[0],
|
|
81
|
-
): Amity.Cached<Amity.Paged<Amity.Message, Amity.Page<string>>> | undefined => {
|
|
82
|
-
const client = getActiveClient();
|
|
83
|
-
client.log('message/queryMessages.locally', query);
|
|
84
|
-
|
|
85
|
-
if (!client.cache) return;
|
|
86
|
-
|
|
87
|
-
const params = convertQueryParams(query);
|
|
88
|
-
|
|
89
|
-
const queryKey = ['message', 'query', params as Amity.Serializable];
|
|
90
|
-
const { data, cachedAt } =
|
|
91
|
-
pullFromCache<{ messages: Pick<Amity.Message, 'messageId'>[] } & Amity.Pagination>(queryKey) ??
|
|
92
|
-
{};
|
|
93
|
-
|
|
94
|
-
if (!data?.messages.length) return;
|
|
95
|
-
|
|
96
|
-
const messages: Amity.Message[] = data.messages
|
|
97
|
-
.map(messageId => pullFromCache<Amity.Message>(['message', 'get', messageId])!)
|
|
98
|
-
.filter(Boolean)
|
|
99
|
-
.map(({ data }) => data);
|
|
100
|
-
|
|
101
|
-
const prevPage = toPageRaw(data?.paging.previous);
|
|
102
|
-
const nextPage = toPageRaw(data?.paging.next);
|
|
103
|
-
|
|
104
|
-
return messages.length === data?.messages?.length
|
|
105
|
-
? { data: messages, cachedAt, prevPage, nextPage }
|
|
106
|
-
: undefined;
|
|
107
|
-
};
|
|
@@ -106,48 +106,13 @@ describe('queryMessages', () => {
|
|
|
106
106
|
expect(mockFn.mock.lastCall[1].params.isDeleted).toBe(false);
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
-
test('it should set isDeleted to
|
|
109
|
+
test('it should set isDeleted to false if includeDeleted is undefined', async () => {
|
|
110
110
|
const mockFn = jest.fn();
|
|
111
111
|
client.http.get = mockFn.mockResolvedValue(getResolvedMessageValue());
|
|
112
112
|
|
|
113
113
|
await queryMessages(queryCriteriaWithoutPage);
|
|
114
114
|
|
|
115
115
|
expect(mockFn.mock.lastCall).toHaveLength(2);
|
|
116
|
-
expect(mockFn.mock.lastCall[1].params.isDeleted).
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
describe('queryMessages.locally', () => {
|
|
121
|
-
beforeEach(() => enableCache());
|
|
122
|
-
afterEach(() => disableCache());
|
|
123
|
-
|
|
124
|
-
test('should return cached messages', () => {
|
|
125
|
-
messagesToQuery.forEach(message => pushToCache(['message', 'get', message.messageId], message));
|
|
126
|
-
|
|
127
|
-
pushToCache(['message', 'query', convertQueryParams(queryCriteria)], {
|
|
128
|
-
messages: messageIds,
|
|
129
|
-
paging,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
expect(queryMessages.locally(queryCriteria)).toEqual(
|
|
133
|
-
expect.objectContaining({
|
|
134
|
-
data: messagesToQuery,
|
|
135
|
-
prevPage: undefined,
|
|
136
|
-
nextPage,
|
|
137
|
-
}),
|
|
138
|
-
);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test(`shouldn't return if individual message cache not exist`, () => {
|
|
142
|
-
pushToCache(['message', 'query', convertQueryParams(queryCriteria)], {
|
|
143
|
-
messages: messageIds,
|
|
144
|
-
paging,
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
expect(queryMessages.locally(queryCriteria)).toBeUndefined();
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test('it should return undefined if message not in cache', () => {
|
|
151
|
-
expect(queryMessages.locally({ subChannelId: 'non-existent' })).toBeUndefined();
|
|
116
|
+
expect(mockFn.mock.lastCall[1].params.isDeleted).toBe(false);
|
|
152
117
|
});
|
|
153
118
|
});
|
|
@@ -76,7 +76,7 @@ export const liveMessages = (
|
|
|
76
76
|
* for cases when message is deleted via RTE, this flag is used to get
|
|
77
77
|
* items from cache that are !deleted
|
|
78
78
|
*/
|
|
79
|
-
if (params.includeDeleted
|
|
79
|
+
if (!params.includeDeleted) {
|
|
80
80
|
messages = filterByPropEquality(messages, 'isDeleted', false);
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -97,6 +97,7 @@ export const liveMessages = (
|
|
|
97
97
|
collection.data = [...new Set([message.messageId, ...collection.data])];
|
|
98
98
|
|
|
99
99
|
pushToCache(cacheKey, collection);
|
|
100
|
+
disposers.push(() => dropFromCache(cacheKey));
|
|
100
101
|
|
|
101
102
|
responder(collection);
|
|
102
103
|
};
|
|
@@ -152,6 +153,5 @@ export const liveMessages = (
|
|
|
152
153
|
return () => {
|
|
153
154
|
log(`liveMessages(tmpid: ${timestamp}) > dispose`);
|
|
154
155
|
disposers.forEach(fn => fn());
|
|
155
|
-
dropFromCache(cacheKey);
|
|
156
156
|
};
|
|
157
157
|
};
|
|
@@ -4,6 +4,8 @@ import { toToken } from '~/core/query';
|
|
|
4
4
|
import { getMessageMarkers } from '~/marker/api';
|
|
5
5
|
import { prepareMessagePayloadForCache } from '~/reaction/utils/prepareMessagePayloadForCache';
|
|
6
6
|
|
|
7
|
+
import { inferIsDeleted } from '~/utils/inferIsDeleted';
|
|
8
|
+
|
|
7
9
|
const getCachedMarker = (message: Amity.Message | Amity.RawMessage) => {
|
|
8
10
|
const key = {
|
|
9
11
|
creatorId: message.creatorId,
|
|
@@ -166,7 +168,7 @@ export function convertQueryParams({
|
|
|
166
168
|
const out: RawQueryMessages = {
|
|
167
169
|
...rest,
|
|
168
170
|
messageFeedId: subChannelId,
|
|
169
|
-
isDeleted: includeDeleted
|
|
171
|
+
isDeleted: inferIsDeleted(includeDeleted),
|
|
170
172
|
options: { token: toToken(page || { limit: 10 }, 'afterbeforeraw')! },
|
|
171
173
|
};
|
|
172
174
|
|
|
@@ -5,7 +5,9 @@ import { toToken, toPageRaw } from '~/core/query';
|
|
|
5
5
|
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
6
6
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
7
7
|
import { getResolver } from '~/core/model';
|
|
8
|
+
|
|
8
9
|
import { prepareMembershipPayload } from '~/group/utils';
|
|
10
|
+
import { inferIsDeleted } from '~/utils/inferIsDeleted';
|
|
9
11
|
|
|
10
12
|
/* begin_public_function
|
|
11
13
|
id: post.query, feed.query.community_feed, feed.query.user_feed
|
|
@@ -39,7 +41,7 @@ export const queryPosts = async (
|
|
|
39
41
|
const { data } = await client.http.get<Amity.PostPayload & Amity.Pagination>(`/api/v4/posts`, {
|
|
40
42
|
params: {
|
|
41
43
|
...params,
|
|
42
|
-
isDeleted: includeDeleted
|
|
44
|
+
isDeleted: inferIsDeleted(includeDeleted),
|
|
43
45
|
/*
|
|
44
46
|
* when creating post like image, file, video BE will create 2 posts
|
|
45
47
|
* 1. parent post to store text with dataType=text
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
createQuery,
|
|
8
8
|
filterByFeedType,
|
|
9
9
|
filterByPropEquality,
|
|
10
|
+
filterByPostDataTypes,
|
|
10
11
|
queryOptions,
|
|
11
12
|
runQuery,
|
|
12
13
|
sortByFirstCreated,
|
|
@@ -89,7 +90,7 @@ export const livePosts = (
|
|
|
89
90
|
const sortBy = params.sortBy ? params.sortBy : 'lastCreated';
|
|
90
91
|
posts = posts.sort(sortBy === 'lastCreated' ? sortByLastCreated : sortByFirstCreated);
|
|
91
92
|
|
|
92
|
-
if (params.includeDeleted
|
|
93
|
+
if (!params.includeDeleted) {
|
|
93
94
|
posts = filterByPropEquality(posts, 'isDeleted', false);
|
|
94
95
|
}
|
|
95
96
|
|
|
@@ -101,6 +102,10 @@ export const livePosts = (
|
|
|
101
102
|
posts = filterByFeedType(posts, params.feedType);
|
|
102
103
|
}
|
|
103
104
|
|
|
105
|
+
if (params.dataTypes?.length) {
|
|
106
|
+
posts = filterByPostDataTypes(posts, params.dataTypes);
|
|
107
|
+
}
|
|
108
|
+
|
|
104
109
|
callback({
|
|
105
110
|
onNextPage: onFetch,
|
|
106
111
|
data: posts,
|
|
@@ -127,6 +132,7 @@ export const livePosts = (
|
|
|
127
132
|
}
|
|
128
133
|
|
|
129
134
|
pushToCache(cacheKey, collection);
|
|
135
|
+
disposers.push(() => dropFromCache(cacheKey));
|
|
130
136
|
|
|
131
137
|
responder(collection);
|
|
132
138
|
};
|
|
@@ -183,6 +189,5 @@ export const livePosts = (
|
|
|
183
189
|
return () => {
|
|
184
190
|
log(`livePosts(tmpid: ${timestamp}) > dispose`);
|
|
185
191
|
disposers.forEach(fn => fn());
|
|
186
|
-
dropFromCache(cacheKey);
|
|
187
192
|
};
|
|
188
193
|
};
|