@amityco/ts-sdk 6.12.2-d8fe0d5.0 → 6.12.2-e1d8270.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/@types/core/live.d.ts +2 -0
- package/dist/@types/core/live.d.ts.map +1 -1
- package/dist/@types/core/paging.d.ts +8 -0
- package/dist/@types/core/paging.d.ts.map +1 -1
- package/dist/@types/domains/community.d.ts +1 -1
- package/dist/@types/domains/community.d.ts.map +1 -1
- package/dist/@types/domains/message.d.ts +1 -0
- package/dist/@types/domains/message.d.ts.map +1 -1
- package/dist/core/liveCollection/LiveCollectionController.d.ts +24 -0
- package/dist/core/liveCollection/LiveCollectionController.d.ts.map +1 -0
- package/dist/core/liveCollection/PaginationController.d.ts +15 -0
- package/dist/core/liveCollection/PaginationController.d.ts.map +1 -0
- package/dist/core/liveCollection/QueryStreamController.d.ts +8 -0
- package/dist/core/liveCollection/QueryStreamController.d.ts.map +1 -0
- package/dist/core/liveCollection/hash.d.ts +2 -0
- package/dist/core/liveCollection/hash.d.ts.map +1 -0
- package/dist/index.cjs.js +353 -163
- package/dist/index.esm.js +352 -163
- package/dist/index.umd.js +3 -3
- package/dist/messageRepository/observers/getMessages.d.ts.map +1 -1
- package/dist/messageRepository/observers/liveCollection/MessageLiveCollectionController.d.ts +14 -0
- package/dist/messageRepository/observers/liveCollection/MessageLiveCollectionController.d.ts.map +1 -0
- package/dist/messageRepository/observers/liveCollection/MessagePaginationController.d.ts +13 -0
- package/dist/messageRepository/observers/liveCollection/MessagePaginationController.d.ts.map +1 -0
- package/dist/messageRepository/observers/liveCollection/MessageQueryStreamController.d.ts +13 -0
- package/dist/messageRepository/observers/liveCollection/MessageQueryStreamController.d.ts.map +1 -0
- package/dist/messageRepository/utils/prepareMessagePayload.d.ts +1 -1
- package/dist/messageRepository/utils/prepareMessagePayload.d.ts.map +1 -1
- package/dist/utils/isEqual.d.ts.map +1 -1
- package/package.json +3 -1
- package/src/@types/core/live.ts +2 -0
- package/src/@types/core/paging.ts +8 -2
- package/src/@types/domains/community.ts +1 -1
- package/src/@types/domains/message.ts +1 -0
- package/src/communityRepository/communityMembership/observers/getMembers.ts +2 -2
- package/src/core/liveCollection/LiveCollectionController.ts +105 -0
- package/src/core/liveCollection/PaginationController.ts +62 -0
- package/src/core/liveCollection/QueryStreamController.ts +23 -0
- package/src/core/liveCollection/hash.ts +16 -0
- package/src/messageRepository/observers/getMessages.ts +7 -107
- package/src/messageRepository/observers/liveCollection/MessageLiveCollectionController.ts +162 -0
- package/src/messageRepository/observers/liveCollection/MessagePaginationController.ts +42 -0
- package/src/messageRepository/observers/liveCollection/MessageQueryStreamController.ts +129 -0
- package/src/messageRepository/observers/tests/getMessages.test.ts +35 -27
- package/src/messageRepository/utils/prepareMessagePayload.ts +3 -2
- package/src/utils/isEqual.ts +13 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMessages.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/observers/getMessages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getMessages.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/observers/getMessages.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,WAAW,oDAEd,MAAM,sBAAsB,QA2CrC,CAAC;AAKF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW,WACd,MAAM,sBAAsB,YAC1B,MAAM,sBAAsB,CAAC,MAAM,OAAO,CAAC,WAC5C,MAAM,oBAAoB,KAClC,MAAM,YAuBR,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MessagePaginationController } from './MessagePaginationController';
|
|
2
|
+
import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
|
|
3
|
+
export declare class MessageLiveCollectionController extends LiveCollectionController<MessagePaginationController, Amity.LiveCollectionCallback<Amity.Message>, Amity.Message> {
|
|
4
|
+
private queryStreamController;
|
|
5
|
+
private query;
|
|
6
|
+
constructor(query: Amity.MessagesLiveCollection, callback: Amity.LiveCollectionCallback<Amity.Message>);
|
|
7
|
+
protected setup(): void;
|
|
8
|
+
protected persistModel(queryPayload: Amity.MessagePayload & Amity.Pagination): Promise<void>;
|
|
9
|
+
protected persistQueryStream(queryPayload: Amity.MessagePayload & Amity.Pagination, direction: Amity.LoadingDirection, refresh?: boolean): void;
|
|
10
|
+
startSubscription(): Amity.Unsubscriber[];
|
|
11
|
+
notifyChange(loading: boolean, error?: any): void;
|
|
12
|
+
applyFilter(data: Amity.Message[]): Amity.Message<any>[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=MessageLiveCollectionController.d.ts.map
|
package/dist/messageRepository/observers/liveCollection/MessageLiveCollectionController.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageLiveCollectionController.d.ts","sourceRoot":"","sources":["../../../../src/messageRepository/observers/liveCollection/MessageLiveCollectionController.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAc5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAI1F,qBAAa,+BAAgC,SAAQ,wBAAwB,CAC3E,2BAA2B,EAC3B,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,EAC3C,KAAK,CAAC,OAAO,CACd;IACC,OAAO,CAAC,qBAAqB,CAA+B;IAE5D,OAAO,CAAC,KAAK,CAA+B;gBAG1C,KAAK,EAAE,KAAK,CAAC,sBAAsB,EACnC,QAAQ,EAAE,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC;IAoBvD,SAAS,CAAC,KAAK;cAUC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU;IAIlF,SAAS,CAAC,kBAAkB,CAC1B,YAAY,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,EACrD,SAAS,EAAE,KAAK,CAAC,gBAAgB,EACjC,OAAO,CAAC,EAAE,OAAO;IAKnB,iBAAiB;IAkBjB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG;IAyB1C,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;CA2ClC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PaginationController } from '~/core/liveCollection/PaginationController';
|
|
2
|
+
/**
|
|
3
|
+
* TODO: handle cache receive cache option, and cache policy
|
|
4
|
+
* TODO: check if querybyIds is supported
|
|
5
|
+
*/
|
|
6
|
+
export declare class MessagePaginationController extends PaginationController<Amity.MessagePayload & Amity.Pagination, Amity.MessagesLiveCollection> {
|
|
7
|
+
constructor(queryParams: Amity.MessagesLiveCollection, cacheKey: string[]);
|
|
8
|
+
getRequest(queryParams: Amity.MessagesLiveCollection, token: string | undefined): Promise<Omit<Amity.ProcessedMessagePayload<any>, "messages" | "messageFeeds"> & {
|
|
9
|
+
messages: Amity.RawMessage<any>[];
|
|
10
|
+
messageFeeds?: Amity.RawSubChannel[] | undefined;
|
|
11
|
+
} & Amity.Pagination>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=MessagePaginationController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagePaginationController.d.ts","sourceRoot":"","sources":["../../../../src/messageRepository/observers/liveCollection/MessagePaginationController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAKlF;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,oBAAoB,CACnE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,EACvC,KAAK,CAAC,sBAAsB,CAC7B;gBAEa,WAAW,EAAE,KAAK,CAAC,sBAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE;IAInE,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;;;;CAqBtF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { QueryStreamController } from '../../../core/liveCollection/QueryStreamController';
|
|
2
|
+
export declare class MessageQueryStreamController extends QueryStreamController<Amity.MessagePayload, Amity.MessagesLiveCollection> {
|
|
3
|
+
private notifyChange;
|
|
4
|
+
constructor(query: Amity.MessagesLiveCollection, cacheKey: string[], notifyChange: (loading: boolean, error?: any) => void);
|
|
5
|
+
saveToMainDB(response: Amity.MessagePayload): Promise<void>;
|
|
6
|
+
appendToQueryStream(response: Amity.MessagePayload & Amity.Pagination, direction: Amity.LoadingDirection, refresh?: boolean): void;
|
|
7
|
+
reactor(action: string): (payload: Amity.Message) => void;
|
|
8
|
+
subscribeRTE(createSubscriber: {
|
|
9
|
+
fn: (reactor: Amity.Listener<Amity.Message>) => Amity.Unsubscriber;
|
|
10
|
+
action: string;
|
|
11
|
+
}[]): Amity.Unsubscriber[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=MessageQueryStreamController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageQueryStreamController.d.ts","sourceRoot":"","sources":["../../../../src/messageRepository/observers/liveCollection/MessageQueryStreamController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAQ3F,qBAAa,4BAA6B,SAAQ,qBAAqB,CACrE,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,sBAAsB,CAC7B;IACC,OAAO,CAAC,YAAY,CAA0C;gBAK5D,KAAK,EAAE,KAAK,CAAC,sBAAsB,EACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI;IAOjD,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc;IAWjD,mBAAmB,CACjB,QAAQ,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU,EACjD,SAAS,EAAE,KAAK,CAAC,gBAAgB,EACjC,OAAO,UAAQ;IAiCjB,OAAO,CAAC,MAAM,EAAE,MAAM,aACH,MAAM,OAAO;IA6ChC,YAAY,CACV,gBAAgB,EAAE;QAChB,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;QACnE,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE;CAIN"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare function convertFromRaw(message: Amity.RawMessage, reactors?: Amity.Reactor[], event?: keyof Amity.MqttMessageEvents): Amity.Message;
|
|
2
2
|
export declare const prepareMessagePayload: (payload: Amity.MessagePayload, event?: keyof Amity.MqttMessageEvents) => Promise<Amity.ProcessedMessagePayload>;
|
|
3
|
-
declare type RawQueryMessages = Omit<Amity.QueryMessages, 'page' | 'sortBy' | 'subChannelId' | 'tags' | 'includeDeleted'> & {
|
|
3
|
+
declare type RawQueryMessages = Omit<Amity.QueryMessages, 'page' | 'sortBy' | 'subChannelId' | 'tags' | 'includeDeleted' | 'aroundMessageId'> & {
|
|
4
4
|
includeTags?: Amity.QueryMessages['tags'];
|
|
5
5
|
isDeleted?: Amity.Message['isDeleted'];
|
|
6
6
|
messageFeedId: Amity.QueryMessages['subChannelId'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareMessagePayload.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/utils/prepareMessagePayload.ts"],"names":[],"mappings":"AAYA,wBAAgB,cAAc,CAC5B,OAAO,EAAE,KAAK,CAAC,UAAU,EACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,EAC1B,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,iBAAiB,GACpC,KAAK,CAAC,OAAO,CAsEf;AAQD,eAAO,MAAM,qBAAqB,YACvB,MAAM,cAAc,UACrB,MAAM,MAAM,iBAAiB,KACpC,QAAQ,MAAM,uBAAuB,CAmCvC,CAAC;AAEF,aAAK,gBAAgB,GAAG,IAAI,CAC1B,KAAK,CAAC,aAAa,EAInB,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"prepareMessagePayload.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/utils/prepareMessagePayload.ts"],"names":[],"mappings":"AAYA,wBAAgB,cAAc,CAC5B,OAAO,EAAE,KAAK,CAAC,UAAU,EACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,EAC1B,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,iBAAiB,GACpC,KAAK,CAAC,OAAO,CAsEf;AAQD,eAAO,MAAM,qBAAqB,YACvB,MAAM,cAAc,UACrB,MAAM,MAAM,iBAAiB,KACpC,QAAQ,MAAM,uBAAuB,CAmCvC,CAAC;AAEF,aAAK,gBAAgB,GAAG,IAAI,CAC1B,KAAK,CAAC,aAAa,EAInB,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,gBAAgB,GAAG,iBAAiB,CACnF,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,QAAQ,EACR,IAAI,EACJ,GAAG,IAAI,EACR,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAc9C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,cAAc,EACd,GAAG,IAAI,EACR,EAAE,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAkBxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isEqual.d.ts","sourceRoot":"","sources":["../../src/utils/isEqual.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"isEqual.d.ts","sourceRoot":"","sources":["../../src/utils/isEqual.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,CAkE/C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amityco/ts-sdk",
|
|
3
|
-
"version": "6.12.2-
|
|
3
|
+
"version": "6.12.2-e1d8270.0",
|
|
4
4
|
"license": "CC-BY-ND-4.0",
|
|
5
5
|
"author": "amity.co <developers@amity.co> (https://amity.co)",
|
|
6
6
|
"description": "Amity Social Cloud Typescript SDK",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"@types/debug": "^4.1.7",
|
|
42
42
|
"@types/jest": "^27.5.1",
|
|
43
43
|
"@types/node": "^18.6.4",
|
|
44
|
+
"@types/object-hash": "^3.0.6",
|
|
44
45
|
"@types/socket.io-client": "^1.4.34",
|
|
45
46
|
"chalk": "^4.1.2",
|
|
46
47
|
"concurrently": "^6.1.0",
|
|
@@ -64,6 +65,7 @@
|
|
|
64
65
|
"js-base64": "^3.7.2",
|
|
65
66
|
"mitt": "^3.0.0",
|
|
66
67
|
"mqtt": "^4.3.7",
|
|
68
|
+
"object-hash": "^3.0.0",
|
|
67
69
|
"react-native-uuid": "^2.0.1",
|
|
68
70
|
"socket.io-client": "2.2.0",
|
|
69
71
|
"ts-jest": "^28.0.3"
|
package/src/@types/core/live.ts
CHANGED
|
@@ -20,6 +20,8 @@ declare global {
|
|
|
20
20
|
type LiveCollection<T extends any> = LiveObject<T[]> & {
|
|
21
21
|
onNextPage: () => void;
|
|
22
22
|
hasNextPage: boolean;
|
|
23
|
+
onPrevPage?: () => void;
|
|
24
|
+
hasPrevPage?: boolean;
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
type LiveCollectionCallback<T extends any> = Amity.Listener<LiveCollection<T>>;
|
|
@@ -8,15 +8,19 @@ declare global {
|
|
|
8
8
|
limit: number;
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
+
type PageAround = {
|
|
12
|
+
around: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
11
15
|
type PrevPage<T extends number | string> = PageLimit & {
|
|
12
16
|
after?: never;
|
|
13
17
|
before?: T;
|
|
14
|
-
};
|
|
18
|
+
} & { around?: PageAround['around'] };
|
|
15
19
|
|
|
16
20
|
type NextPage<T extends number | string> = PageLimit & {
|
|
17
21
|
after?: T;
|
|
18
22
|
before?: never;
|
|
19
|
-
};
|
|
23
|
+
} & { around?: PageAround['around'] };
|
|
20
24
|
|
|
21
25
|
type Page<T extends number | string = number> = PrevPage<T> | NextPage<T>;
|
|
22
26
|
|
|
@@ -56,5 +60,7 @@ declare global {
|
|
|
56
60
|
};
|
|
57
61
|
|
|
58
62
|
type Paged<T, K extends Page | PageRaw = Page> = { data: T[] } & Pages<K>;
|
|
63
|
+
|
|
64
|
+
type LoadingDirection = 'first' | 'prev' | 'next';
|
|
59
65
|
}
|
|
60
66
|
}
|
|
@@ -90,7 +90,7 @@ declare global {
|
|
|
90
90
|
|
|
91
91
|
type QueryCommunityMembers = {
|
|
92
92
|
communityId: string;
|
|
93
|
-
|
|
93
|
+
memberships?: ('banned' | 'member')[];
|
|
94
94
|
roles?: string[];
|
|
95
95
|
sortBy?: 'firstCreated' | 'lastCreated';
|
|
96
96
|
search?: Amity.InternalUser['displayName'] | Amity.InternalUser['userId'];
|
|
@@ -37,10 +37,10 @@ export const applyFilter = <T extends Amity.Membership<'community'>>(
|
|
|
37
37
|
): T[] => {
|
|
38
38
|
let communityMembers = filterByPropIntersection(data, 'roles', params.roles);
|
|
39
39
|
|
|
40
|
-
if (params.
|
|
40
|
+
if (params.memberships) {
|
|
41
41
|
communityMembers = communityMembers.filter(({ communityMembership }) =>
|
|
42
42
|
// @ts-ignore
|
|
43
|
-
params.
|
|
43
|
+
params.memberships.includes(communityMembership),
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
import { PaginationController } from './PaginationController';
|
|
3
|
+
import { isEqual } from '~/utils/isEqual';
|
|
4
|
+
|
|
5
|
+
export abstract class LiveCollectionController<
|
|
6
|
+
T extends PaginationController<any, any>,
|
|
7
|
+
T2 extends Amity.LiveCollectionCallback<any>,
|
|
8
|
+
T3 extends Amity.Models[Amity.Domain],
|
|
9
|
+
> {
|
|
10
|
+
protected paginationController: T;
|
|
11
|
+
|
|
12
|
+
protected queryStreamId: string;
|
|
13
|
+
|
|
14
|
+
protected cacheKey: string[];
|
|
15
|
+
|
|
16
|
+
protected callback: T2;
|
|
17
|
+
|
|
18
|
+
protected snapshot: { loading: boolean; data: T3[] } | undefined;
|
|
19
|
+
|
|
20
|
+
constructor(paginationController: T, queryStreamId: string, cacheKey: string[], callback: T2) {
|
|
21
|
+
this.paginationController = paginationController;
|
|
22
|
+
this.queryStreamId = queryStreamId;
|
|
23
|
+
this.cacheKey = cacheKey;
|
|
24
|
+
this.callback = callback;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private async refresh() {
|
|
28
|
+
try {
|
|
29
|
+
const result = await this.paginationController.loadFirstPage();
|
|
30
|
+
if (!result) return;
|
|
31
|
+
|
|
32
|
+
await this.persistModel(result);
|
|
33
|
+
|
|
34
|
+
this.persistQueryStream(result, 'next', true);
|
|
35
|
+
this.notifyChange(false);
|
|
36
|
+
} catch (e) {
|
|
37
|
+
this.notifyChange(false, e);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected loadPage(initial = false) {
|
|
42
|
+
this.setup();
|
|
43
|
+
|
|
44
|
+
this.notifyChange(true);
|
|
45
|
+
|
|
46
|
+
if (initial) {
|
|
47
|
+
this.refresh();
|
|
48
|
+
} else {
|
|
49
|
+
this.loadNextPage();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected abstract setup(): void;
|
|
54
|
+
|
|
55
|
+
async loadNextPage() {
|
|
56
|
+
try {
|
|
57
|
+
const result = await this.paginationController.loadNextPage();
|
|
58
|
+
if (!result) return;
|
|
59
|
+
|
|
60
|
+
await this.persistModel(result);
|
|
61
|
+
|
|
62
|
+
this.persistQueryStream(result, 'next');
|
|
63
|
+
this.notifyChange(false);
|
|
64
|
+
} catch (e) {
|
|
65
|
+
this.notifyChange(false, e);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async loadPrevPage() {
|
|
70
|
+
try {
|
|
71
|
+
const result = await this.paginationController.loadPreviousPage();
|
|
72
|
+
if (!result) return;
|
|
73
|
+
|
|
74
|
+
await this.persistModel(result);
|
|
75
|
+
|
|
76
|
+
this.persistQueryStream(result, 'prev');
|
|
77
|
+
this.notifyChange(false);
|
|
78
|
+
} catch (e) {
|
|
79
|
+
this.notifyChange(false, e);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
protected abstract persistModel(queryPayload: ValueOf<Amity.Payloads> & Amity.Pagination): void;
|
|
84
|
+
|
|
85
|
+
protected abstract persistQueryStream(
|
|
86
|
+
queryPayload: ValueOf<Amity.Payloads> & Amity.Pagination,
|
|
87
|
+
direction: Amity.LoadingDirection,
|
|
88
|
+
refresh?: boolean,
|
|
89
|
+
): void;
|
|
90
|
+
|
|
91
|
+
abstract startSubscription(): Amity.Unsubscriber[];
|
|
92
|
+
|
|
93
|
+
abstract notifyChange(loading: boolean, error?: any): void;
|
|
94
|
+
|
|
95
|
+
protected shouldNotify(loading: boolean, data: T3[]) {
|
|
96
|
+
if (this.snapshot?.loading === loading && isEqual(this.snapshot.data, data)) return false;
|
|
97
|
+
|
|
98
|
+
this.snapshot = { loading, data };
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public getCacheKey() {
|
|
103
|
+
return this.cacheKey;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
|
|
3
|
+
import { AxiosInstance } from 'axios';
|
|
4
|
+
import { getActiveClient } from '~/client/api';
|
|
5
|
+
|
|
6
|
+
export abstract class PaginationController<
|
|
7
|
+
T1 extends ValueOf<Amity.Payloads> & Amity.Pagination,
|
|
8
|
+
T2 extends Amity.LiveCollectionParams<any>,
|
|
9
|
+
> {
|
|
10
|
+
private queryParams: T2;
|
|
11
|
+
|
|
12
|
+
private cacheKey: string[];
|
|
13
|
+
|
|
14
|
+
protected http: AxiosInstance;
|
|
15
|
+
|
|
16
|
+
private previousToken: string | undefined;
|
|
17
|
+
|
|
18
|
+
private nextToken: string | undefined;
|
|
19
|
+
|
|
20
|
+
constructor(queryParams: T2, cacheKey: string[]) {
|
|
21
|
+
const { log, cache, userId, http } = getActiveClient();
|
|
22
|
+
this.queryParams = queryParams;
|
|
23
|
+
this.cacheKey = cacheKey;
|
|
24
|
+
this.http = http;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
loadFirstPage(): Promise<T1 | undefined> {
|
|
28
|
+
return this.onFetch('first');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
loadNextPage(): Promise<T1 | undefined> {
|
|
32
|
+
return this.onFetch('next');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
loadPreviousPage(): Promise<T1 | undefined> {
|
|
36
|
+
return this.onFetch('prev');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async onFetch(direction: Amity.LoadingDirection = 'first') {
|
|
40
|
+
if (direction === 'prev' && !this.previousToken) return;
|
|
41
|
+
if (direction === 'next' && !this.nextToken) return;
|
|
42
|
+
|
|
43
|
+
let token: string | undefined;
|
|
44
|
+
|
|
45
|
+
if (direction === 'prev') token = this.previousToken;
|
|
46
|
+
if (direction === 'next') token = this.nextToken;
|
|
47
|
+
|
|
48
|
+
const queryResponse = await this.getRequest(this.queryParams, token);
|
|
49
|
+
|
|
50
|
+
if (direction === 'first') {
|
|
51
|
+
this.nextToken = queryResponse.paging?.next;
|
|
52
|
+
this.previousToken = queryResponse.paging?.previous;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (direction === 'prev') this.previousToken = queryResponse.paging?.previous;
|
|
56
|
+
if (direction === 'next') this.nextToken = queryResponse.paging?.next;
|
|
57
|
+
|
|
58
|
+
return queryResponse;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
abstract getRequest(queryParams: T2, token: string | undefined): Promise<T1>;
|
|
62
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
|
|
3
|
+
export abstract class QueryStreamController<
|
|
4
|
+
T extends ValueOf<Amity.Payloads>,
|
|
5
|
+
T2 extends Amity.LiveCollectionParams<any>,
|
|
6
|
+
> {
|
|
7
|
+
protected query: T2;
|
|
8
|
+
|
|
9
|
+
protected cacheKey: string[];
|
|
10
|
+
|
|
11
|
+
constructor(query: T2, cacheKey: string[]) {
|
|
12
|
+
this.query = query;
|
|
13
|
+
this.cacheKey = cacheKey;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
abstract saveToMainDB(objects: T): Promise<void>;
|
|
17
|
+
|
|
18
|
+
abstract appendToQueryStream(
|
|
19
|
+
objects: T & Amity.Pagination,
|
|
20
|
+
direction: Amity.LoadingDirection,
|
|
21
|
+
refresh: boolean | undefined,
|
|
22
|
+
): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
|
|
3
|
+
export const hashCode = (string: string) => {
|
|
4
|
+
let hash = 0;
|
|
5
|
+
let i;
|
|
6
|
+
let chr;
|
|
7
|
+
if (string.length === 0) return hash;
|
|
8
|
+
/* eslint-disable no-plusplus */
|
|
9
|
+
for (let i = 0; i < string.length; i++) {
|
|
10
|
+
chr = string.charCodeAt(i);
|
|
11
|
+
hash = (hash < 5 ? 5 : hash) - hash + chr;
|
|
12
|
+
/* eslint-disable no-bitwise */
|
|
13
|
+
hash |= 0; // Convert to 32bit integer
|
|
14
|
+
}
|
|
15
|
+
return hash;
|
|
16
|
+
};
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
} from '../events';
|
|
27
27
|
import { onMessageFetched } from '../events/onMessageFetched';
|
|
28
28
|
import { queryMessages } from '../api/queryMessages';
|
|
29
|
+
import { MessageLiveCollectionController } from './liveCollection/MessageLiveCollectionController';
|
|
29
30
|
|
|
30
31
|
/*
|
|
31
32
|
* Exported for testing
|
|
@@ -114,115 +115,14 @@ export const getMessages = (
|
|
|
114
115
|
const timestamp = Date.now();
|
|
115
116
|
log(`getMessages(tmpid: ${timestamp}) > listen`);
|
|
116
117
|
|
|
117
|
-
const
|
|
118
|
+
const messagesLiveCollection = new MessageLiveCollectionController(params, callback);
|
|
119
|
+
const disposers = messagesLiveCollection.startSubscription();
|
|
118
120
|
|
|
119
|
-
const
|
|
120
|
-
const { policy = COLLECTION_DEFAULT_CACHING_POLICY } = config ?? {};
|
|
121
|
+
const cacheKey = messagesLiveCollection.getCacheKey();
|
|
121
122
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const responder = (data: Amity.MessageLiveCollectionCache) => {
|
|
127
|
-
const messages: Amity.Message[] = applyFilter(
|
|
128
|
-
data.data
|
|
129
|
-
.map(messageId => pullFromCache<Amity.Message>(['message', 'get', messageId])!)
|
|
130
|
-
.filter(Boolean)
|
|
131
|
-
.map(({ data }) => data) ?? [],
|
|
132
|
-
params,
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
callback({
|
|
136
|
-
onNextPage: onFetch,
|
|
137
|
-
data: messages,
|
|
138
|
-
hasNextPage: !!data.params?.page,
|
|
139
|
-
loading: data.loading,
|
|
140
|
-
error: data.error,
|
|
141
|
-
});
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
const realtimeRouter = (action: Amity.MessageActionType) => (message: Amity.Message) => {
|
|
145
|
-
const collection = pullFromCache<Amity.MessageLiveCollectionCache>(cacheKey)?.data;
|
|
146
|
-
|
|
147
|
-
if (params.subChannelId !== message?.subChannelId || !collection) return;
|
|
148
|
-
|
|
149
|
-
// /*
|
|
150
|
-
// * check if RTE message event payload is with the params in order to update in the colleciton cache
|
|
151
|
-
// */
|
|
152
|
-
|
|
153
|
-
if (params.dataType && params.dataType !== message.dataType) return;
|
|
154
|
-
|
|
155
|
-
if (params.excludeTags && params.excludeTags?.some(value => message.tags?.includes(value)))
|
|
156
|
-
return;
|
|
157
|
-
|
|
158
|
-
if (!!params.hasFlags !== !!message.flagCount) return;
|
|
159
|
-
|
|
160
|
-
if (params.parentId && params.parentId !== message.parentId) return;
|
|
161
|
-
|
|
162
|
-
if (params.hasOwnProperty('includeDeleted') && !params.includeDeleted && message.isDeleted)
|
|
163
|
-
return;
|
|
164
|
-
|
|
165
|
-
if (params.tags && !params.tags?.some(value => message.tags?.includes(value))) return;
|
|
166
|
-
|
|
167
|
-
if (!collection.data.includes(message.messageId) && action === 'onCreate') {
|
|
168
|
-
collection.data = [...new Set([message.messageId, ...collection.data])];
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
pushToCache(cacheKey, collection);
|
|
172
|
-
|
|
173
|
-
responder(collection);
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
const onFetch = (initial = false) => {
|
|
177
|
-
const collection = pullFromCache<Amity.MessageLiveCollectionCache>(cacheKey)?.data;
|
|
178
|
-
const messages = collection?.data ?? [];
|
|
179
|
-
|
|
180
|
-
if (!initial && messages.length > 0 && !collection?.params?.paging?.next) return;
|
|
181
|
-
|
|
182
|
-
const query = createQuery(queryMessages, {
|
|
183
|
-
...queryParams,
|
|
184
|
-
page: (!initial ? collection?.params.page : undefined) ?? { limit },
|
|
185
|
-
pageToken: collection?.params?.paging?.next,
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
runQuery(
|
|
189
|
-
query,
|
|
190
|
-
({ data: result, error, loading, nextPage: page, paging }) => {
|
|
191
|
-
const data = {
|
|
192
|
-
loading,
|
|
193
|
-
error,
|
|
194
|
-
params: { page, paging },
|
|
195
|
-
data: messages,
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
if (result) {
|
|
199
|
-
data.data = [...new Set([...messages, ...result.map(getResolver('message'))])];
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
pushToCache(cacheKey, data);
|
|
203
|
-
|
|
204
|
-
responder(data);
|
|
205
|
-
},
|
|
206
|
-
queryOptions(policy, CACHE_SHORTEN_LIFESPAN),
|
|
207
|
-
);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
disposers.push(
|
|
211
|
-
onMessageFetched(realtimeRouter('onFetch')),
|
|
212
|
-
onMessageCreated(realtimeRouter('onCreate')),
|
|
213
|
-
onMessageUpdated(realtimeRouter('onUpdate')),
|
|
214
|
-
onMessageDeleted(realtimeRouter('onDelete')),
|
|
215
|
-
onMessageFlagged(realtimeRouter('onFlagged')),
|
|
216
|
-
onMessageUnflagged(realtimeRouter('onUnflagged')),
|
|
217
|
-
onMessageFlagCleared(realtimeRouter('onFlagCleared')),
|
|
218
|
-
onMessageReactionAdded(realtimeRouter('onReactionAdded')),
|
|
219
|
-
onMessageReactionRemoved(realtimeRouter('onReactionRemoved')),
|
|
220
|
-
convertEventPayload(onMessageMarkerFetched, 'contentId', 'message')(realtimeRouter('onUpdate')),
|
|
221
|
-
convertEventPayload(onMessageMarked, 'contentId', 'message')(realtimeRouter('onUpdate')),
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
onFetch(true);
|
|
225
|
-
disposers.push(() => dropFromCache(cacheKey));
|
|
123
|
+
disposers.push(() => {
|
|
124
|
+
dropFromCache(cacheKey);
|
|
125
|
+
});
|
|
226
126
|
|
|
227
127
|
return () => {
|
|
228
128
|
log(`getMessages(tmpid: ${timestamp}) > dispose`);
|