@amityco/ts-sdk 6.17.1-e9b6af1.0 → 6.17.2-ea577e1.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 (86) hide show
  1. package/dist/@types/core/payload.d.ts +1 -0
  2. package/dist/@types/core/payload.d.ts.map +1 -1
  3. package/dist/@types/core/permissions.d.ts +5 -0
  4. package/dist/@types/core/permissions.d.ts.map +1 -1
  5. package/dist/@types/domains/client.d.ts +1 -0
  6. package/dist/@types/domains/client.d.ts.map +1 -1
  7. package/dist/@types/domains/story.d.ts +4 -0
  8. package/dist/@types/domains/story.d.ts.map +1 -1
  9. package/dist/channelRepository/observers/getChannel.d.ts.map +1 -1
  10. package/dist/channelRepository/observers/getChannels/ChannelLiveCollectionController.d.ts.map +1 -1
  11. package/dist/client/api/createClient.d.ts.map +1 -1
  12. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -1
  13. package/dist/client/observers/getUserUnread.d.ts.map +1 -1
  14. package/dist/client/utils/hasPermission/checkChannelPermission.d.ts +2 -0
  15. package/dist/client/utils/hasPermission/checkChannelPermission.d.ts.map +1 -0
  16. package/dist/client/utils/hasPermission/checkCommunityPermission.d.ts +2 -0
  17. package/dist/client/utils/hasPermission/checkCommunityPermission.d.ts.map +1 -0
  18. package/dist/client/utils/hasPermission/checkUserPermission.d.ts +2 -0
  19. package/dist/client/utils/hasPermission/checkUserPermission.d.ts.map +1 -0
  20. package/dist/client/utils/hasPermission/hasPermission.d.ts +6 -0
  21. package/dist/client/utils/hasPermission/hasPermission.d.ts.map +1 -0
  22. package/dist/client/utils/hasPermission/index.d.ts +2 -0
  23. package/dist/client/utils/hasPermission/index.d.ts.map +1 -0
  24. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -1
  25. package/dist/index.cjs.js +510 -70
  26. package/dist/index.esm.js +510 -71
  27. package/dist/index.umd.js +4 -4
  28. package/dist/marker/api/getUserMarker.d.ts +1 -1
  29. package/dist/marker/api/getUserMarker.d.ts.map +1 -1
  30. package/dist/marker/events/onChannelMarkerFetched.d.ts.map +1 -1
  31. package/dist/marker/events/onUserMarkerFetched.d.ts +2 -1
  32. package/dist/marker/events/onUserMarkerFetched.d.ts.map +1 -1
  33. package/dist/messageRepository/events/onMessageCreated.d.ts +2 -1
  34. package/dist/messageRepository/events/onMessageCreated.d.ts.map +1 -1
  35. package/dist/messageRepository/observers/observeMessages.d.ts.map +1 -1
  36. package/dist/messageRepository/utils/prepareMessagePayload.d.ts.map +1 -1
  37. package/dist/storyRepository/constants.d.ts +1 -0
  38. package/dist/storyRepository/constants.d.ts.map +1 -1
  39. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.d.ts +14 -0
  40. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.d.ts.map +1 -0
  41. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.d.ts +5 -0
  42. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.d.ts.map +1 -0
  43. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.d.ts +16 -0
  44. package/dist/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.d.ts.map +1 -0
  45. package/dist/storyRepository/observers/getStoriesByTargetIds/getStoriesByTargetIds.d.ts +5 -0
  46. package/dist/storyRepository/observers/getStoriesByTargetIds/getStoriesByTargetIds.d.ts.map +1 -0
  47. package/dist/storyRepository/observers/getStoriesByTargetIds/index.d.ts +2 -0
  48. package/dist/storyRepository/observers/getStoriesByTargetIds/index.d.ts.map +1 -0
  49. package/dist/storyRepository/observers/index.d.ts +1 -0
  50. package/dist/storyRepository/observers/index.d.ts.map +1 -1
  51. package/dist/subChannelRepository/observers/getSubChannel.d.ts.map +1 -1
  52. package/dist/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/src/@types/core/payload.ts +1 -0
  55. package/src/@types/core/permissions.ts +6 -0
  56. package/src/@types/domains/client.ts +2 -0
  57. package/src/@types/domains/story.ts +5 -0
  58. package/src/channelRepository/observers/getChannel.ts +30 -2
  59. package/src/channelRepository/observers/getChannels/ChannelLiveCollectionController.ts +65 -3
  60. package/src/client/api/createClient.ts +3 -1
  61. package/src/client/observers/getTotalUnreadCount.ts +14 -4
  62. package/src/client/observers/getUserUnread.ts +95 -11
  63. package/src/client/utils/hasPermission/checkChannelPermission.ts +22 -0
  64. package/src/client/utils/hasPermission/checkCommunityPermission.ts +22 -0
  65. package/src/client/utils/hasPermission/checkUserPermission.ts +12 -0
  66. package/src/client/utils/hasPermission/hasPermission.ts +18 -0
  67. package/src/client/utils/hasPermission/index.ts +1 -0
  68. package/src/client/utils/markerSyncEngine.ts +46 -32
  69. package/src/marker/api/getUserMarker.ts +15 -4
  70. package/src/marker/events/onChannelMarkerFetched.ts +3 -1
  71. package/src/marker/events/onUserMarkerFetched.ts +17 -0
  72. package/src/messageRepository/api/tests/createMessage.test.ts +4 -4
  73. package/src/messageRepository/events/onMessageCreated.ts +20 -8
  74. package/src/messageRepository/events/tests/events.test.ts +2 -2
  75. package/src/messageRepository/observers/getMessages/MessageLiveCollectionController.ts +2 -2
  76. package/src/messageRepository/observers/observeMessages.ts +8 -2
  77. package/src/messageRepository/utils/prepareMessagePayload.ts +14 -4
  78. package/src/storyRepository/constants.ts +1 -0
  79. package/src/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.ts +113 -0
  80. package/src/storyRepository/observers/getStoriesByTargetIds/StoryPaginationNoPageController.ts +18 -0
  81. package/src/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.ts +97 -0
  82. package/src/storyRepository/observers/getStoriesByTargetIds/getStoriesByTargetIds.ts +32 -0
  83. package/src/storyRepository/observers/getStoriesByTargetIds/index.ts +1 -0
  84. package/src/storyRepository/observers/index.ts +1 -0
  85. package/src/subChannelRepository/observers/getSubChannel.ts +35 -2
  86. package/src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts +53 -2
