@amityco/ts-sdk 6.14.2-a07f15b.0 → 6.14.2-e0fc421.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 (121) hide show
  1. package/dist/@types/core/events.d.ts +5 -1
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/model.d.ts +2 -0
  4. package/dist/@types/core/model.d.ts.map +1 -1
  5. package/dist/@types/core/payload.d.ts +14 -0
  6. package/dist/@types/core/payload.d.ts.map +1 -1
  7. package/dist/@types/domains/analytics.d.ts +4 -1
  8. package/dist/@types/domains/analytics.d.ts.map +1 -1
  9. package/dist/@types/domains/comment.d.ts +1 -1
  10. package/dist/@types/domains/comment.d.ts.map +1 -1
  11. package/dist/@types/domains/community.d.ts +4 -1
  12. package/dist/@types/domains/community.d.ts.map +1 -1
  13. package/dist/@types/domains/partials.d.ts +8 -0
  14. package/dist/@types/domains/partials.d.ts.map +1 -1
  15. package/dist/@types/domains/story.d.ts +112 -0
  16. package/dist/@types/domains/story.d.ts.map +1 -0
  17. package/dist/@types/index.d.ts +1 -0
  18. package/dist/@types/index.d.ts.map +1 -1
  19. package/dist/analytic/constant.d.ts +1 -0
  20. package/dist/analytic/constant.d.ts.map +1 -1
  21. package/dist/analytic/service/analytic/AnalyticsEngine.d.ts +1 -0
  22. package/dist/analytic/service/analytic/AnalyticsEngine.d.ts.map +1 -1
  23. package/dist/analytic/service/analytic/AnalyticsEventCapturer.d.ts +5 -0
  24. package/dist/analytic/service/analytic/AnalyticsEventCapturer.d.ts.map +1 -1
  25. package/dist/analytic/service/analytic/AnalyticsEventSyncer.d.ts +2 -0
  26. package/dist/analytic/service/analytic/AnalyticsEventSyncer.d.ts.map +1 -1
  27. package/dist/communityRepository/api/createCommunity.d.ts +1 -1
  28. package/dist/communityRepository/api/createCommunity.d.ts.map +1 -1
  29. package/dist/communityRepository/api/updateCommunity.d.ts +1 -1
  30. package/dist/communityRepository/api/updateCommunity.d.ts.map +1 -1
  31. package/dist/communityRepository/utils/payload.d.ts +2 -1
  32. package/dist/communityRepository/utils/payload.d.ts.map +1 -1
  33. package/dist/core/events.d.ts +3 -3
  34. package/dist/core/events.d.ts.map +1 -1
  35. package/dist/core/model/idResolvers.d.ts.map +1 -1
  36. package/dist/core/model/index.d.ts.map +1 -1
  37. package/dist/index.cjs.js +495 -76
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.esm.js +480 -62
  41. package/dist/index.umd.js +2 -2
  42. package/dist/storyRepository/api/createImageStory.d.ts +16 -0
  43. package/dist/storyRepository/api/createImageStory.d.ts.map +1 -0
  44. package/dist/storyRepository/api/createVideoStory.d.ts +15 -0
  45. package/dist/storyRepository/api/createVideoStory.d.ts.map +1 -0
  46. package/dist/storyRepository/api/hardDeleteStory.d.ts +2 -0
  47. package/dist/storyRepository/api/hardDeleteStory.d.ts.map +1 -0
  48. package/dist/storyRepository/api/index.d.ts +5 -0
  49. package/dist/storyRepository/api/index.d.ts.map +1 -0
  50. package/dist/storyRepository/api/softDeleteStory.d.ts +2 -0
  51. package/dist/storyRepository/api/softDeleteStory.d.ts.map +1 -0
  52. package/dist/storyRepository/events/onStoryCreated.d.ts +2 -0
  53. package/dist/storyRepository/events/onStoryCreated.d.ts.map +1 -0
  54. package/dist/storyRepository/events/onStoryDeleted.d.ts +2 -0
  55. package/dist/storyRepository/events/onStoryDeleted.d.ts.map +1 -0
  56. package/dist/storyRepository/index.d.ts +3 -0
  57. package/dist/storyRepository/index.d.ts.map +1 -0
  58. package/dist/storyRepository/internalApi/createStory.d.ts +2 -0
  59. package/dist/storyRepository/internalApi/createStory.d.ts.map +1 -0
  60. package/dist/storyRepository/internalApi/deleteStory.d.ts +2 -0
  61. package/dist/storyRepository/internalApi/deleteStory.d.ts.map +1 -0
  62. package/dist/storyRepository/internalApi/getActiveStoriesByTarget.d.ts +2 -0
  63. package/dist/storyRepository/internalApi/getActiveStoriesByTarget.d.ts.map +1 -0
  64. package/dist/storyRepository/observers/getActiveStoriesByTarget.d.ts +2 -0
  65. package/dist/storyRepository/observers/getActiveStoriesByTarget.d.ts.map +1 -0
  66. package/dist/storyRepository/observers/index.d.ts +2 -0
  67. package/dist/storyRepository/observers/index.d.ts.map +1 -0
  68. package/dist/storyRepository/utils/convertRawToStory.d.ts +11 -0
  69. package/dist/storyRepository/utils/convertRawToStory.d.ts.map +1 -0
  70. package/dist/storyRepository/utils/convertStoryPayloadToRaw.d.ts +2 -0
  71. package/dist/storyRepository/utils/convertStoryPayloadToRaw.d.ts.map +1 -0
  72. package/dist/storyRepository/utils/createOptimisticEvent.d.ts +6 -0
  73. package/dist/storyRepository/utils/createOptimisticEvent.d.ts.map +1 -0
  74. package/dist/storyRepository/utils/getStoryCache.d.ts +5 -0
  75. package/dist/storyRepository/utils/getStoryCache.d.ts.map +1 -0
  76. package/dist/utils/constants.d.ts +5 -0
  77. package/dist/utils/constants.d.ts.map +1 -1
  78. package/dist/utils/linkedObject/index.d.ts +1 -0
  79. package/dist/utils/linkedObject/index.d.ts.map +1 -1
  80. package/dist/utils/linkedObject/storyLinkedObject.d.ts +2 -0
  81. package/dist/utils/linkedObject/storyLinkedObject.d.ts.map +1 -0
  82. package/package.json +1 -1
  83. package/src/@types/core/events.ts +7 -1
  84. package/src/@types/core/model.ts +4 -0
  85. package/src/@types/core/payload.ts +19 -0
  86. package/src/@types/domains/analytics.ts +4 -1
  87. package/src/@types/domains/comment.ts +1 -1
  88. package/src/@types/domains/community.ts +7 -3
  89. package/src/@types/domains/partials.ts +10 -0
  90. package/src/@types/domains/story.ts +133 -0
  91. package/src/@types/index.ts +1 -3
  92. package/src/analytic/constant.ts +2 -1
  93. package/src/analytic/service/analytic/AnalyticsEngine.ts +9 -0
  94. package/src/analytic/service/analytic/AnalyticsEventCapturer.ts +58 -8
  95. package/src/analytic/service/analytic/AnalyticsEventSyncer.ts +34 -4
  96. package/src/communityRepository/api/createCommunity.ts +7 -6
  97. package/src/communityRepository/api/updateCommunity.ts +4 -3
  98. package/src/communityRepository/utils/payload.ts +7 -2
  99. package/src/core/model/idResolvers.ts +1 -0
  100. package/src/core/model/index.ts +1 -0
  101. package/src/index.ts +2 -0
  102. package/src/storyRepository/api/createImageStory.ts +78 -0
  103. package/src/storyRepository/api/createVideoStory.ts +79 -0
  104. package/src/storyRepository/api/hardDeleteStory.ts +6 -0
  105. package/src/storyRepository/api/index.ts +4 -0
  106. package/src/storyRepository/api/softDeleteStory.ts +6 -0
  107. package/src/storyRepository/events/onStoryCreated.ts +14 -0
  108. package/src/storyRepository/events/onStoryDeleted.ts +14 -0
  109. package/src/storyRepository/index.ts +2 -0
  110. package/src/storyRepository/internalApi/createStory.ts +22 -0
  111. package/src/storyRepository/internalApi/deleteStory.ts +35 -0
  112. package/src/storyRepository/internalApi/getActiveStoriesByTarget.ts +36 -0
  113. package/src/storyRepository/observers/getActiveStoriesByTarget.ts +104 -0
  114. package/src/storyRepository/observers/index.ts +1 -0
  115. package/src/storyRepository/utils/convertRawToStory.ts +13 -0
  116. package/src/storyRepository/utils/convertStoryPayloadToRaw.ts +43 -0
  117. package/src/storyRepository/utils/createOptimisticEvent.ts +63 -0
  118. package/src/storyRepository/utils/getStoryCache.ts +6 -0
  119. package/src/utils/constants.ts +5 -0
  120. package/src/utils/linkedObject/index.ts +2 -0
  121. package/src/utils/linkedObject/storyLinkedObject.ts +28 -0
