@amityco/ts-sdk 6.17.3-beac0a2.0 → 6.17.3-e382dbe.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 (65) hide show
  1. package/dist/@types/core/payload.d.ts +2 -0
  2. package/dist/@types/core/payload.d.ts.map +1 -1
  3. package/dist/@types/domains/client.d.ts +2 -0
  4. package/dist/@types/domains/client.d.ts.map +1 -1
  5. package/dist/@types/domains/story.d.ts +18 -1
  6. package/dist/@types/domains/story.d.ts.map +1 -1
  7. package/dist/channelRepository/observers/getChannels/ChannelLiveCollectionController.d.ts.map +1 -1
  8. package/dist/channelRepository/observers/getChannels/ChannelQueryStreamController.d.ts.map +1 -1
  9. package/dist/client/api/createClient.d.ts.map +1 -1
  10. package/dist/client/api/validateTexts.d.ts +8 -0
  11. package/dist/client/api/validateTexts.d.ts.map +1 -0
  12. package/dist/client/api/validateUrls.d.ts +8 -0
  13. package/dist/client/api/validateUrls.d.ts.map +1 -0
  14. package/dist/core/query/sorting.d.ts +6 -0
  15. package/dist/core/query/sorting.d.ts.map +1 -1
  16. package/dist/index.cjs.js +385 -39
  17. package/dist/index.esm.js +385 -40
  18. package/dist/index.umd.js +4 -4
  19. package/dist/storyRepository/api/createImageStory.d.ts.map +1 -1
  20. package/dist/storyRepository/api/createVideoStory.d.ts.map +1 -1
  21. package/dist/storyRepository/constants.d.ts +2 -0
  22. package/dist/storyRepository/constants.d.ts.map +1 -1
  23. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.d.ts +14 -0
  24. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.d.ts.map +1 -0
  25. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.d.ts +13 -0
  26. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.d.ts.map +1 -0
  27. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.d.ts +16 -0
  28. package/dist/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.d.ts.map +1 -0
  29. package/dist/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.d.ts +2 -0
  30. package/dist/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.d.ts.map +1 -0
  31. package/dist/storyRepository/observers/getGlobalStoryTargets/index.d.ts +2 -0
  32. package/dist/storyRepository/observers/getGlobalStoryTargets/index.d.ts.map +1 -0
  33. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.d.ts.map +1 -1
  34. package/dist/storyRepository/observers/index.d.ts +1 -0
  35. package/dist/storyRepository/observers/index.d.ts.map +1 -1
  36. package/dist/storyRepository/utils/StoryComputedValue.d.ts +23 -0
  37. package/dist/storyRepository/utils/StoryComputedValue.d.ts.map +1 -0
  38. package/dist/utils/linkedObject/storyLinkedObject.d.ts.map +1 -1
  39. package/dist/utils/linkedObject/storyTargetLinkedObject.d.ts.map +1 -1
  40. package/package.json +1 -1
  41. package/src/@types/core/payload.ts +4 -0
  42. package/src/@types/domains/client.ts +2 -0
  43. package/src/@types/domains/story.ts +22 -2
  44. package/src/channelRepository/observers/getChannels/ChannelLiveCollectionController.ts +24 -1
  45. package/src/channelRepository/observers/getChannels/ChannelQueryStreamController.ts +4 -1
  46. package/src/client/api/createClient.ts +4 -0
  47. package/src/client/api/validateTexts.ts +23 -0
  48. package/src/client/api/validateUrls.ts +23 -0
  49. package/src/core/query/sorting.ts +8 -0
  50. package/src/storyRepository/api/createImageStory.ts +7 -0
  51. package/src/storyRepository/api/createVideoStory.ts +7 -0
  52. package/src/storyRepository/constants.ts +2 -0
  53. package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.ts +153 -0
  54. package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.ts +73 -0
  55. package/src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.ts +94 -0
  56. package/src/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.ts +32 -0
  57. package/src/storyRepository/observers/getGlobalStoryTargets/index.ts +1 -0
  58. package/src/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.ts +0 -2
  59. package/src/storyRepository/observers/index.ts +1 -0
  60. package/src/storyRepository/utils/StoryComputedValue.ts +144 -0
  61. package/src/utils/linkedObject/storyLinkedObject.ts +2 -1
  62. package/src/utils/linkedObject/storyTargetLinkedObject.ts +27 -4
  63. package/dist/storyRepository/utils/calculateHasUnseenFlag.d.ts +0 -6
  64. package/dist/storyRepository/utils/calculateHasUnseenFlag.d.ts.map +0 -1
  65. package/src/storyRepository/utils/calculateHasUnseenFlag.ts +0 -47