@@ -1,2 +1,2 @@
1
- export declare const getUserMarker: () => Promise<Amity.Cached<Amity.UserMarker>>;
1
+ export declare const getUserMarker: () => Promise<Amity.Cached<Amity.UserMarker | null>>;
2
2
  //# sourceMappingURL=getUserMarker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getUserMarker.d.ts","sourceRoot":"","sources":["../../../src/marker/api/getUserMarker.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,aAAa,QAAa,QAAQ,MAAM,MAAM,CAAC,MAAM,UAAU,CAAC,CAqB5E,CAAC"}
1
+ {"version":3,"file":"getUserMarker.d.ts","sourceRoot":"","sources":["../../../src/marker/api/getUserMarker.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,aAAa,QAAa,QAAQ,MAAM,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,CAgCnF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"onChannelMarkerFetched.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onChannelMarkerFetched.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,aACvB,MAAM,QAAQ,CAAC,MAAM,aAAa,CAAC,KAC5C,MAAM,YAaR,CAAC"}
1
+ {"version":3,"file":"onChannelMarkerFetched.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onChannelMarkerFetched.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,aACvB,MAAM,QAAQ,CAAC,MAAM,aAAa,CAAC,KAC5C,MAAM,YAeR,CAAC"}
@@ -13,5 +13,6 @@
13
13
  *
14
14
  * @category UserMarker Events
15
15
  */
16
- export declare const onUserMarkerFetched: (callback: Amity.Listener<Amity.UserMarker>) => Amity.Unsubscriber;
16
+ export declare const onUserMarkerFetched: (callback: Amity.Listener<Amity.UserMarker[]>) => Amity.Unsubscriber;
17
+ export declare const onUserMarkerFetchedLegacy: (callback: Amity.Listener<Amity.UserMarker>) => Amity.Unsubscriber;
17
18
  //# sourceMappingURL=onUserMarkerFetched.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"onUserMarkerFetched.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onUserMarkerFetched.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,aACpB,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,KACzC,MAAM,YAaR,CAAC"}
1
+ {"version":3,"file":"onUserMarkerFetched.d.ts","sourceRoot":"","sources":["../../../src/marker/events/onUserMarkerFetched.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,aACpB,MAAM,QAAQ,CAAC,MAAM,UAAU,EAAE,CAAC,KAC3C,MAAM,YAaR,CAAC;AAEF,eAAO,MAAM,yBAAyB,aAC1B,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,KACzC,MAAM,YAaR,CAAC"}
@@ -14,5 +14,6 @@
14
14
  *
15
15
  * @category Message Events
16
16
  */
17
- export declare const onMessageCreated: (callback: Amity.Listener<Amity.Message>, local?: boolean) => Amity.Unsubscriber;
17
+ export declare const onMessageCreatedMqtt: (callback: Amity.Listener<Amity.Message>) => Amity.Unsubscriber;
18
+ export declare const onMessageCreatedLocal: (callback: Amity.Listener<Amity.Message>) => Amity.Unsubscriber;
18
19
  //# sourceMappingURL=onMessageCreated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"onMessageCreated.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/events/onMessageCreated.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB,aACjB,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,sBAEtC,MAAM,YA0BR,CAAC"}
1
+ {"version":3,"file":"onMessageCreated.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/events/onMessageCreated.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,aACrB,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,KACtC,MAAM,YAqBR,CAAC;AAEF,eAAO,MAAM,qBAAqB,aACtB,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,KACtC,MAAM,YAcR,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"observeMessages.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/observers/observeMessages.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,eAAe,iBACZ,MAAM,UAAU,CAAC,cAAc,CAAC,YACpC,MAAM,cAAc,CAC5B,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,EAC7B;IAAC,UAAU;IAAE,UAAU;IAAE,UAAU;CAAC,CACrC,KACA,MAAM,YAwCR,CAAC"}
1
+ {"version":3,"file":"observeMessages.d.ts","sourceRoot":"","sources":["../../../src/messageRepository/observers/observeMessages.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,eAAe,iBACZ,MAAM,UAAU,CAAC,cAAc,CAAC,YACpC,MAAM,cAAc,CAC5B,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,EAC7B;IAAC,UAAU;IAAE,UAAU;IAAE,UAAU;CAAC,CACrC,KACA,MAAM,YAyCR,CAAC"}
@@ -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,EAIjB,MAAM,GACN,QAAQ,GACR,cAAc,GACd,MAAM,GACN,gBAAgB,GAChB,iBAAiB,GACjB,UAAU,GACV,eAAe,GACf,eAAe,CAClB,GAAG;IACF,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC;IACpC,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;KACrC,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,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,KAAK,EACL,IAAI,EACJ,GAAG,IAAI,EACR,EAAE,KAAK,CAAC,sBAAsB,GAAG,gBAAgB,CA6BjD"}
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;AAWD,eAAO,MAAM,qBAAqB,YACvB,MAAM,cAAc,UACrB,MAAM,MAAM,iBAAiB,KACpC,QAAQ,MAAM,uBAAuB,CA0CvC,CAAC;AAEF,aAAK,gBAAgB,GAAG,IAAI,CAC1B,KAAK,CAAC,aAAa,EAIjB,MAAM,GACN,QAAQ,GACR,cAAc,GACd,MAAM,GACN,gBAAgB,GAChB,iBAAiB,GACjB,UAAU,GACV,eAAe,GACf,eAAe,CAClB,GAAG;IACF,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC;IACpC,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;KACrC,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,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,KAAK,EACL,IAAI,EACJ,GAAG,IAAI,EACR,EAAE,KAAK,CAAC,sBAAsB,GAAG,gBAAgB,CA6BjD"}
@@ -1,6 +1,7 @@
1
1
  export declare const enum STORY_KEY_CACHE {
2
2
  STORY = "story",
3
3
  SYNC_STATE = "story-sync-state",
4
+ STORY_TARGET_IDS = "story-target-ids",
4
5
  IS_SEEN = "story-seen",
5
6
  LAST_SEEN = "story-last-seen",
6
7
  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,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,UAAU,qBAAqB;IAC/B,gBAAgB,qBAAqB;IACrC,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 { StoryPaginationNoPageController } from './StoryPaginationNoPageController';
3
+ export declare class StoryLiveCollectionController extends LiveCollectionController<'story', Amity.StoryLiveCollection, Amity.Story, StoryPaginationNoPageController> {
4
+ private queryStreamController;
5
+ private query;
6
+ constructor(query: Amity.StoryLiveCollection, callback: Amity.LiveCollectionCallback<Amity.Story>);
7
+ protected setup(): void;
8
+ protected persistModel(response: Amity.StoryPayload): void;
9
+ protected persistQueryStream({ response, direction, refresh, }: Amity.LiveCollectionPersistQueryStreamParams<'story'>): void;
10
+ notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams): void;
11
+ private applyFilter;
12
+ startSubscription(): Amity.Unsubscriber[];
13
+ }
14
+ //# sourceMappingURL=StoryLiveCollectionController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoryLiveCollectionController.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getStoriesByTargetIds/StoryLiveCollectionController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAU1F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,qBAAa,6BAA8B,SAAQ,wBAAwB,CACzE,OAAO,EACP,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,KAAK,EACX,+BAA+B,CAChC;IACC,OAAO,CAAC,qBAAqB,CAA6B;IAE1D,OAAO,CAAC,KAAK,CAA4B;gBAGvC,KAAK,EAAE,KAAK,CAAC,mBAAmB,EAChC,QAAQ,EAAE,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;IAsBrD,SAAS,CAAC,KAAK;IAUf,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY;IAInD,SAAS,CAAC,kBAAkB,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,GACR,EAAE,KAAK,CAAC,sCAAsC,CAAC,OAAO,CAAC;IAIxD,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,0BAA0B;IAyBzE,OAAO,CAAC,WAAW;IAUnB,iBAAiB;CAQlB"}
@@ -0,0 +1,5 @@
1
+ import { PaginationNoPageController } from '~/core/liveCollection/PaginationNoPageController';
2
+ export declare class StoryPaginationNoPageController extends PaginationNoPageController<'story', Pick<Amity.StoryLiveCollection, 'targets'>> {
3
+ getRequest(queryParams: Pick<Amity.StoryLiveCollection, 'targets'>): Promise<Amity.StoryPayload>;
4
+ }
5
+ //# sourceMappingURL=StoryPaginationNoPageController.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,16 @@
1
+ import { QueryStreamController } from '~/core/liveCollection/QueryStreamController';
2
+ import { StoryPaginationNoPageController } from './StoryPaginationNoPageController';
3
+ export declare class StoryQueryStreamController extends QueryStreamController<Amity.StoryPayload, Amity.StoryLiveCollection> {
4
+ private notifyChange;
5
+ private paginationController;
6
+ constructor(query: Amity.StoryLiveCollection, cacheKey: string[], notifyChange: (params: Amity.LiveCollectionNotifyParams) => void, paginationController: StoryPaginationNoPageController);
7
+ saveToMainDB(response: Amity.StoryPayload): void;
8
+ getStoryReferenceIds(story: Amity.RawStory): string;
9
+ appendToQueryStream(response: Amity.StoryPayload, direction: Amity.LiveCollectionPageDirection, refresh?: boolean): void;
10
+ reactor(action: 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=StoryQueryStreamController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoryQueryStreamController.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getStoriesByTargetIds/StoryQueryStreamController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAOpF,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,qBAAa,0BAA2B,SAAQ,qBAAqB,CACnE,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,mBAAmB,CAC1B;IACC,OAAO,CAAC,YAAY,CAAqD;IAEzE,OAAO,CAAC,oBAAoB,CAAkC;gBAG5D,KAAK,EAAE,KAAK,CAAC,mBAAmB,EAChC,QAAQ,EAAE,MAAM,EAAE,EAClB,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,0BAA0B,KAAK,IAAI,EAChE,oBAAoB,EAAE,+BAA+B;IAQvD,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY;IAkBzC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ;IAO1C,mBAAmB,CACjB,QAAQ,EAAE,KAAK,CAAC,YAAY,EAC5B,SAAS,EAAE,KAAK,CAAC,2BAA2B,EAC5C,OAAO,UAAQ;IAiBjB,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,aAClB,MAAM,aAAa,EAAE;IAaxC,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,5 @@
1
+ export declare const getStoriesByTargetIds: (params: {
2
+ targets: Amity.StoryTargetQueryParam[];
3
+ options?: Amity.StorySortOption;
4
+ }, callback: Amity.LiveCollectionCallback<Amity.Story>, config?: Amity.LiveCollectionConfig) => () => void;
5
+ //# sourceMappingURL=getStoriesByTargetIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getStoriesByTargetIds.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getStoriesByTargetIds/getStoriesByTargetIds.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,WACxB;IAAE,OAAO,EAAE,MAAM,qBAAqB,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,eAAe,CAAA;CAAE,YACzE,MAAM,sBAAsB,CAAC,MAAM,KAAK,CAAC,WAC1C,MAAM,oBAAoB,eAuBpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './getStoriesByTargetIds';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storyRepository/observers/getStoriesByTargetIds/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -2,4 +2,5 @@ export * from './getActiveStoriesByTarget';
2
2
  export * from './getStoryByStoryId';
3
3
  export * from './getTargetById';
4
4
  export * from './getTargetsByTargetIds';
5
+ export * from './getStoriesByTargetIds';
5
6
  //# 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"}
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 +1 @@
1
- {"version":3,"file":"getSubChannel.d.ts","sourceRoot":"","sources":["../../../src/subChannelRepository/observers/getSubChannel.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,iBACV,MAAM,UAAU,CAAC,cAAc,CAAC,YACpC,MAAM,kBAAkB,CAAC,MAAM,UAAU,CAAC,KACnD,MAAM,YAmJR,CAAC"}
1
+ {"version":3,"file":"getSubChannel.d.ts","sourceRoot":"","sources":["../../../src/subChannelRepository/observers/getSubChannel.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,iBACV,MAAM,UAAU,CAAC,cAAc,CAAC,YACpC,MAAM,kBAAkB,CAAC,MAAM,UAAU,CAAC,KACnD,MAAM,YA+KR,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SubChannelLiveCollectionController.d.ts","sourceRoot":"","sources":["../../../../src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAE1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAuBlF,qBAAa,kCAAmC,SAAQ,wBAAwB,CAC9E,YAAY,EACZ,KAAK,CAAC,wBAAwB,EAC9B,KAAK,CAAC,UAAU,EAChB,8BAA8B,CAC/B;IACC,OAAO,CAAC,qBAAqB,CAAkC;IAE/D,OAAO,CAAC,KAAK,CAAiC;gBAG5C,KAAK,EAAE,KAAK,CAAC,wBAAwB,EACrC,QAAQ,EAAE,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC;IAmB1D,SAAS,CAAC,KAAK;cASC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,UAAU;IAIjF,SAAS,CAAC,kBAAkB,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,GACR,EAAE,KAAK,CAAC,sCAAsC,CAAC,YAAY,CAAC;IAI7D,iBAAiB;IAoKjB,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,0BAA0B;IAuBzE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;CAWrC"}
1
+ {"version":3,"file":"SubChannelLiveCollectionController.d.ts","sourceRoot":"","sources":["../../../../src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAE1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AA4BlF,qBAAa,kCAAmC,SAAQ,wBAAwB,CAC9E,YAAY,EACZ,KAAK,CAAC,wBAAwB,EAC9B,KAAK,CAAC,UAAU,EAChB,8BAA8B,CAC/B;IACC,OAAO,CAAC,qBAAqB,CAAkC;IAE/D,OAAO,CAAC,KAAK,CAAiC;gBAG5C,KAAK,EAAE,KAAK,CAAC,wBAAwB,EACrC,QAAQ,EAAE,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC;IAmB1D,SAAS,CAAC,KAAK;cASC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,UAAU;IAIjF,SAAS,CAAC,kBAAkB,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,GACR,EAAE,KAAK,CAAC,sCAAsC,CAAC,YAAY,CAAC;IAI7D,iBAAiB;IAkNjB,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,0BAA0B;IAuBzE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;CAWrC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/ts-sdk",
3
- "version": "6.17.1-e9b6af1.0",
3
+ "version": "6.17.2-ea577e1.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",
@@ -17,6 +17,7 @@ declare global {
17
17
  comment: Amity.CommentPayload;
18
18
  poll: Amity.PollPayload;
19
19
  stream: Amity.StreamPayload;
20
+ story: Amity.StoryPayload;
20
21
  reaction: Amity.ReactionPayload;
21
22
  };
22
23
 
@@ -71,5 +71,11 @@ declare global {
71
71
  permissions: Permission[];
72
72
  } & Amity.Timestamps &
73
73
  Amity.SoftDelete;
74
+
75
+ type PermissionChecker = {
76
+ community: (communityId: Amity.Community['communityId']) => boolean;
77
+ channel: (channelId: Amity.Channel['channelId']) => boolean;
78
+ currentUser: () => boolean;
79
+ };
74
80
  }
75
81
  }
@@ -40,6 +40,8 @@ declare global {
40
40
  ws: SocketIOClient.Socket;
41
41
  emitter: Emitter<Amity.Events>;
42
42
 
43
+ hasPermission: (permission: string) => Amity.PermissionChecker;
44
+
43
45
  sessionState: Amity.SessionStates;
44
46
  sessionHandler?: Amity.SessionHandler;
45
47
 
@@ -55,6 +55,11 @@ declare global {
55
55
  options?: Amity.StorySortOption;
56
56
  } & Amity.StoryTargetQueryParam;
57
57
 
58
+ type StoryLiveCollection = {
59
+ targets: Amity.StoryTargetQueryParam[];
60
+ options?: Amity.StorySortOption;
61
+ };
62
+
58
63
  type StoryTarget = Pick<Amity.RawStoryTarget, 'targetId' | 'targetType'> & {
59
64
  updatedAt: Amity.timestamp;
60
65
  hasUnseen: boolean;
@@ -14,7 +14,10 @@ import {
14
14
  onChannelUpdated,
15
15
  } from '../events';
16
16
  import { dropFromCache, pullFromCache } from '~/cache/api';
17
- import { onMessageCreated } from '~/messageRepository/events/onMessageCreated';
17
+ import {
18
+ onMessageCreatedLocal,
19
+ onMessageCreatedMqtt,
20
+ } from '~/messageRepository/events/onMessageCreated';
18
21
  import { onMessageUpdated } from '~/messageRepository/events/onMessageUpdated';
19
22
  import { onMessageDeleted } from '~/messageRepository/events/onMessageDeleted';
20
23
  import { onSubChannelDeleted } from '~/subChannelRepository/events/onSubChannelDeleted';
@@ -120,7 +123,32 @@ export const getChannel = (
120
123
  callback(message);
121
124
  };
122
125
 
123
- return onMessageCreated(updateMessagePreview);
126
+ return onMessageCreatedMqtt(updateMessagePreview);
127
+ },
128
+ 'channelId',
129
+ 'channel',
130
+ ),
131
+ convertEventPayload(
132
+ (callback: Amity.Listener<Amity.Message>) => {
133
+ const updateMessagePreview = async (message: Amity.Message) => {
134
+ const messagePreviewSetting = await client.getMessagePreviewSetting(false);
135
+ if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
136
+
137
+ await handleMessageCreated(message);
138
+
139
+ if (message.channelId !== channelId) return;
140
+
141
+ const channel = pullFromCache<Amity.Channel>(['channel', 'get', channelId])?.data;
142
+ if (!channel) return;
143
+
144
+ updateChannelCache(channel, {
145
+ messagePreviewId: message.messageId,
146
+ });
147
+
148
+ callback(message);
149
+ };
150
+
151
+ return onMessageCreatedLocal(updateMessagePreview);
124
152
  },
125
153
  'channelId',
126
154
  'channel',
@@ -14,7 +14,10 @@ import {
14
14
  onChannelMuted,
15
15
  onChannelUpdated,
16
16
  } from '~/channelRepository/events';
17
- import { onMessageCreated } from '~/messageRepository/events/onMessageCreated';
17
+ import {
18
+ onMessageCreatedLocal,
19
+ onMessageCreatedMqtt,
20
+ } from '~/messageRepository/events/onMessageCreated';
18
21
  import { onMessageUpdated } from '~/messageRepository/events/onMessageUpdated';
19
22
  import { onMessageDeleted } from '~/messageRepository/events/onMessageDeleted';
20
23
  import { onSubChannelUpdated } from '~/subChannelRepository/events/onSubChannelUpdated';
@@ -223,7 +226,32 @@ export class ChannelLiveCollectionController extends LiveCollectionController<
223
226
  // TODO: merge this code to another onMessageCreated in this file
224
227
  fn: convertEventPayload(
225
228
  (callback: Amity.Listener<Amity.Message>) => {
226
- return onMessageCreated(message => {
229
+ return onMessageCreatedMqtt(message => {
230
+ const cacheData = pullFromCache<Amity.Channel>([
231
+ 'channel',
232
+ 'get',
233
+ message.channelId,
234
+ ])?.data;
235
+
236
+ if (!cacheData) return;
237
+
238
+ updateChannelCache(cacheData, {
239
+ lastActivity: message.createdAt,
240
+ });
241
+
242
+ callback(message);
243
+ });
244
+ },
245
+ 'messageId',
246
+ 'channel',
247
+ ),
248
+ action: 'onUpdate',
249
+ },
250
+ {
251
+ // TODO: merge this code to another onMessageCreated in this file
252
+ fn: convertEventPayload(
253
+ (callback: Amity.Listener<Amity.Message>) => {
254
+ return onMessageCreatedLocal(message => {
227
255
  const cacheData = pullFromCache<Amity.Channel>([
228
256
  'channel',
229
257
  'get',
@@ -285,7 +313,41 @@ export class ChannelLiveCollectionController extends LiveCollectionController<
285
313
  callback(message);
286
314
  };
287
315
 
288
- return onMessageCreated(updateMessagePreview);
316
+ return onMessageCreatedMqtt(updateMessagePreview);
317
+ },
318
+
319
+ 'channelId',
320
+ 'channel',
321
+ ),
322
+ action: 'onUpdate',
323
+ },
324
+ {
325
+ fn: convertEventPayload(
326
+ (callback: Amity.Listener<Amity.Message>) => {
327
+ const updateMessagePreview = async (message: Amity.Message) => {
328
+ const messagePreviewSetting =
329
+ await ChannelLiveCollectionController.getMessagePreviewSetting();
330
+ if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
331
+
332
+ handleMessageCreated(message);
333
+
334
+ if (this.shouldAbort(message.channelId)) return;
335
+
336
+ const channel = pullFromCache<Amity.Channel>([
337
+ 'channel',
338
+ 'get',
339
+ message.channelId,
340
+ ])?.data;
341
+ if (!channel) return;
342
+
343
+ updateChannelCache(channel, {
344
+ messagePreviewId: message.messageId,
345
+ });
346
+
347
+ callback(message);
348
+ };
349
+
350
+ return onMessageCreatedLocal(updateMessagePreview);
289
351
  },
290
352
 
291
353
  'channelId',
@@ -12,9 +12,10 @@ import {
12
12
  import { createEventEmitter } from '~/core/events';
13
13
 
14
14
  import { getMessagePreviewSetting } from '~/client/utils/messagePreviewEngine';
15
+ import { getSocialSettings } from '~/client/api/getSocialSettings';
16
+ import { hasPermission } from '~/client/utils/hasPermission';
15
17
  import { getActiveClient, setActiveClient } from './activeClient';
16
18
  import { getFeedSettings } from './getFeedSettings';
17
- import { getSocialSettings } from '~/client/api/getSocialSettings';
18
19
 
19
20
  import { accessTokenExpiryWatcher } from './accessTokenExpiryWatcher';
20
21
 
@@ -96,6 +97,7 @@ export const createClient = (
96
97
  accessTokenExpiryWatcher,
97
98
  sessionHandler,
98
99
 
100
+ hasPermission,
99
101
  getFeedSettings,
100
102
  getSocialSettings,
101
103
  getMessagePreviewSetting,
@@ -1,6 +1,6 @@
1
1
  import { ASCError } from '~/core/errors';
2
2
  import { getUserMarker } from '~/marker/api';
3
- import { onUserMarkerFetched } from '~/marker/events';
3
+ import { onUserMarkerFetchedLegacy } from '~/marker/events';
4
4
  import { liveObject } from '~/utils/liveObject';
5
5
 
6
6
  import { getActiveUser } from '../api';
@@ -37,7 +37,17 @@ export const getTotalUnreadCount = (
37
37
 
38
38
  const callbackDataSelector = (data: Amity.UserMarker | undefined) => data?.unreadCount ?? 0;
39
39
 
40
- return liveObject(userId, callback, 'userId', getUserMarker, [onUserMarkerFetched], {
41
- callbackDataSelector,
42
- });
40
+ return liveObject(
41
+ userId,
42
+ callback,
43
+ 'userId',
44
+ async (): Promise<Amity.Cached<Amity.UserMarker>> => {
45
+ const { data: userMarker, cachedAt } = await getUserMarker();
46
+ return { data: userMarker as Amity.UserMarker, cachedAt };
47
+ },
48
+ [onUserMarkerFetchedLegacy],
49
+ {
50
+ callbackDataSelector,
51
+ },
52
+ );
43
53
  };
@@ -1,9 +1,13 @@
1
- import { ASCError } from '~/core/errors';
1
+ import { ASCApiError, ASCError } from '~/core/errors';
2
2
  import { getUserMarker } from '~/marker/api';
3
3
  import { onUserMarkerFetched } from '~/marker/events';
4
- import { liveObject } from '~/utils/liveObject';
5
4
 
6
- import { getActiveUser } from '../api';
5
+ import { getActiveClient, getActiveUser } from '../api';
6
+ import { createQuery, runQuery } from '~/core/query';
7
+ import {
8
+ UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
9
+ UNSYNCED_OBJECT_CACHED_AT_VALUE,
10
+ } from '~/utils/constants';
7
11
 
8
12
  /**
9
13
  *
@@ -34,14 +38,94 @@ export const getUserUnread = (
34
38
  Amity.ErrorLevel.ERROR,
35
39
  );
36
40
 
37
- const callbackDataSelector = (data: Amity.UserMarker | undefined) => {
38
- return {
39
- unreadCount: data?.unreadCount ?? 0,
40
- hasMentioned: !!data?.hasMentioned,
41
- };
41
+ const { log, cache } = getActiveClient();
42
+
43
+ if (!cache) {
44
+ console.log('For using Live Object feature you need to enable Cache!');
45
+ }
46
+
47
+ const timestamp = Date.now();
48
+ log(`liveUserUnread(tmpid: ${timestamp}) > listen`);
49
+
50
+ const disposers: Amity.Unsubscriber[] = [];
51
+
52
+ let isUnsyncedModel = false; // for messages
53
+
54
+ const dispatcher = (data: Amity.LiveObject<Amity.UserMarker>) => {
55
+ const userUnread = data.data;
56
+
57
+ callback({
58
+ data: {
59
+ hasMentioned: userUnread.hasMentioned,
60
+ unreadCount: userUnread.unreadCount,
61
+ },
62
+ loading: data.loading,
63
+ error: data.error,
64
+ });
65
+ };
66
+
67
+ const realtimeRouter = (userMarkers: Amity.UserMarker[]) => {
68
+ const filterUserMarkers = userMarkers.filter(userMarker => userId === userMarker.userId);
69
+
70
+ const latestUserMarker = filterUserMarkers.reduce((currentMaxUserMarker, userMarker) => {
71
+ if (
72
+ currentMaxUserMarker == null ||
73
+ new Date(userMarker.lastSyncAt).getTime() >
74
+ new Date(currentMaxUserMarker.lastSyncAt).getTime()
75
+ ) {
76
+ return userMarker;
77
+ }
78
+ return currentMaxUserMarker;
79
+ }, null as Amity.UserMarker | null);
80
+
81
+ dispatcher({
82
+ loading: false,
83
+ data: {
84
+ unreadCount: latestUserMarker?.unreadCount ?? 0,
85
+ hasMentioned: filterUserMarkers.some(userMarker => !!userMarker.hasMentioned),
86
+ } as Amity.UserMarker,
87
+ });
42
88
  };
43
89
 
44
- return liveObject(userId, callback, 'userId', getUserMarker, [onUserMarkerFetched], {
45
- callbackDataSelector,
46
- });
90
+ function isAmityUserMarkerData(data: unknown): data is Amity.UserMarker {
91
+ if (data == null) return false;
92
+ return (data as { data: Amity.UserMarker }).data != null;
93
+ }
94
+
95
+ const onFetch = () => {
96
+ const query = createQuery(getUserMarker);
97
+
98
+ runQuery(query, ({ error, data, loading, origin, cachedAt }) => {
99
+ if (!isAmityUserMarkerData(data)) return;
100
+ if (cachedAt === UNSYNCED_OBJECT_CACHED_AT_VALUE) {
101
+ dispatcher({
102
+ data,
103
+ origin,
104
+ loading: false,
105
+ error: new ASCApiError(
106
+ UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
107
+ Amity.ClientError.DISALOOW_UNSYNCED_OBJECT,
108
+ Amity.ErrorLevel.ERROR,
109
+ ),
110
+ });
111
+
112
+ isUnsyncedModel = true;
113
+ disposers.forEach(fn => fn());
114
+ } else if (!isUnsyncedModel) {
115
+ dispatcher({ loading, data, origin, error });
116
+ }
117
+
118
+ if (error) {
119
+ disposers.forEach(fn => fn());
120
+ }
121
+ });
122
+ };
123
+
124
+ disposers.push(onUserMarkerFetched(userMarkers => realtimeRouter(userMarkers)));
125
+
126
+ onFetch();
127
+
128
+ return () => {
129
+ disposers.forEach(fn => fn());
130
+ };
47
131
  };
@@ -0,0 +1,22 @@
1
+ import { pullFromCache } from '~/cache/api';
2
+ import { checkUserPermission } from './checkUserPermission';
3
+
4
+ export const checkChannelPermission = (
5
+ userId: Amity.User['userId'] | undefined,
6
+ permission: string,
7
+ channelId: Amity.Channel['channelId'],
8
+ ) => {
9
+ if (!userId) return false;
10
+
11
+ const member = pullFromCache<Amity.Membership<'channel'>>([
12
+ 'channelUsers',
13
+ 'get',
14
+ `${channelId}#${userId}`,
15
+ ])?.data;
16
+
17
+ if (!member) return false;
18
+
19
+ if (member.permissions.some(x => x === permission)) return true;
20
+
21
+ return checkUserPermission(userId, permission);
22
+ };
@@ -0,0 +1,22 @@
1
+ import { pullFromCache } from '~/cache/api';
2
+ import { checkUserPermission } from './checkUserPermission';
3
+
4
+ export const checkCommunityPermission = (
5
+ userId: Amity.User['userId'] | undefined,
6
+ permission: string,
7
+ communityId: Amity.Community['communityId'],
8
+ ) => {
9
+ if (!userId) return false;
10
+
11
+ const member = pullFromCache<Amity.Membership<'community'>>([
12
+ 'communityUsers',
13
+ 'get',
14
+ `${communityId}#${userId}`,
15
+ ])?.data;
16
+
17
+ if (!member) return false;
18
+
19
+ if (member.permissions.some(x => x === permission)) return true;
20
+
21
+ return checkUserPermission(userId, permission);
22
+ };
@@ -0,0 +1,12 @@
1
+ import { pullFromCache } from '~/cache/api';
2
+
3
+ export const checkUserPermission = (
4
+ userId: Amity.User['userId'] | undefined,
5
+ permission: string,
6
+ ) => {
7
+ const user = pullFromCache<Amity.User>(['users', 'get', userId])?.data;
8
+
9
+ if (!user) return false;
10
+
11
+ return user.permissions.some(x => x === permission);
12
+ };
@@ -0,0 +1,18 @@
1
+ import { getActiveClient } from '~/client/api/activeClient';
2
+ import { checkCommunityPermission } from '~/client/utils/hasPermission/checkCommunityPermission';
3
+ import { checkChannelPermission } from '~/client/utils/hasPermission/checkChannelPermission';
4
+ import { checkUserPermission } from '~/client/utils/hasPermission/checkUserPermission';
5
+
6
+ export const hasPermission = (permission: string) => {
7
+ const { userId } = getActiveClient();
8
+
9
+ return {
10
+ currentUser: () => checkUserPermission(userId, permission),
11
+
12
+ community: (communityId: Amity.Community['communityId']) =>
13
+ checkCommunityPermission(userId, permission, communityId),
14
+
15
+ channel: (channelId: Amity.Channel['channelId']) =>
16
+ checkChannelPermission(userId, permission, channelId),
17
+ };
18
+ };
@@ -0,0 +1 @@
1
+ export * from './hasPermission';