@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.
Files changed (46) hide show
  1. package/dist/@types/core/live.d.ts +2 -0
  2. package/dist/@types/core/live.d.ts.map +1 -1
  3. package/dist/@types/core/paging.d.ts +8 -0
  4. package/dist/@types/core/paging.d.ts.map +1 -1
  5. package/dist/@types/domains/community.d.ts +1 -1
  6. package/dist/@types/domains/community.d.ts.map +1 -1
  7. package/dist/@types/domains/message.d.ts +1 -0
  8. package/dist/@types/domains/message.d.ts.map +1 -1
  9. package/dist/core/liveCollection/LiveCollectionController.d.ts +24 -0
  10. package/dist/core/liveCollection/LiveCollectionController.d.ts.map +1 -0
  11. package/dist/core/liveCollection/PaginationController.d.ts +15 -0
  12. package/dist/core/liveCollection/PaginationController.d.ts.map +1 -0
  13. package/dist/core/liveCollection/QueryStreamController.d.ts +8 -0
  14. package/dist/core/liveCollection/QueryStreamController.d.ts.map +1 -0
  15. package/dist/core/liveCollection/hash.d.ts +2 -0
  16. package/dist/core/liveCollection/hash.d.ts.map +1 -0
  17. package/dist/index.cjs.js +353 -163
  18. package/dist/index.esm.js +352 -163
  19. package/dist/index.umd.js +3 -3
  20. package/dist/messageRepository/observers/getMessages.d.ts.map +1 -1
  21. package/dist/messageRepository/observers/liveCollection/MessageLiveCollectionController.d.ts +14 -0
  22. package/dist/messageRepository/observers/liveCollection/MessageLiveCollectionController.d.ts.map +1 -0
  23. package/dist/messageRepository/observers/liveCollection/MessagePaginationController.d.ts +13 -0
  24. package/dist/messageRepository/observers/liveCollection/MessagePaginationController.d.ts.map +1 -0
  25. package/dist/messageRepository/observers/liveCollection/MessageQueryStreamController.d.ts +13 -0
  26. package/dist/messageRepository/observers/liveCollection/MessageQueryStreamController.d.ts.map +1 -0
  27. package/dist/messageRepository/utils/prepareMessagePayload.d.ts +1 -1
  28. package/dist/messageRepository/utils/prepareMessagePayload.d.ts.map +1 -1
  29. package/dist/utils/isEqual.d.ts.map +1 -1
  30. package/package.json +3 -1
  31. package/src/@types/core/live.ts +2 -0
  32. package/src/@types/core/paging.ts +8 -2
  33. package/src/@types/domains/community.ts +1 -1
  34. package/src/@types/domains/message.ts +1 -0
  35. package/src/communityRepository/communityMembership/observers/getMembers.ts +2 -2
  36. package/src/core/liveCollection/LiveCollectionController.ts +105 -0
  37. package/src/core/liveCollection/PaginationController.ts +62 -0
  38. package/src/core/liveCollection/QueryStreamController.ts +23 -0
  39. package/src/core/liveCollection/hash.ts +16 -0
  40. package/src/messageRepository/observers/getMessages.ts +7 -107
  41. package/src/messageRepository/observers/liveCollection/MessageLiveCollectionController.ts +162 -0
  42. package/src/messageRepository/observers/liveCollection/MessagePaginationController.ts +42 -0
  43. package/src/messageRepository/observers/liveCollection/MessageQueryStreamController.ts +129 -0
  44. package/src/messageRepository/observers/tests/getMessages.test.ts +35 -27
  45. package/src/messageRepository/utils/prepareMessagePayload.ts +3 -2
  46. 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":"AAiCA,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,YA4HR,CAAC"}
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
@@ -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,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,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,CAiBxC"}
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,CAqD/C"}
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-d8fe0d5.0",
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"
@@ -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
- membership?: ('banned' | 'member')[];
93
+ memberships?: ('banned' | 'member')[];
94
94
  roles?: string[];
95
95
  sortBy?: 'firstCreated' | 'lastCreated';
96
96
  search?: Amity.InternalUser['displayName'] | Amity.InternalUser['userId'];
@@ -89,6 +89,7 @@ declare global {
89
89
  sortBy?: 'segmentAsc' | 'segmentDesc';
90
90
  tags?: Amity.Taggable['tags'];
91
91
  pageToken?: string;
92
+ aroundMessageId?: Amity.Message['messageId'];
92
93
  };
93
94
 
94
95
  type QueryReadUsers = {
@@ -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.membership) {
40
+ if (params.memberships) {
41
41
  communityMembers = communityMembers.filter(({ communityMembership }) =>
42
42
  // @ts-ignore
43
- params.membership.includes(communityMembership),
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 { limit: queryLimit, ...queryParams } = params;
118
+ const messagesLiveCollection = new MessageLiveCollectionController(params, callback);
119
+ const disposers = messagesLiveCollection.startSubscription();
118
120
 
119
- const limit = queryLimit ?? COLLECTION_DEFAULT_PAGINATION_LIMIT;
120
- const { policy = COLLECTION_DEFAULT_CACHING_POLICY } = config ?? {};
121
+ const cacheKey = messagesLiveCollection.getCacheKey();
121
122
 
122
- const disposers: Amity.Unsubscriber[] = [];
123
- const uniqueId = uuid();
124
- const cacheKey = ['message', 'collection', params, uniqueId];
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`);