package/dist/index.cjs.js CHANGED
@@ -25,6 +25,31 @@ var uuid__default = /*#__PURE__*/_interopDefaultLegacy(uuid$1);
25
25
  var hash__default = /*#__PURE__*/_interopDefaultLegacy(hash);
26
26
  var Hls__default = /*#__PURE__*/_interopDefaultLegacy(Hls);
27
27
 
28
+ const FileType = Object.freeze({
29
+ FILE: 'file',
30
+ IMAGE: 'image',
31
+ VIDEO: 'video',
32
+ });
33
+ const VideoResolution = Object.freeze({
34
+ '1080P': '1080p',
35
+ '720P': '720p',
36
+ '480P': '480p',
37
+ '360P': '360p',
38
+ ORIGINAL: 'original',
39
+ });
40
+ const VideoTranscodingStatus = Object.freeze({
41
+ UPLOADED: 'uploaded',
42
+ TRANSCODING: 'transcoding',
43
+ TRANSCODED: 'transcoded',
44
+ TRANSCODE_FAILED: 'transcodeFailed',
45
+ });
46
+ const VideoSize = Object.freeze({
47
+ LOW: 'low',
48
+ MEDIUM: 'medium',
49
+ HIGH: 'high',
50
+ ORIGINAL: 'original',
51
+ });
52
+
28
53
  const CommunityPostSettings = Object.freeze({
29
54
  ONLY_ADMIN_CAN_POST: 'ONLY_ADMIN_CAN_POST',
30
55
  ADMIN_REVIEW_POST_REQUIRED: 'ADMIN_REVIEW_POST_REQUIRED',
@@ -54,31 +79,6 @@ const ContentFeedType = Object.freeze({
54
79
  MESSAGE: 'message',
55
80
  });
56
81
 
57
- const FileType = Object.freeze({
58
- FILE: 'file',
59
- IMAGE: 'image',
60
- VIDEO: 'video',
61
- });
62
- const VideoResolution = Object.freeze({
63
- '1080P': '1080p',
64
- '720P': '720p',
65
- '480P': '480p',
66
- '360P': '360p',
67
- ORIGINAL: 'original',
68
- });
69
- const VideoTranscodingStatus = Object.freeze({
70
- UPLOADED: 'uploaded',
71
- TRANSCODING: 'transcoding',
72
- TRANSCODED: 'transcoded',
73
- TRANSCODE_FAILED: 'transcodeFailed',
74
- });
75
- const VideoSize = Object.freeze({
76
- LOW: 'low',
77
- MEDIUM: 'medium',
78
- HIGH: 'high',
79
- ORIGINAL: 'original',
80
- });
81
-
82
82
  const MessageContentType = Object.freeze({
83
83
  TEXT: 'text',
84
84
  IMAGE: 'image',
@@ -117,6 +117,9 @@ const UNSYNCED_OBJECT_CACHED_AT_MESSAGE = 'Observing unsynced object is not supp
117
117
  const UNSYNCED_OBJECT_CACHED_AT_VALUE = -5;
118
118
  const SECOND$1 = 1000;
119
119
  const MINUTE = 60 * SECOND$1;
120
+ const HOUR = 60 * MINUTE;
121
+ const DAY = 24 * HOUR;
122
+ const YEAR = 365 * DAY;
120
123
  const ACCESS_TOKEN_WATCHER_INTERVAL = 10 * MINUTE;
121
124
 
122
125
  // cache constants
@@ -529,6 +532,7 @@ const idResolvers = {
529
532
  followInfo: ({ userId }) => userId,
530
533
  followCount: ({ userId }) => userId,
531
534
  feed: ({ targetId, feedId }) => `${targetId}#${feedId}`,
535
+ story: ({ referenceId }) => referenceId,
532
536
  };
533
537
  /**
534
538
  * Retrieve the id resolver matching a domain name
@@ -546,6 +550,7 @@ const PAYLOAD2MODEL = {
546
550
  users: 'user',
547
551
  files: 'file',
548
552
  roles: 'role',
553
+ stories: 'story',
549
554
  channels: 'channel',
550
555
  messageFeeds: 'subChannel',
551
556
  channelUsers: 'channelUsers',
@@ -6268,7 +6273,8 @@ const createUserEventSubscriber = (event, callback) => {
6268
6273
  */
6269
6274
  const onUserDeleted = (callback) => createUserEventSubscriber('user.deleted', callback);
6270
6275
 
6271
- const ANALYTIC_CACHE_KEY = ['analytic', 'post'];
6276
+ const ANALYTIC_CACHE_KEY = ['analytic', 'normal-priority'];
6277
+ const HIGH_PRIORITY_ANALYTIC_CACHE_KEY = ['analytic', 'high-priority'];
6272
6278
 
6273
6279
  const syncEvent = async (events) => {
6274
6280
  const client = getActiveClient();
@@ -6280,12 +6286,16 @@ const syncEvent = async (events) => {
6280
6286
  class AnalyticsEventSyncer {
6281
6287
  constructor() {
6282
6288
  this._timer = undefined;
6289
+ this._high_priority_timer = undefined;
6283
6290
  }
6284
6291
  start() {
6285
6292
  this.syncCapturedEvent();
6286
6293
  this._timer = setInterval(() => {
6287
6294
  this.syncCapturedEvent();
6288
6295
  }, 1 * MINUTE);
6296
+ this._high_priority_timer = setInterval(() => {
6297
+ this.syncHighPriorityCapturedEvent();
6298
+ }, 10 * SECOND$1);
6289
6299
  }
6290
6300
  stop() {
6291
6301
  if (!this._timer)
@@ -6295,10 +6305,10 @@ class AnalyticsEventSyncer {
6295
6305
  }
6296
6306
  async syncCapturedEvent() {
6297
6307
  try {
6298
- // Must query only objects that has same userId with current logged-in user.
6308
+ // Must query only objects that have same userId with current logged-in user.
6299
6309
  // Query captured event with maximum of 1000
6300
6310
  // Order by latest first
6301
- // e.g. If there is 2000 events we will query 1000-2000 first
6311
+ // e.g., If there are 2000 events we will query 1000-2000 first
6302
6312
  const cache = pullFromCache(ANALYTIC_CACHE_KEY);
6303
6313
  if (!(cache === null || cache === void 0 ? void 0 : cache.data))
6304
6314
  return;
@@ -6314,6 +6324,27 @@ class AnalyticsEventSyncer {
6314
6324
  dropFromCache(ANALYTIC_CACHE_KEY);
6315
6325
  }
6316
6326
  }
6327
+ async syncHighPriorityCapturedEvent() {
6328
+ try {
6329
+ // Must query only objects that have same userId with current logged-in user.
6330
+ // Query captured event with maximum of 1000
6331
+ // Order by latest first
6332
+ // e.g., If there are 2000 events we will query 1000-2000 first
6333
+ const cache = pullFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
6334
+ if (!(cache === null || cache === void 0 ? void 0 : cache.data))
6335
+ return;
6336
+ if (cache.data.event.length === 0)
6337
+ return;
6338
+ const capturedEvents = cache.data.event;
6339
+ await syncEvent(capturedEvents);
6340
+ dropFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
6341
+ }
6342
+ catch (error) {
6343
+ // stop and destroy all events
6344
+ this.stop();
6345
+ dropFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
6346
+ }
6347
+ }
6317
6348
  }
6318
6349
 
6319
6350
  class AnalyticsEventCapturer {
@@ -6321,17 +6352,23 @@ class AnalyticsEventCapturer {
6321
6352
  this._expireTime = 5 * MINUTE;
6322
6353
  this._poolLimit = 1000;
6323
6354
  this._recentViewed = {};
6355
+ this._recentHighPriorityViewed = {};
6324
6356
  }
6325
- markPostAsViewed(postId) {
6357
+ isAbleToEnqueue(itemId, expireTime, isHighPriority = false) {
6326
6358
  var _a;
6327
6359
  const now = new Date();
6328
- getActiveClient();
6329
- const recentViewedPostDate = (_a = this._recentViewed[postId]) !== null && _a !== void 0 ? _a : new Date(-86400000);
6360
+ const recentViewedPostDate = (_a = (isHighPriority ? this._recentViewed[itemId] : this._recentHighPriorityViewed[itemId])) !== null && _a !== void 0 ? _a : new Date(-86400000);
6330
6361
  const timeDiff = now.getTime() - recentViewedPostDate.getTime();
6331
- if (timeDiff < this._expireTime) {
6362
+ if (timeDiff < expireTime) {
6332
6363
  // just recently view this post, ignore the event.
6333
- return;
6364
+ return false;
6334
6365
  }
6366
+ return true;
6367
+ }
6368
+ markPostAsViewed(postId) {
6369
+ if (!this.isAbleToEnqueue(postId, this._expireTime))
6370
+ return;
6371
+ const now = new Date();
6335
6372
  const currentData = { event: [] };
6336
6373
  const cache = pullFromCache(ANALYTIC_CACHE_KEY);
6337
6374
  if (cache === null || cache === void 0 ? void 0 : cache.data) {
@@ -6344,13 +6381,39 @@ class AnalyticsEventCapturer {
6344
6381
  }
6345
6382
  currentData.event.push({
6346
6383
  contentId: postId,
6347
- contentType: 'post',
6384
+ contentType: "post" /* Amity.AnalyticEventContentType.Post */,
6348
6385
  activityType: 'view',
6349
6386
  timestamp: now.toISOString(),
6350
6387
  });
6351
6388
  upsertInCache(ANALYTIC_CACHE_KEY, currentData);
6352
6389
  this._recentViewed[postId] = now;
6353
6390
  }
6391
+ markStoryAsViewed(storyId, storyExpireAt) {
6392
+ if (!storyExpireAt)
6393
+ return;
6394
+ const now = new Date();
6395
+ const expireTime = new Date(storyExpireAt);
6396
+ if (this.isAbleToEnqueue(storyId, expireTime.getTime()))
6397
+ return;
6398
+ const currentData = { event: [] };
6399
+ const cache = pullFromCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY);
6400
+ if (cache === null || cache === void 0 ? void 0 : cache.data) {
6401
+ currentData.event = cache.data.event;
6402
+ }
6403
+ // If the pool is full (Max 1000 items), remove the oldest data
6404
+ if (currentData.event.length >= this._poolLimit) {
6405
+ // Remove oldest data
6406
+ currentData.event.shift();
6407
+ }
6408
+ currentData.event.push({
6409
+ contentId: storyId,
6410
+ contentType: "story" /* Amity.AnalyticEventContentType.Story */,
6411
+ activityType: 'view',
6412
+ timestamp: now.toISOString(),
6413
+ });
6414
+ upsertInCache(HIGH_PRIORITY_ANALYTIC_CACHE_KEY, currentData);
6415
+ this._recentHighPriorityViewed[storyId] = now;
6416
+ }
6354
6417
  }
6355
6418
 
6356
6419
  class AnalyticsEngine {
@@ -6366,6 +6429,13 @@ class AnalyticsEngine {
6366
6429
  this._eventCapturer.markPostAsViewed(postId);
6367
6430
  }
6368
6431
  }
6432
+ markStoryAsViewed(storyId, storyExpiresAt) {
6433
+ if (this._client.sessionState === "established" /* Amity.SessionStates.ESTABLISHED */ ||
6434
+ this._client.sessionState === "tokenExpired" /* Amity.SessionStates.TOKEN_EXPIRED */ // For case token_expired, we assume token is expired and gonna re-connect soon
6435
+ ) {
6436
+ this._eventCapturer.markStoryAsViewed(storyId, storyExpiresAt);
6437
+ }
6438
+ }
6369
6439
  established() {
6370
6440
  this._eventSyncer.start();
6371
6441
  }
@@ -8165,7 +8235,7 @@ setIntervalTask(async () => {
8165
8235
  await markerSyncTrigger();
8166
8236
  }, SYNC_TRIGGER_INTERVAL_TIME);
8167
8237
 
8168
- var index$j = /*#__PURE__*/Object.freeze({
8238
+ var index$k = /*#__PURE__*/Object.freeze({
8169
8239
  __proto__: null,
8170
8240
  getActiveClient: getActiveClient,
8171
8241
  getActiveUser: getActiveUser,
@@ -8335,6 +8405,30 @@ queryBlockedUsers.locally = (query = {}) => {
8335
8405
  : undefined;
8336
8406
  };
8337
8407
 
8408
+ const storyLinkedObject = (story) => {
8409
+ return Object.assign(Object.assign({}, story), { analytics: {
8410
+ markAsViewed: () => {
8411
+ if (!story.expiresAt)
8412
+ return;
8413
+ if (story.syncState !== 'synced')
8414
+ return;
8415
+ const analyticsEngineInstance = AnalyticsEngine$1.getInstance();
8416
+ analyticsEngineInstance.markStoryAsViewed(story.storyId, story.expiresAt);
8417
+ },
8418
+ }, get videoResolution() {
8419
+ var _a, _b;
8420
+ const cache = pullFromCache([
8421
+ 'file',
8422
+ 'get',
8423
+ (_b = (_a = story.data) === null || _a === void 0 ? void 0 : _a.videoFileId) === null || _b === void 0 ? void 0 : _b.original,
8424
+ ]);
8425
+ if (!cache)
8426
+ return undefined;
8427
+ const { data } = cache;
8428
+ return data.videoUrl;
8429
+ } });
8430
+ };
8431
+
8338
8432
  const categoryLinkedObject = (category) => {
8339
8433
  return Object.assign(Object.assign({}, category), { get avatar() {
8340
8434
  var _a;
@@ -8466,6 +8560,7 @@ const LinkedObject = {
8466
8560
  post: postLinkedObject,
8467
8561
  user: userLinkedObject,
8468
8562
  category: categoryLinkedObject,
8563
+ story: storyLinkedObject,
8469
8564
  };
8470
8565
 
8471
8566
  /* eslint-disable no-use-before-define */
@@ -9455,7 +9550,7 @@ const getMyFollowInfo = (callback) => {
9455
9550
  };
9456
9551
  /* end_public_function */
9457
9552
 
9458
- var index$i = /*#__PURE__*/Object.freeze({
9553
+ var index$j = /*#__PURE__*/Object.freeze({
9459
9554
  __proto__: null,
9460
9555
  blockUser: blockUser,
9461
9556
  unBlockUser: unBlockUser,
@@ -10267,9 +10362,9 @@ const getViewedUsers = (params, callback) => {
10267
10362
  };
10268
10363
  };
10269
10364
 
10270
- var index$h = /*#__PURE__*/Object.freeze({
10365
+ var index$i = /*#__PURE__*/Object.freeze({
10271
10366
  __proto__: null,
10272
- Relationship: index$i,
10367
+ Relationship: index$j,
10273
10368
  getUserByIds: getUserByIds,
10274
10369
  updateUser: updateUser,
10275
10370
  flagUser: flagUser,
@@ -10684,7 +10779,7 @@ const observeFile = (fileId, callback) => {
10684
10779
  };
10685
10780
  };
10686
10781
 
10687
- var index$g = /*#__PURE__*/Object.freeze({
10782
+ var index$h = /*#__PURE__*/Object.freeze({
10688
10783
  __proto__: null,
10689
10784
  getFile: getFile,
10690
10785
  uploadFile: uploadFile,
@@ -12034,7 +12129,7 @@ const getReactions = (params, callback, config) => {
12034
12129
  };
12035
12130
  /* end_public_function */
12036
12131
 
12037
- var index$f = /*#__PURE__*/Object.freeze({
12132
+ var index$g = /*#__PURE__*/Object.freeze({
12038
12133
  __proto__: null,
12039
12134
  addReaction: addReaction,
12040
12135
  removeReaction: removeReaction,
@@ -13585,7 +13680,7 @@ const searchMembers = (params, callback, config) => {
13585
13680
  };
13586
13681
  /* end_public_function */
13587
13682
 
13588
- var index$e = /*#__PURE__*/Object.freeze({
13683
+ var index$f = /*#__PURE__*/Object.freeze({
13589
13684
  __proto__: null,
13590
13685
  addMembers: addMembers$1,
13591
13686
  removeMembers: removeMembers$1,
@@ -13728,7 +13823,7 @@ const unbanMembers$1 = async (channelId, userIds) => {
13728
13823
  };
13729
13824
  /* end_public_function */
13730
13825
 
13731
- var index$d = /*#__PURE__*/Object.freeze({
13826
+ var index$e = /*#__PURE__*/Object.freeze({
13732
13827
  __proto__: null,
13733
13828
  addRole: addRole,
13734
13829
  removeRole: removeRole,
@@ -13736,10 +13831,10 @@ var index$d = /*#__PURE__*/Object.freeze({
13736
13831
  unbanMembers: unbanMembers$1
13737
13832
  });
13738
13833
 
13739
- var index$c = /*#__PURE__*/Object.freeze({
13834
+ var index$d = /*#__PURE__*/Object.freeze({
13740
13835
  __proto__: null,
13741
- Membership: index$e,
13742
- Moderation: index$d,
13836
+ Membership: index$f,
13837
+ Moderation: index$e,
13743
13838
  getChannelByIds: getChannelByIds,
13744
13839
  createChannel: createChannel,
13745
13840
  updateChannel: updateChannel,
@@ -14824,7 +14919,7 @@ const observeMessages = (subChannelId, callback) => {
14824
14919
  };
14825
14920
  };
14826
14921
 
14827
- var index$b = /*#__PURE__*/Object.freeze({
14922
+ var index$c = /*#__PURE__*/Object.freeze({
14828
14923
  __proto__: null,
14829
14924
  getMessageByIds: getMessages$1,
14830
14925
  createMessage: createMessage,
@@ -15436,7 +15531,7 @@ const getSubChannels = (params, callback, config) => {
15436
15531
  };
15437
15532
  /* end_public_function */
15438
15533
 
15439
- var index$a = /*#__PURE__*/Object.freeze({
15534
+ var index$b = /*#__PURE__*/Object.freeze({
15440
15535
  __proto__: null,
15441
15536
  getSubChannelByIds: getSubChannels$1,
15442
15537
  createSubChannel: createSubChannel,
@@ -15474,8 +15569,10 @@ const prepareCommunityPayload = (rawPayload) => {
15474
15569
  communityUsers });
15475
15570
  };
15476
15571
  const prepareCommunityRequest = (params) => {
15477
- const { postSetting = undefined } = params, restParam = __rest(params, ["postSetting"]);
15478
- return Object.assign(Object.assign({}, restParam), (postSetting ? CommunityPostSettingMaps[postSetting] : undefined));
15572
+ const { postSetting = undefined, storySetting } = params, restParam = __rest(params, ["postSetting", "storySetting"]);
15573
+ return Object.assign(Object.assign(Object.assign({}, restParam), (postSetting ? CommunityPostSettingMaps[postSetting] : undefined)), {
15574
+ // Convert story setting to the actual value. (Allow by default)
15575
+ allowCommentInStory: (storySetting === null || storySetting === void 0 ? void 0 : storySetting.enableComment) !== false });
15479
15576
  };
15480
15577
 
15481
15578
  /**
@@ -16803,7 +16900,7 @@ const unbanMembers = async (communityId, userIds) => {
16803
16900
  };
16804
16901
  /* end_public_function */
16805
16902
 
16806
- var index$9 = /*#__PURE__*/Object.freeze({
16903
+ var index$a = /*#__PURE__*/Object.freeze({
16807
16904
  __proto__: null,
16808
16905
  addRoles: addRoles,
16809
16906
  removeRoles: removeRoles,
@@ -17077,7 +17174,7 @@ const getMembers = (params, callback, config) => {
17077
17174
  };
17078
17175
  /* end_public_function */
17079
17176
 
17080
- var index$8 = /*#__PURE__*/Object.freeze({
17177
+ var index$9 = /*#__PURE__*/Object.freeze({
17081
17178
  __proto__: null,
17082
17179
  addMembers: addMembers,
17083
17180
  removeMembers: removeMembers,
@@ -17094,10 +17191,10 @@ var index$8 = /*#__PURE__*/Object.freeze({
17094
17191
  onCommunityLeft: onCommunityLeft
17095
17192
  });
17096
17193
 
17097
- var index$7 = /*#__PURE__*/Object.freeze({
17194
+ var index$8 = /*#__PURE__*/Object.freeze({
17098
17195
  __proto__: null,
17099
- Moderation: index$9,
17100
- Membership: index$8,
17196
+ Moderation: index$a,
17197
+ Membership: index$9,
17101
17198
  getCommunityByIds: getCommunities$1,
17102
17199
  createCommunity: createCommunity,
17103
17200
  updateCommunity: updateCommunity,
@@ -17329,7 +17426,7 @@ const getCategories = (params, callback, config) => {
17329
17426
  };
17330
17427
  /* end_public_function */
17331
17428
 
17332
- var index$6 = /*#__PURE__*/Object.freeze({
17429
+ var index$7 = /*#__PURE__*/Object.freeze({
17333
17430
  __proto__: null,
17334
17431
  getCategory: getCategory,
17335
17432
  getCategories: getCategories
@@ -17539,7 +17636,7 @@ getCustomRankingGlobalFeed.locally = (query) => {
17539
17636
  : undefined;
17540
17637
  };
17541
17638
 
17542
- var index$5 = /*#__PURE__*/Object.freeze({
17639
+ var index$6 = /*#__PURE__*/Object.freeze({
17543
17640
  __proto__: null,
17544
17641
  queryGlobalFeed: queryGlobalFeed,
17545
17642
  getCustomRankingGlobalFeed: getCustomRankingGlobalFeed
@@ -18302,7 +18399,7 @@ const getPosts = (params, callback, config) => {
18302
18399
  };
18303
18400
  /* end_public_function */
18304
18401
 
18305
- var index$4 = /*#__PURE__*/Object.freeze({
18402
+ var index$5 = /*#__PURE__*/Object.freeze({
18306
18403
  __proto__: null,
18307
18404
  getPostByIds: getPostByIds,
18308
18405
  createPost: createPost,
@@ -18950,7 +19047,7 @@ const getComments = (params, callback, config) => {
18950
19047
  };
18951
19048
  /* end_public_function */
18952
19049
 
18953
- var index$3 = /*#__PURE__*/Object.freeze({
19050
+ var index$4 = /*#__PURE__*/Object.freeze({
18954
19051
  __proto__: null,
18955
19052
  getCommentByIds: getCommentByIds,
18956
19053
  createComment: createComment,
@@ -19416,7 +19513,7 @@ const getStreams = (params, callback, config) => {
19416
19513
  };
19417
19514
  /* end_public_function */
19418
19515
 
19419
- var index$2 = /*#__PURE__*/Object.freeze({
19516
+ var index$3 = /*#__PURE__*/Object.freeze({
19420
19517
  __proto__: null,
19421
19518
  createStream: createStream,
19422
19519
  updateStream: updateStream,
@@ -19747,7 +19844,7 @@ const getPoll = (pollId, callback) => {
19747
19844
  };
19748
19845
  /* end_public_function */
19749
19846
 
19750
- var index$1 = /*#__PURE__*/Object.freeze({
19847
+ var index$2 = /*#__PURE__*/Object.freeze({
19751
19848
  __proto__: null,
19752
19849
  createPoll: createPoll,
19753
19850
  closePoll: closePoll,
@@ -20119,11 +20216,332 @@ const getPlayer = async (parameters) => {
20119
20216
  return video;
20120
20217
  };
20121
20218
 
20122
- var index = /*#__PURE__*/Object.freeze({
20219
+ var index$1 = /*#__PURE__*/Object.freeze({
20123
20220
  __proto__: null,
20124
20221
  getPlayer: getPlayer
20125
20222
  });
20126
20223
 
20224
+ const convertStoryPayloadToRaw = (payload) => {
20225
+ const client = getActiveClient();
20226
+ const now = new Date();
20227
+ const expiresAt = now.getTime() + YEAR;
20228
+ return {
20229
+ stories: [
20230
+ Object.assign({ createdAt: now.toISOString(), flagCount: 0, hashFlag: null, reactions: {}, reactionsCount: 0, storyId: payload.referenceId, path: '', creatorId: client.userId || '', creatorPublicId: client.userId || '', targetPublicId: payload.targetId, commentsCount: 0, isDeleted: false, hasFlaggedComment: false, mentionedUsers: [], impression: 0, reach: 0, expiresAt: new Date(expiresAt).toISOString(), syncState: "syncing" /* Amity.SyncState.Syncing */ }, payload),
20231
+ ],
20232
+ categories: [],
20233
+ communityUsers: [],
20234
+ comments: [],
20235
+ files: [],
20236
+ users: [],
20237
+ communities: [],
20238
+ };
20239
+ };
20240
+
20241
+ const saveOptimisticToCache = (payload) => {
20242
+ const optimisticData = convertStoryPayloadToRaw(payload);
20243
+ ingestInCache(optimisticData);
20244
+ return optimisticData;
20245
+ };
20246
+ const createOptimisticEvent = ({ payload, formData = undefined, isVideo = false, }, callback) => {
20247
+ if (formData) {
20248
+ const fileObject = formData.get('files');
20249
+ const fileData = new FileReader();
20250
+ // @ts-ignore
20251
+ fileData.readAsDataURL(fileObject);
20252
+ fileData.onload = () => {
20253
+ return callback(saveOptimisticToCache(isVideo
20254
+ ? Object.assign(Object.assign({}, payload), { data: Object.assign(Object.assign({}, payload.data), { fileId: undefined, videoFileId: { original: undefined }, fileData: fileData === null || fileData === void 0 ? void 0 : fileData.result }) }) : Object.assign(Object.assign({}, payload), { data: Object.assign(Object.assign({}, payload.data), { fileId: undefined, fileData: fileData === null || fileData === void 0 ? void 0 : fileData.result }) })));
20255
+ };
20256
+ }
20257
+ return callback(saveOptimisticToCache(Object.assign(Object.assign({}, payload), { data: Object.assign(Object.assign({}, payload.data), { fileData: null }) })));
20258
+ };
20259
+
20260
+ // Due to we have optimistic logic, we will use referenceId as a id in SDK instead of storyId
20261
+ const convertRawStoryToInternalStory = (rawData) => {
20262
+ const { storyId, referenceId } = rawData;
20263
+ if (referenceId)
20264
+ return Object.assign(Object.assign({}, rawData), { syncState: "synced" /* Amity.SyncState.Synced */ });
20265
+ return Object.assign(Object.assign({}, rawData), { syncState: "synced" /* Amity.SyncState.Synced */, referenceId: storyId });
20266
+ };
20267
+ const convertStoryRawToInternal = (data) => {
20268
+ const { stories } = data;
20269
+ const storiesData = stories.map(convertRawStoryToInternalStory);
20270
+ return Object.assign(Object.assign({}, data), { stories: storiesData });
20271
+ };
20272
+
20273
+ const createStory = async (payload) => {
20274
+ const client = getActiveClient();
20275
+ client.log('post/createStory', payload);
20276
+ const response = await client.http.post('/api/v4/stories', payload);
20277
+ const convertedResponse = convertStoryRawToInternal(response.data);
20278
+ if (client.cache)
20279
+ ingestInCache(convertedResponse);
20280
+ const cachedAt = client.cache && Date.now();
20281
+ return {
20282
+ data: response.data.stories.length > 0 ? response.data.stories[0] : undefined,
20283
+ cachedAt,
20284
+ };
20285
+ };
20286
+
20287
+ /**
20288
+ * ```js
20289
+ * import { StoryRepository } from '@amityco/ts-sdk'
20290
+ * StoryRepository.createImageStory('community', 'communityId', formData, metadata, items)
20291
+ * ```
20292
+ *
20293
+ * Create a new image story
20294
+ * @param targetType The type of the target
20295
+ * @param targetId The id of the target
20296
+ * @param formData The form data
20297
+ * @param metadata The metadata
20298
+ * @param items The story items
20299
+ * @returns The created story
20300
+ */
20301
+ const createImageStory = async (targetType, targetId, formData, metadata, items) => {
20302
+ if (!formData.getAll('files').length) {
20303
+ throw new Error('The formData object must have a `files` key.');
20304
+ }
20305
+ let payload = {
20306
+ data: {
20307
+ text: '',
20308
+ fileId: undefined,
20309
+ fileData: null,
20310
+ },
20311
+ referenceId: uuid(),
20312
+ dataType: "image" /* Amity.StoryDataType.Image */,
20313
+ items,
20314
+ targetType,
20315
+ targetId,
20316
+ metadata,
20317
+ };
20318
+ // Fire optimistic event
20319
+ createOptimisticEvent({ payload, formData }, optimisticData => {
20320
+ fireEvent('story.created', optimisticData);
20321
+ });
20322
+ const { data } = await uploadImage(formData);
20323
+ // @TODO: Need to implement retrying logic in a future
20324
+ if (data.length === 0)
20325
+ throw new Error('Failed to upload image');
20326
+ const { fileId } = data[0];
20327
+ payload = Object.assign(Object.assign({}, payload), { data: Object.assign(Object.assign({}, payload.data), { fileId }) });
20328
+ // Fire optimistic event - update fileId
20329
+ createOptimisticEvent({ payload }, optimisticData => {
20330
+ fireEvent('story.created', optimisticData);
20331
+ });
20332
+ const result = await createStory(payload);
20333
+ if (!result.data)
20334
+ return result;
20335
+ return Object.assign(Object.assign({}, result), { data: LinkedObject.story(result.data) });
20336
+ };
20337
+
20338
+ /**
20339
+ * ```js
20340
+ * import { StoryRepository } from '@amityco/ts-sdk'
20341
+ * StoryRepository.createVideoStory('community', 'communityId', formData, metadata, items)
20342
+ * ```
20343
+ *
20344
+ * Create a new video story
20345
+ * @param targetType
20346
+ * @param targetId
20347
+ * @param formData
20348
+ * @param metadata
20349
+ * @param items
20350
+ */
20351
+ const createVideoStory = async (targetType, targetId, formData, metadata, items) => {
20352
+ if (!formData.getAll('files').length)
20353
+ throw new Error('The formData object must have a `files` key.');
20354
+ let payload = {
20355
+ data: {
20356
+ text: '',
20357
+ fileId: undefined,
20358
+ fileData: null,
20359
+ },
20360
+ referenceId: uuid(),
20361
+ dataType: "video" /* Amity.StoryDataType.Video */,
20362
+ items,
20363
+ targetType,
20364
+ targetId,
20365
+ metadata,
20366
+ };
20367
+ // Fire optimistic event
20368
+ createOptimisticEvent({ payload, formData, isVideo: true }, optimisticData => {
20369
+ fireEvent('story.created', optimisticData);
20370
+ });
20371
+ const { data } = await uploadVideo(formData, ContentFeedType.STORY);
20372
+ // @TODO: Need to implement retrying logic in a future
20373
+ if (data.length === 0)
20374
+ throw new Error('Failed to upload video');
20375
+ const { fileId } = data[0];
20376
+ payload = Object.assign(Object.assign({}, payload), { data: Object.assign(Object.assign({}, payload.data), { fileId, videoFileId: { original: fileId } }) });
20377
+ // Fire optimistic event - update fileId
20378
+ createOptimisticEvent({ payload, formData, isVideo: true }, optimisticData => {
20379
+ fireEvent('story.created', optimisticData);
20380
+ });
20381
+ const result = await createStory(payload);
20382
+ if (!result.data)
20383
+ return result;
20384
+ return Object.assign(Object.assign({}, result), { data: LinkedObject.story(result.data) });
20385
+ };
20386
+
20387
+ const getStoryCache = (storyId) => {
20388
+ if (!storyId)
20389
+ return { data: undefined, cachedAt: undefined };
20390
+ return pullFromCache(['story', 'get', storyId]);
20391
+ };
20392
+
20393
+ const deleteStory = async (storyId, permanent = false) => {
20394
+ const client = getActiveClient();
20395
+ client.log('story/deleteStory', storyId);
20396
+ let cached;
20397
+ if (client.cache) {
20398
+ cached = getStoryCache(storyId);
20399
+ if (cached === null || cached === void 0 ? void 0 : cached.data) {
20400
+ const { data } = cached;
20401
+ fireEvent('story.deleted', {
20402
+ categories: [],
20403
+ comments: [],
20404
+ communities: [],
20405
+ communityUsers: [],
20406
+ files: [],
20407
+ users: [],
20408
+ stories: [Object.assign(Object.assign({}, data), { isDeleted: true })],
20409
+ });
20410
+ }
20411
+ }
20412
+ const response = await client.http.delete(`/api/v4/stories/${storyId}`, {
20413
+ params: { permanent },
20414
+ });
20415
+ return response.data.success;
20416
+ };
20417
+
20418
+ const hardDeleteStory = async (storyId) => {
20419
+ const result = await deleteStory(storyId, true);
20420
+ return result;
20421
+ };
20422
+
20423
+ const softDeleteStory = async (storyId) => {
20424
+ const result = await deleteStory(storyId, false);
20425
+ return result;
20426
+ };
20427
+
20428
+ const getActiveStoriesByTarget$1 = async (targetType, targetId, option) => {
20429
+ const client = getActiveClient();
20430
+ client.log('story/getActiveStoriesByTarget');
20431
+ const cachedAt = client.cache && Date.now();
20432
+ const response = await client.http.get('/api/v4/stories', {
20433
+ params: {
20434
+ targetType,
20435
+ targetId,
20436
+ options: {
20437
+ sortBy: (option === null || option === void 0 ? void 0 : option.sortBy) || 'createdAt',
20438
+ orderBy: (option === null || option === void 0 ? void 0 : option.orderBy) || 'desc',
20439
+ },
20440
+ },
20441
+ });
20442
+ const convertedData = convertStoryRawToInternal(response.data);
20443
+ if (client.cache) {
20444
+ ingestInCache(convertedData);
20445
+ }
20446
+ return {
20447
+ data: convertedData.stories,
20448
+ cachedAt,
20449
+ paging: { next: undefined, previous: undefined }, // Disable pagination for this API
20450
+ };
20451
+ };
20452
+
20453
+ const onStoryCreated = (callback) => {
20454
+ const client = getActiveClient();
20455
+ const filter = async (payload) => {
20456
+ ingestInCache(payload);
20457
+ callback(payload.stories);
20458
+ };
20459
+ return createEventSubscriber(client, 'onStoryCreated', 'story.created', filter);
20460
+ };
20461
+
20462
+ const onStoryDeleted = (callback) => {
20463
+ const client = getActiveClient();
20464
+ const filter = async (payload) => {
20465
+ ingestInCache(payload);
20466
+ callback(payload.stories);
20467
+ };
20468
+ return createEventSubscriber(client, 'onStoryDeleted', 'story.deleted', filter);
20469
+ };
20470
+
20471
+ const getActiveStoriesByTarget = (params, callback) => {
20472
+ const { log, cache } = getActiveClient();
20473
+ const disposers = [];
20474
+ const cacheKey = ['story-target', 'collection', params];
20475
+ const timestamp = Date.now();
20476
+ log(`getActiveStoriesByTarget(tmpid: ${timestamp}) > listen`);
20477
+ if (!cache) {
20478
+ console.log(ENABLE_CACHE_MESSAGE);
20479
+ }
20480
+ const responder = (snapshot) => {
20481
+ var _a;
20482
+ const stories = snapshot.data
20483
+ .map(referenceId => {
20484
+ const story = getStoryCache(referenceId);
20485
+ if (!(story === null || story === void 0 ? void 0 : story.data))
20486
+ return undefined;
20487
+ return LinkedObject.story(story.data);
20488
+ })
20489
+ .filter(Boolean)
20490
+ // Remove all deleted stories
20491
+ .filter(item => {
20492
+ if (!item)
20493
+ return false;
20494
+ return !item.isDeleted;
20495
+ });
20496
+ callback({
20497
+ onNextPage: () => false,
20498
+ data: stories,
20499
+ hasNextPage: !!((_a = snapshot.params) === null || _a === void 0 ? void 0 : _a.page),
20500
+ loading: snapshot.loading || false,
20501
+ });
20502
+ };
20503
+ const processNewData = (result, initial = false, loading = false, error = false) => {
20504
+ const cached = pullFromCache(cacheKey);
20505
+ const data = {
20506
+ loading,
20507
+ error,
20508
+ params: { page: undefined },
20509
+ data: (cached === null || cached === void 0 ? void 0 : cached.data) || [],
20510
+ };
20511
+ if (result) {
20512
+ data.data = initial
20513
+ ? result.map(getResolver('story'))
20514
+ : [...new Set([...data.data, ...result.map(getResolver('story'))])];
20515
+ }
20516
+ pushToCache(cacheKey, data.data);
20517
+ responder(data);
20518
+ };
20519
+ const realtimeRouter = (event) => (story) => {
20520
+ processNewData(story);
20521
+ };
20522
+ const onFetch = (initial) => {
20523
+ const query = createQuery(getActiveStoriesByTarget$1, params.targetType, params.targetId, params.options);
20524
+ runQuery(query, ({ data: result, error, loading }) => {
20525
+ processNewData(result, initial, loading, error);
20526
+ });
20527
+ };
20528
+ onFetch(true);
20529
+ disposers.push(onStoryCreated(realtimeRouter()), onStoryDeleted(realtimeRouter()), () => dropFromCache(cacheKey));
20530
+ return () => {
20531
+ log(`getActiveStoriesByTarget(tmpid: ${timestamp}) > dispose`);
20532
+ disposers.forEach(fn => fn());
20533
+ };
20534
+ };
20535
+
20536
+ var index = /*#__PURE__*/Object.freeze({
20537
+ __proto__: null,
20538
+ createImageStory: createImageStory,
20539
+ createVideoStory: createVideoStory,
20540
+ hardDeleteStory: hardDeleteStory,
20541
+ softDeleteStory: softDeleteStory,
20542
+ getActiveStoriesByTarget: getActiveStoriesByTarget
20543
+ });
20544
+
20127
20545
  /**
20128
20546
  * Retrieves accessToken info to use in Beta services
20129
20547
  *
@@ -20147,28 +20565,29 @@ const createUserToken = async (apiKey, apiRegion, params) => {
20147
20565
  };
20148
20566
 
20149
20567
  exports.API_REGIONS = API_REGIONS;
20150
- exports.CategoryRepository = index$6;
20151
- exports.ChannelRepository = index$c;
20152
- exports.Client = index$j;
20153
- exports.CommentRepository = index$3;
20568
+ exports.CategoryRepository = index$7;
20569
+ exports.ChannelRepository = index$d;
20570
+ exports.Client = index$k;
20571
+ exports.CommentRepository = index$4;
20154
20572
  exports.CommunityPostSettingMaps = CommunityPostSettingMaps;
20155
20573
  exports.CommunityPostSettings = CommunityPostSettings;
20156
- exports.CommunityRepository = index$7;
20574
+ exports.CommunityRepository = index$8;
20157
20575
  exports.ContentFeedType = ContentFeedType;
20158
20576
  exports.DefaultCommunityPostSetting = DefaultCommunityPostSetting;
20159
- exports.FeedRepository = index$5;
20160
- exports.FileRepository = index$g;
20577
+ exports.FeedRepository = index$6;
20578
+ exports.FileRepository = index$h;
20161
20579
  exports.FileType = FileType;
20162
- exports.LiveStreamPlayer = index;
20580
+ exports.LiveStreamPlayer = index$1;
20163
20581
  exports.MessageContentType = MessageContentType;
20164
- exports.MessageRepository = index$b;
20165
- exports.PollRepository = index$1;
20582
+ exports.MessageRepository = index$c;
20583
+ exports.PollRepository = index$2;
20166
20584
  exports.PostContentType = PostContentType;
20167
- exports.PostRepository = index$4;
20168
- exports.ReactionRepository = index$f;
20169
- exports.StreamRepository = index$2;
20170
- exports.SubChannelRepository = index$a;
20171
- exports.UserRepository = index$h;
20585
+ exports.PostRepository = index$5;
20586
+ exports.ReactionRepository = index$g;
20587
+ exports.StoryRepository = index;
20588
+ exports.StreamRepository = index$3;
20589
+ exports.SubChannelRepository = index$b;
20590
+ exports.UserRepository = index$i;
20172
20591
  exports.VERSION = VERSION;
20173
20592
  exports.VideoResolution = VideoResolution;
20174
20593
  exports.VideoSize = VideoSize;