@@ -1 +1 @@
1
- {"version":3,"file":"createImageStory.d.ts","sourceRoot":"","sources":["../../../src/storyRepository/api/createImageStory.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,eACf,MAAM,aAAa,CAAC,YAAY,CAAC,YACnC,MAAM,aAAa,CAAC,UAAU,CAAC,YAC/B,QAAQ,aACR,MAAM,QAAQ,qBACN,MAAM,gBAAgB,UACjC,MAAM,SAAS,EAAE,KACvB,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,CAoE/C,CAAC"}
1
+ {"version":3,"file":"createImageStory.d.ts","sourceRoot":"","sources":["../../../src/storyRepository/api/createImageStory.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,eACf,MAAM,aAAa,CAAC,YAAY,CAAC,YACnC,MAAM,aAAa,CAAC,UAAU,CAAC,YAC/B,QAAQ,aACR,MAAM,QAAQ,qBACN,MAAM,gBAAgB,UACjC,MAAM,SAAS,EAAE,KACvB,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,CA2E/C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createVideoStory.d.ts","sourceRoot":"","sources":["../../../src/storyRepository/api/createVideoStory.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,gBAAgB,eACf,MAAM,aAAa,CAAC,YAAY,CAAC,YACnC,MAAM,aAAa,CAAC,UAAU,CAAC,YAC/B,QAAQ,aACR,MAAM,QAAQ,UACjB,MAAM,SAAS,EAAE,KACvB,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,CAmE/C,CAAC"}
1
+ {"version":3,"file":"createVideoStory.d.ts","sourceRoot":"","sources":["../../../src/storyRepository/api/createVideoStory.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,gBAAgB,eACf,MAAM,aAAa,CAAC,YAAY,CAAC,YACnC,MAAM,aAAa,CAAC,UAAU,CAAC,YAC/B,QAAQ,aACR,MAAM,QAAQ,UACjB,MAAM,SAAS,EAAE,KACvB,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,CA0E/C,CAAC"}
@@ -1,7 +1,9 @@
1
1
  export declare const enum STORY_KEY_CACHE {
2
2
  STORY = "story",
3
+ STORY_TARGET = "storyTarget",
3
4
  SYNC_STATE = "story-sync-state",
4
5
  STORY_TARGET_IDS = "story-target-ids",
6
+ STORY_GLOBAL_FEED = "story-global-feed",
5
7
  IS_SEEN = "story-seen",
6
8
  LAST_SEEN = "story-last-seen",
7
9
  EXPIRE = "story-expire",
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/storyRepository/constants.ts"],"names":[],"mappings":"AAAA,0BAAkB,eAAe;IAC/B,KAAK,UAAU;IACf,UAAU,qBAAqB;IAC/B,gBAAgB,qBAAqB;IACrC,OAAO,eAAe;IACtB,SAAS,oBAAoB;IAC7B,MAAM,iBAAiB;IACvB,wBAAwB,oBAAoB;CAC7C"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/storyRepository/constants.ts"],"names":[],"mappings":"AAAA,0BAAkB,eAAe;IAC/B,KAAK,UAAU;IACf,YAAY,gBAAgB;IAC5B,UAAU,qBAAqB;IAC/B,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,OAAO,eAAe;IACtB,SAAS,oBAAoB;IAC7B,MAAM,iBAAiB;IACvB,wBAAwB,oBAAoB;CAC7C"}
@@ -0,0 +1,14 @@
1
+ import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
2
+ import { GlobalStoryPageController } from './GlobalStoryPageController';
3
+ export declare class GlobalStoryLiveCollectionController extends LiveCollectionController<'globalStoryFeed', Amity.StoryGlobalQuery, Amity.StoryTarget, GlobalStoryPageController> {
4
+ private queryStreamController;
5
+ private query;
6
+ constructor(query: Amity.StoryGlobalQuery, callback: Amity.LiveCollectionCallback<Amity.StoryTarget>);
7
+ protected setup(): void;
8
+ protected persistModel(response: Amity.GlobalStoryFeedPayload): void;
9
+ protected persistQueryStream({ response, direction, refresh, }: Amity.LiveCollectionPersistQueryStreamParams<'globalStoryFeed'>): void;
10
+ notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams): void;
11
+ private applyFilter;
12
+ startSubscription(): Amity.Unsubscriber[];
13
+ }
14
+ //# sourceMappingURL=GlobalStoryLiveCollectionController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalStoryLiveCollectionController.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryLiveCollectionController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAU1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAQxE,qBAAa,mCAAoC,SAAQ,wBAAwB,CAC/E,iBAAiB,EACjB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,WAAW,EACjB,yBAAyB,CAC1B;IACC,OAAO,CAAC,qBAAqB,CAAmC;IAEhE,OAAO,CAAC,KAAK,CAAyB;gBAGpC,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAC7B,QAAQ,EAAE,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,WAAW,CAAC;IAsB3D,SAAS,CAAC,KAAK;IAUf,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,sBAAsB;IAI7D,SAAS,CAAC,kBAAkB,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,GACR,EAAE,KAAK,CAAC,sCAAsC,CAAC,iBAAiB,CAAC;IAIlE,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,0BAA0B;IAyBzE,OAAO,CAAC,WAAW;IAuCnB,iBAAiB;CAalB"}
@@ -0,0 +1,13 @@
1
+ import { PaginationController } from '~/core/liveCollection/PaginationController';
2
+ declare type GlobalStoryFeedResult = Amity.GlobalStoryFeedPayload & Amity.Pagination;
3
+ export declare class GlobalStoryPageController extends PaginationController<'globalStoryFeed', Amity.LiveCollectionParams<Amity.StoryGlobalQuery>> {
4
+ private smartFilterState;
5
+ getRequest(queryParams: Amity.LiveCollectionParams<Amity.StoryGlobalQuery>, token: string | undefined): Promise<GlobalStoryFeedResult>;
6
+ createRequest(params: {
7
+ seenState: Amity.StorySeenQuery;
8
+ limit: number;
9
+ token?: string;
10
+ }): Promise<GlobalStoryFeedResult>;
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=GlobalStoryPageController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalStoryPageController.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryPageController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAElF,aAAK,qBAAqB,GAAG,KAAK,CAAC,sBAAsB,GAAG,KAAK,CAAC,UAAU,CAAC;AA2B7E,qBAAa,yBAA0B,SAAQ,oBAAoB,CACjE,iBAAiB,EACjB,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CACnD;IACC,OAAO,CAAC,gBAAgB,CAA+B;IAEjD,UAAU,CACd,WAAW,EAAE,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAC/D,KAAK,EAAE,MAAM,GAAG,SAAS;IAyBrB,aAAa,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAU/F"}
@@ -0,0 +1,16 @@
1
+ import { QueryStreamController } from '~/core/liveCollection/QueryStreamController';
2
+ import { GlobalStoryPageController } from './GlobalStoryPageController';
3
+ export declare class GlobalStoryQueryStreamController extends QueryStreamController<Amity.GlobalStoryFeedPayload, Amity.LiveCollectionParams<Amity.StoryGlobalQuery>> {
4
+ private notifyChange;
5
+ private preparePayload;
6
+ private paginationController;
7
+ constructor(query: Amity.LiveCollectionParams<Amity.StoryGlobalQuery>, cacheKey: string[], notifyChange: (params: Amity.LiveCollectionNotifyParams) => void, paginationController: GlobalStoryPageController);
8
+ saveToMainDB(response: Amity.GlobalStoryFeedPayload): void;
9
+ appendToQueryStream(response: Amity.GlobalStoryFeedPayload, direction: Amity.LiveCollectionPageDirection, refresh?: boolean): void;
10
+ reactor(actionType: Amity.StoryActionType): (payload: Amity.InternalStory[]) => void;
11
+ subscribeRTE(createSubscriber: {
12
+ fn: (reactor: Amity.Listener<Amity.InternalStory[]>) => Amity.Unsubscriber;
13
+ action: Amity.StoryActionType;
14
+ }[]): Amity.Unsubscriber[];
15
+ }
16
+ //# sourceMappingURL=GlobalStoryQueryStreamController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalStoryQueryStreamController.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getGlobalStoryTargets/GlobalStoryQueryStreamController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAIpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAYxE,qBAAa,gCAAiC,SAAQ,qBAAqB,CACzE,KAAK,CAAC,sBAAsB,EAC5B,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CACnD;IACC,OAAO,CAAC,YAAY,CAAqD;IAEzE,OAAO,CAAC,cAAc,CAA2E;IAEjG,OAAO,CAAC,oBAAoB,CAA4B;gBAGtD,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,EACzD,QAAQ,EAAE,MAAM,EAAE,EAClB,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,0BAA0B,KAAK,IAAI,EAChE,oBAAoB,EAAE,yBAAyB;IAUjD,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,sBAAsB;IAYnD,mBAAmB,CACjB,QAAQ,EAAE,KAAK,CAAC,sBAAsB,EACtC,SAAS,EAAE,KAAK,CAAC,2BAA2B,EAC5C,OAAO,UAAQ;IAcjB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,aACtB,MAAM,aAAa,EAAE;IAexC,YAAY,CACV,gBAAgB,EAAE;QAChB,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;QAC3E,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC;KAC/B,EAAE;CAIN"}
@@ -0,0 +1,2 @@
1
+ export declare const getGlobalStoryTargets: (params: Amity.LiveCollectionParams<Amity.StoryGlobalQuery>, callback: Amity.LiveCollectionCallback<Amity.StoryTarget>, config?: Amity.LiveCollectionConfig) => () => void;
2
+ //# sourceMappingURL=getGlobalStoryTargets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGlobalStoryTargets.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getGlobalStoryTargets/getGlobalStoryTargets.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,WACxB,MAAM,oBAAoB,CAAC,MAAM,gBAAgB,CAAC,YAChD,MAAM,sBAAsB,CAAC,MAAM,WAAW,CAAC,WAChD,MAAM,oBAAoB,eAuBpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './getGlobalStoryTargets';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getGlobalStoryTargets/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"StoryPaginationNoPageController.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAC;AAE9F,qBAAa,+BAAgC,SAAQ,0BAA0B,CAC7E,OAAO,EACP,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAC3C;IACO,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,SAAS,CAAC;CASzE"}
1
+ {"version":3,"file":"StoryPaginationNoPageController.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAC;AAE9F,qBAAa,+BAAgC,SAAQ,0BAA0B,CAC7E,OAAO,EACP,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAC3C;IACO,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,SAAS,CAAC;CASzE"}
@@ -3,4 +3,5 @@ export * from './getStoryByStoryId';
3
3
  export * from './getTargetById';
4
4
  export * from './getTargetsByTargetIds';
5
5
  export * from './getStoriesByTargetIds';
6
+ export * from './getGlobalStoryTargets';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storyRepository/observers/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storyRepository/observers/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,23 @@
1
+ export declare class StoryComputedValue {
2
+ private readonly _targetId;
3
+ private readonly _lastStoryExpiresAt?;
4
+ private readonly _lastStorySeenExpiresAt?;
5
+ private cacheStoryExpireTime?;
6
+ private cacheStoreSeenTime?;
7
+ private _syncingStoriesCount;
8
+ private _syncedStoriesCount;
9
+ private _errorStoriesCount;
10
+ constructor(targetId: string, lastStoryExpiresAt?: Amity.timestamp, lastStorySeenExpiresAt?: Amity.timestamp);
11
+ get lastStoryExpiresAt(): number;
12
+ get lastStorySeenExpiresAt(): number;
13
+ get localLastStoryExpires(): number;
14
+ get localLastStorySeenExpiresAt(): number;
15
+ get isContainUnSyncedStory(): boolean;
16
+ getLocalLastSortingDate(): number;
17
+ getHasUnseenFlag(): boolean;
18
+ getTotalStoryByStatus(): void;
19
+ get syncedStoriesCount(): number;
20
+ get syncingStoriesCount(): number;
21
+ get failedStoriesCount(): number;
22
+ }
23
+ //# sourceMappingURL=StoryComputedValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoryComputedValue.d.ts","sourceRoot":"","sources":["../../../src/storyRepository/utils/StoryComputedValue.ts"],"names":[],"mappings":"AAGA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAkB;IAEvD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAkB;IAE3D,OAAO,CAAC,oBAAoB,CAAC,CAAgC;IAE7D,OAAO,CAAC,kBAAkB,CAAC,CAAgC;IAE3D,OAAO,CAAC,oBAAoB,CAAK;IAEjC,OAAO,CAAC,mBAAmB,CAAK;IAEhC,OAAO,CAAC,kBAAkB,CAAK;gBAG7B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,CAAC,EAAE,KAAK,CAAC,SAAS,EACpC,sBAAsB,CAAC,EAAE,KAAK,CAAC,SAAS;IAqB1C,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,sBAAsB,IAAI,MAAM,CAEnC;IAED,IAAI,qBAAqB,IAAI,MAAM,CAIlC;IAED,IAAI,2BAA2B,IAAI,MAAM,CAExC;IAED,IAAI,sBAAsB,IAAI,OAAO,CASpC;IAED,uBAAuB,IAAI,MAAM;IAQjC,gBAAgB,IAAI,OAAO;IAiB3B,qBAAqB,IAAI,IAAI;IAkC7B,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"storyLinkedObject.d.ts","sourceRoot":"","sources":["../../../src/utils/linkedObject/storyLinkedObject.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,iBAAiB,UAAW,MAAM,aAAa,KAAG,MAAM,KAwGpE,CAAC"}
1
+ {"version":3,"file":"storyLinkedObject.d.ts","sourceRoot":"","sources":["../../../src/utils/linkedObject/storyLinkedObject.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,iBAAiB,UAAW,MAAM,aAAa,KAAG,MAAM,KAyGpE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"storyTargetLinkedObject.d.ts","sourceRoot":"","sources":["../../../src/utils/linkedObject/storyTargetLinkedObject.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,gBAAiB,MAAM,cAAc,KAAG,MAAM,WAUjF,CAAC"}
1
+ {"version":3,"file":"storyTargetLinkedObject.d.ts","sourceRoot":"","sources":["../../../src/utils/linkedObject/storyTargetLinkedObject.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,gBAAiB,MAAM,cAAc,KAAG,MAAM,WAiCjF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/ts-sdk",
3
- "version": "6.17.3-beac0a2.0",
3
+ "version": "6.17.3-e382dbe.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",
@@ -18,6 +18,7 @@ declare global {
18
18
  poll: Amity.PollPayload;
19
19
  stream: Amity.StreamPayload;
20
20
  story: Amity.StoryPayload;
21
+ globalStoryFeed: Amity.GlobalStoryFeedPayload;
21
22
  reaction: Amity.ReactionPayload;
22
23
  };
23
24
 
@@ -315,6 +316,9 @@ declare global {
315
316
  storyTargets: Amity.RawStoryTarget[];
316
317
  };
317
318
 
319
+ type GlobalStoryFeedPayload = Omit<Amity.StoryBasePayload, 'comments'> &
320
+ Amity.StoryTargetPayload;
321
+
318
322
  // Original Payload form BE
319
323
  type StoryPayload = {
320
324
  stories: Amity.RawStory[];
@@ -41,6 +41,8 @@ declare global {
41
41
  emitter: Emitter<Amity.Events>;
42
42
 
43
43
  hasPermission: (permission: string) => Amity.PermissionChecker;
44
+ validateUrls: (urls: string[]) => Promise<boolean>;
45
+ validateTexts: (texts: string[]) => Promise<boolean>;
44
46
 
45
47
  sessionState: Amity.SessionStates;
46
48
  sessionHandler?: Amity.SessionHandler;
@@ -1,7 +1,5 @@
1
1
  import { VideoResolution } from './file';
2
2
 
3
- export {};
4
-
5
3
  declare global {
6
4
  namespace Amity {
7
5
  type CommunityStorySettings = {
@@ -33,11 +31,22 @@ declare global {
33
31
  Video = 'video',
34
32
  }
35
33
 
34
+ const enum StorySeenQuery {
35
+ SEEN = 'seen',
36
+ UNSEEN = 'unseen',
37
+ ALL = 'all',
38
+ SMART = 'smart',
39
+ }
40
+
36
41
  type StorySortOption = {
37
42
  sortBy?: StorySortBy;
38
43
  orderBy?: 'asc' | 'desc';
39
44
  };
40
45
 
46
+ type StoryGlobalQuery = {
47
+ seenState: Amity.StorySeenQuery;
48
+ };
49
+
41
50
  type RawStoryTarget = {
42
51
  lastStoryExpiresAt?: Amity.timestamp;
43
52
  lastStorySeenExpiresAt?: Amity.timestamp;
@@ -45,6 +54,7 @@ declare global {
45
54
  targetType: string;
46
55
  targetPublicId: string;
47
56
  targetUpdatedAt: Amity.timestamp;
57
+ localFilter?: Amity.StorySeenQuery;
48
58
  };
49
59
 
50
60
  type StoryTargetQueryParam = Pick<Amity.RawStoryTarget, 'targetId' | 'targetType'>;
@@ -65,6 +75,16 @@ declare global {
65
75
  type StoryTarget = Pick<Amity.RawStoryTarget, 'targetId' | 'targetType'> & {
66
76
  updatedAt: Amity.timestamp;
67
77
  hasUnseen: boolean;
78
+ lastStoryExpiresAt?: Amity.timestamp;
79
+
80
+ localLastExpires: number;
81
+ localLastSeen: number;
82
+ localSortingDate: number;
83
+ localFilter?: Amity.StorySeenQuery;
84
+
85
+ syncedStoriesCount: number;
86
+ syncingStoriesCount: number;
87
+ failedStoriesCount: number;
68
88
  };
69
89
 
70
90
  type StoryItemData<T extends StoryItemType> = T extends 'hyperlink'
@@ -278,7 +278,30 @@ export class ChannelLiveCollectionController extends LiveCollectionController<
278
278
  { fn: onChannelUpdated, action: 'onUpdate' },
279
279
  { fn: onChannelMuted, action: 'onMute' },
280
280
  { fn: onChannelJoined, action: 'onJoin' },
281
- { fn: onChannelLeft, action: 'onLeft' },
281
+ {
282
+ fn: (reactor: Amity.Listener<Amity.InternalChannel>) => {
283
+ const callback = (
284
+ channel: Amity.InternalChannel,
285
+ member: Amity.Membership<'channel'>,
286
+ ) => {
287
+ const { userId } = getActiveClient();
288
+ // if query for channel member and user is not a member, remove channelId from curren collection
289
+ if (this.query.membership === 'member' && userId === member.userId) {
290
+ const collection = pullFromCache<Amity.ChannelLiveCollectionCache>(
291
+ this.cacheKey,
292
+ )?.data;
293
+
294
+ pushToCache(this.cacheKey, {
295
+ ...collection,
296
+ data: collection?.data.filter(c => c !== channel.channelId) ?? [],
297
+ });
298
+ }
299
+ return reactor(channel);
300
+ };
301
+ return onChannelLeft(callback);
302
+ },
303
+ action: 'onLeft',
304
+ },
282
305
  { fn: onChannelMemberAdded, action: 'onMemberAdded' },
283
306
  { fn: onChannelMemberRemoved, action: 'onMemberRemoved' },
284
307
  {
@@ -69,7 +69,10 @@ export class ChannelQueryStreamController extends QueryStreamController<
69
69
  const collection = pullFromCache<Amity.ChannelLiveCollectionCache>(this.cacheKey)?.data;
70
70
  if (!collection) return;
71
71
 
72
- if (this.paginationController instanceof ChannelPaginationController) {
72
+ if (
73
+ this.paginationController instanceof ChannelPaginationController &&
74
+ action === 'onCreate'
75
+ ) {
73
76
  collection.data = [...new Set([payload.channelId, ...collection.data])];
74
77
  pushToCache(this.cacheKey, collection);
75
78
  }
@@ -14,6 +14,8 @@ import { createEventEmitter } from '~/core/events';
14
14
  import { getMessagePreviewSetting } from '~/client/utils/messagePreviewEngine';
15
15
  import { getSocialSettings } from '~/client/api/getSocialSettings';
16
16
  import { hasPermission } from '~/client/utils/hasPermission';
17
+ import { validateUrls } from './validateUrls';
18
+ import { validateTexts } from './validateTexts';
17
19
  import { getActiveClient, setActiveClient } from './activeClient';
18
20
  import { getFeedSettings } from './getFeedSettings';
19
21
 
@@ -101,6 +103,8 @@ export const createClient = (
101
103
  sessionHandler,
102
104
 
103
105
  hasPermission,
106
+ validateUrls,
107
+ validateTexts,
104
108
  getFeedSettings,
105
109
  getSocialSettings,
106
110
  getMessagePreviewSetting,
@@ -0,0 +1,23 @@
1
+ import { getActiveClient } from './activeClient';
2
+
3
+ /**
4
+ * Validate a list of texts
5
+ * @param texts array of strings to validate (max 10 items)
6
+ *
7
+ * @category Client API
8
+ */
9
+ export const validateTexts = async (texts: string[]): Promise<boolean> => {
10
+ const client = getActiveClient();
11
+ client.log('channel/markerSync');
12
+
13
+ if (texts.length === 0) return false;
14
+
15
+ const { data: payload } = await client.http.post<{ success: boolean }>(
16
+ '/api/v3/blocklists/verify',
17
+ {
18
+ data: texts,
19
+ },
20
+ );
21
+
22
+ return payload.success;
23
+ };
@@ -0,0 +1,23 @@
1
+ import { getActiveClient } from './activeClient';
2
+
3
+ /**
4
+ * Validate a list of urls
5
+ * @param urls array of strings to validate (max 10 items)
6
+ *
7
+ * @category Client API
8
+ */
9
+ export const validateUrls = async (urls: string[]): Promise<boolean> => {
10
+ const client = getActiveClient();
11
+ client.log('channel/markerSync');
12
+
13
+ if (urls.length === 0) return false;
14
+
15
+ const { data: payload } = await client.http.post<{ success: boolean }>(
16
+ '/api/v3/allowlists/verify',
17
+ {
18
+ data: urls,
19
+ },
20
+ );
21
+
22
+ return payload.success;
23
+ };
@@ -45,6 +45,14 @@ export const sortByFirstCreated: SortingFunc<{ createdAt: Date | number | string
45
45
  { createdAt: b },
46
46
  ) => new Date(a).valueOf() - new Date(b).valueOf();
47
47
 
48
+ /**
49
+ * Sorting a story-collection by its localSortingDate
50
+ */
51
+ export const sortByLocalSortingDate: SortingFunc<{
52
+ localSortingDate: Date | number | string;
53
+ }> = ({ localSortingDate: a }, { localSortingDate: b }) =>
54
+ new Date(b).getTime() - new Date(a).getTime();
55
+
48
56
  /**
49
57
  * Sorting a collection by its newest items
50
58
  */
@@ -50,8 +50,15 @@ export const createImageStory = async (
50
50
  metadata,
51
51
  };
52
52
 
53
+ const date = new Date();
53
54
  pushToCache([STORY_KEY_CACHE.SYNC_STATE, targetId], Amity.SyncState.Syncing);
54
55
 
56
+ // Update local story expires time
57
+ pushToCache(
58
+ [STORY_KEY_CACHE.EXPIRE, targetId],
59
+ new Date(date.setFullYear(date.getFullYear() + 1)),
60
+ );
61
+
55
62
  // Fire optimistic event
56
63
  createOptimisticEvent({ payload, formData }, optimisticData => {
57
64
  fireEvent('local.story.created', optimisticData);
@@ -47,8 +47,15 @@ export const createVideoStory = async (
47
47
  metadata,
48
48
  };
49
49
 
50
+ const date = new Date();
50
51
  pushToCache([STORY_KEY_CACHE.SYNC_STATE, targetId], Amity.SyncState.Syncing);
51
52
 
53
+ // Update local story expires time
54
+ pushToCache(
55
+ [STORY_KEY_CACHE.EXPIRE, targetId],
56
+ new Date(date.setFullYear(date.getFullYear() + 1)),
57
+ );
58
+
52
59
  // Fire optimistic event
53
60
  createOptimisticEvent({ payload, formData, isVideo: true }, optimisticData => {
54
61
  fireEvent('local.story.created', optimisticData);
@@ -1,7 +1,9 @@
1
1
  export const enum STORY_KEY_CACHE {
2
2
  STORY = 'story',
3
+ STORY_TARGET = 'storyTarget',
3
4
  SYNC_STATE = 'story-sync-state',
4
5
  STORY_TARGET_IDS = 'story-target-ids',
6
+ STORY_GLOBAL_FEED = 'story-global-feed',
5
7
  IS_SEEN = 'story-seen',
6
8
  LAST_SEEN = 'story-last-seen',
7
9
  EXPIRE = 'story-expire',
@@ -0,0 +1,153 @@
1
+ import hash from 'object-hash';
2
+ import { LiveCollectionController } from '~/core/liveCollection/LiveCollectionController';
3
+ import { pullFromCache, pushToCache } from '~/cache/api';
4
+ import { LinkedObject } from '~/utils/linkedObject';
5
+ import { STORY_KEY_CACHE } from '~/storyRepository/constants';
6
+ import { sortByLocalSortingDate } from '~/core/query';
7
+ import { onStoryCreated, onStoryCreatedLocal } from '~/storyRepository/events/onStoryCreated';
8
+ import { onStoryUpdated, onStoryUpdatedLocal } from '~/storyRepository/events/onStoryUpdated';
9
+ import { onStoryDeleted, onStoryDeletedLocal } from '~/storyRepository/events/onStoryDeleted';
10
+ import { onStoryError } from '~/storyRepository/events/onStoryError';
11
+ import { GlobalStoryQueryStreamController } from './GlobalStoryQueryStreamController';
12
+ import { GlobalStoryPageController } from './GlobalStoryPageController';
13
+
14
+ type StoryTargetBySeenState = {
15
+ seen: Amity.StoryTarget[];
16
+ unseen: Amity.StoryTarget[];
17
+ unknown: Amity.StoryTarget[];
18
+ };
19
+
20
+ export class GlobalStoryLiveCollectionController extends LiveCollectionController<
21
+ 'globalStoryFeed',
22
+ Amity.StoryGlobalQuery,
23
+ Amity.StoryTarget,
24
+ GlobalStoryPageController
25
+ > {
26
+ private queryStreamController: GlobalStoryQueryStreamController;
27
+
28
+ private query: Amity.StoryGlobalQuery;
29
+
30
+ constructor(
31
+ query: Amity.StoryGlobalQuery,
32
+ callback: Amity.LiveCollectionCallback<Amity.StoryTarget>,
33
+ ) {
34
+ const queryStreamId = hash(query);
35
+ const cacheKey = [STORY_KEY_CACHE.STORY_GLOBAL_FEED, 'collection', queryStreamId];
36
+ const paginationController = new GlobalStoryPageController(query);
37
+
38
+ super(paginationController, queryStreamId, cacheKey, callback);
39
+
40
+ this.query = query;
41
+
42
+ this.queryStreamController = new GlobalStoryQueryStreamController(
43
+ this.query,
44
+ this.cacheKey,
45
+ this.notifyChange.bind(this),
46
+ paginationController,
47
+ );
48
+
49
+ this.paginationController = paginationController;
50
+ this.callback = callback.bind(this);
51
+ this.loadPage(true);
52
+ }
53
+
54
+ protected setup() {
55
+ const collection = pullFromCache<Amity.StoryTargetLiveCollectionCache>(this.cacheKey)?.data;
56
+ if (!collection) {
57
+ pushToCache(this.cacheKey, {
58
+ data: [],
59
+ params: {},
60
+ });
61
+ }
62
+ }
63
+
64
+ protected persistModel(response: Amity.GlobalStoryFeedPayload) {
65
+ this.queryStreamController.saveToMainDB(response);
66
+ }
67
+
68
+ protected persistQueryStream({
69
+ response,
70
+ direction,
71
+ refresh,
72
+ }: Amity.LiveCollectionPersistQueryStreamParams<'globalStoryFeed'>) {
73
+ this.queryStreamController.appendToQueryStream(response, direction, refresh);
74
+ }
75
+
76
+ notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams) {
77
+ const collection = pullFromCache<Amity.StoryTargetLiveCollectionCache>(this.cacheKey)?.data;
78
+ if (!collection) return;
79
+
80
+ let data = collection.data
81
+ .map(
82
+ targetId =>
83
+ pullFromCache<Amity.RawStoryTarget>([STORY_KEY_CACHE.STORY_TARGET, 'get', targetId])!,
84
+ )
85
+ .filter(Boolean)
86
+ .map(storyTarget => LinkedObject.storyTarget(storyTarget.data));
87
+
88
+ if (!this.shouldNotify(data) && origin === 'event') return;
89
+
90
+ data = this.applyFilter(data);
91
+
92
+ this.callback({
93
+ onNextPage: () => this.loadPage(false, Amity.LiveCollectionPageDirection.NEXT),
94
+ data,
95
+ hasNextPage: !!this.paginationController.getNextToken(),
96
+ loading,
97
+ error,
98
+ });
99
+ }
100
+
101
+ private applyFilter(data: Amity.StoryTarget[]) {
102
+ if (this.query.seenState !== Amity.StorySeenQuery.SMART) {
103
+ return data
104
+ .filter(({ hasUnseen }) => {
105
+ if (this.query.seenState === Amity.StorySeenQuery.ALL) return true;
106
+ if (this.query.seenState === Amity.StorySeenQuery.SEEN && !hasUnseen) return true;
107
+ return this.query.seenState === Amity.StorySeenQuery.UNSEEN && hasUnseen;
108
+ })
109
+ .sort(sortByLocalSortingDate);
110
+ }
111
+
112
+ // Smart Filter - Apply local sorting on each list of data
113
+ const result = data.reduce<StoryTargetBySeenState>(
114
+ (acc, storyTarget) => {
115
+ if (storyTarget.localFilter === Amity.StorySeenQuery.UNSEEN) {
116
+ acc.unseen.push(storyTarget);
117
+ } else if (storyTarget.localFilter === Amity.StorySeenQuery.SEEN) {
118
+ acc.seen.push(storyTarget);
119
+ } else {
120
+ acc.unknown.push(storyTarget);
121
+ }
122
+ return acc;
123
+ },
124
+ { unseen: [], seen: [], unknown: [] },
125
+ );
126
+
127
+ const sortedUnknown = result.unknown.sort(sortByLocalSortingDate) || [];
128
+ const sortedUnseen = result.unseen.sort(sortByLocalSortingDate) || [];
129
+ const sortedSeen = result.seen.sort(sortByLocalSortingDate) || [];
130
+
131
+ // Merge all status and remove internal fields
132
+ return sortedUnknown
133
+ .concat(sortedUnseen, sortedSeen)
134
+ .map(
135
+ ({ localFilter, localLastExpires, localLastSeen, localSortingDate, ...rest }) =>
136
+ rest as Amity.StoryTarget,
137
+ );
138
+ }
139
+
140
+ startSubscription() {
141
+ return this.queryStreamController.subscribeRTE([
142
+ { fn: onStoryCreated, action: Amity.StoryActionType.OnCreate },
143
+ { fn: onStoryUpdated, action: Amity.StoryActionType.OnUpdate },
144
+ { fn: onStoryDeleted, action: Amity.StoryActionType.OnDelete },
145
+
146
+ { fn: onStoryCreatedLocal, action: Amity.StoryActionType.OnCreate },
147
+ { fn: onStoryUpdatedLocal, action: Amity.StoryActionType.OnUpdate },
148
+ { fn: onStoryDeletedLocal, action: Amity.StoryActionType.OnDelete },
149
+
150
+ { fn: onStoryError, action: Amity.StoryActionType.OnError },
151
+ ]);
152
+ }
153
+ }