@amityco/ts-sdk 0.0.1-beta.8 → 0.0.1-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/@types/core/events.d.ts +63 -17
- package/dist/@types/core/events.d.ts.map +1 -1
- package/dist/@types/core/transport.d.ts +15 -0
- package/dist/@types/core/transport.d.ts.map +1 -1
- package/dist/@types/domains/client.d.ts +3 -0
- package/dist/@types/domains/client.d.ts.map +1 -1
- package/dist/@types/domains/comment.d.ts +1 -1
- package/dist/@types/domains/comment.d.ts.map +1 -1
- package/dist/@types/domains/community.d.ts +1 -1
- package/dist/@types/domains/community.d.ts.map +1 -1
- package/dist/@types/domains/group.d.ts +2 -2
- package/dist/@types/domains/group.d.ts.map +1 -1
- package/dist/@types/domains/partials.d.ts +3 -0
- package/dist/@types/domains/partials.d.ts.map +1 -1
- package/dist/@types/domains/post.d.ts +1 -1
- package/dist/@types/domains/post.d.ts.map +1 -1
- package/dist/@types/domains/user.d.ts +2 -1
- package/dist/@types/domains/user.d.ts.map +1 -1
- package/dist/client/api/connectClient.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts +2 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/client/api/disconnectClient.d.ts.map +1 -1
- package/dist/client/api/getToken.d.ts +3 -1
- package/dist/client/api/getToken.d.ts.map +1 -1
- package/dist/comment/api/deleteComment.d.ts +1 -0
- package/dist/comment/api/deleteComment.d.ts.map +1 -1
- package/dist/comment/events/index.d.ts +4 -0
- package/dist/comment/events/index.d.ts.map +1 -1
- package/dist/comment/events/onCommentCreated.d.ts +1 -1
- package/dist/comment/events/onCommentCreated.d.ts.map +1 -1
- package/dist/comment/events/onCommentDeleted.d.ts +1 -1
- package/dist/comment/events/onCommentDeleted.d.ts.map +1 -1
- package/dist/comment/events/onCommentFlagged.d.ts +17 -0
- package/dist/comment/events/onCommentFlagged.d.ts.map +1 -0
- package/dist/comment/events/onCommentReactionAdded.d.ts +17 -0
- package/dist/comment/events/onCommentReactionAdded.d.ts.map +1 -0
- package/dist/comment/events/onCommentReactionRemoved.d.ts +17 -0
- package/dist/comment/events/onCommentReactionRemoved.d.ts.map +1 -0
- package/dist/comment/events/onCommentUnflagged.d.ts +17 -0
- package/dist/comment/events/onCommentUnflagged.d.ts.map +1 -0
- package/dist/comment/events/onCommentUpdated.d.ts +1 -1
- package/dist/comment/events/onCommentUpdated.d.ts.map +1 -1
- package/dist/comment/events/utils.d.ts +2 -0
- package/dist/comment/events/utils.d.ts.map +1 -0
- package/dist/comment/observers/observeComment.d.ts +1 -1
- package/dist/comment/observers/observeComment.d.ts.map +1 -1
- package/dist/comment/observers/observeComments.d.ts +5 -1
- package/dist/comment/observers/observeComments.d.ts.map +1 -1
- package/dist/community/events/index.d.ts +4 -0
- package/dist/community/events/index.d.ts.map +1 -1
- package/dist/community/events/onCommunityCreated.d.ts +2 -2
- package/dist/community/events/onCommunityCreated.d.ts.map +1 -1
- package/dist/community/events/onCommunityDeleted.d.ts +2 -2
- package/dist/community/events/onCommunityDeleted.d.ts.map +1 -1
- package/dist/community/events/onCommunityJoined.d.ts +3 -3
- package/dist/community/events/onCommunityJoined.d.ts.map +1 -1
- package/dist/community/events/onCommunityLeft.d.ts +3 -3
- package/dist/community/events/onCommunityLeft.d.ts.map +1 -1
- package/dist/community/events/onCommunityUpdated.d.ts +2 -2
- package/dist/community/events/onCommunityUpdated.d.ts.map +1 -1
- package/dist/community/events/onCommunityUserAdded.d.ts +17 -0
- package/dist/community/events/onCommunityUserAdded.d.ts.map +1 -0
- package/dist/community/events/onCommunityUserBanned.d.ts +17 -0
- package/dist/community/events/onCommunityUserBanned.d.ts.map +1 -0
- package/dist/community/events/onCommunityUserRemoved.d.ts +17 -0
- package/dist/community/events/onCommunityUserRemoved.d.ts.map +1 -0
- package/dist/community/events/onCommunityUserUnbanned.d.ts +17 -0
- package/dist/community/events/onCommunityUserUnbanned.d.ts.map +1 -0
- package/dist/community/events/utils.d.ts +3 -0
- package/dist/community/events/utils.d.ts.map +1 -0
- package/dist/community/observers/observeCommunity.d.ts +1 -1
- package/dist/community/observers/observeCommunity.d.ts.map +1 -1
- package/dist/core/cache/ingest.d.ts.map +1 -1
- package/dist/core/events.d.ts +4 -2
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/model/index.d.ts +1 -0
- package/dist/core/model/index.d.ts.map +1 -1
- package/dist/core/model/isMatch.d.ts +3 -0
- package/dist/core/model/isMatch.d.ts.map +1 -0
- package/dist/core/network.d.ts +11 -0
- package/dist/core/network.d.ts.map +1 -0
- package/dist/core/subscription.d.ts +14 -0
- package/dist/core/subscription.d.ts.map +1 -0
- package/dist/core/transports/http.d.ts +11 -0
- package/dist/core/transports/http.d.ts.map +1 -0
- package/dist/core/transports/index.d.ts +4 -0
- package/dist/core/transports/index.d.ts.map +1 -0
- package/dist/core/transports/mqtt.d.ts +17 -0
- package/dist/core/transports/mqtt.d.ts.map +1 -0
- package/dist/core/transports/utils.d.ts +13 -0
- package/dist/core/transports/utils.d.ts.map +1 -0
- package/dist/core/transports/ws.d.ts +27 -0
- package/dist/core/transports/ws.d.ts.map +1 -0
- package/dist/index.cjs.js +1208 -514
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +1185 -515
- package/dist/index.umd.js +5 -3
- package/dist/post/api/deletePost.d.ts +1 -0
- package/dist/post/api/deletePost.d.ts.map +1 -1
- package/dist/post/events/index.d.ts +6 -0
- package/dist/post/events/index.d.ts.map +1 -1
- package/dist/post/events/onPostApproved.d.ts +17 -0
- package/dist/post/events/onPostApproved.d.ts.map +1 -0
- package/dist/post/events/onPostCreated.d.ts +1 -1
- package/dist/post/events/onPostCreated.d.ts.map +1 -1
- package/dist/post/events/onPostDeclined.d.ts +17 -0
- package/dist/post/events/onPostDeclined.d.ts.map +1 -0
- package/dist/post/events/onPostDeleted.d.ts +1 -1
- package/dist/post/events/onPostDeleted.d.ts.map +1 -1
- package/dist/post/events/onPostFlagged.d.ts +17 -0
- package/dist/post/events/onPostFlagged.d.ts.map +1 -0
- package/dist/post/events/onPostReactionAdded.d.ts +17 -0
- package/dist/post/events/onPostReactionAdded.d.ts.map +1 -0
- package/dist/post/events/onPostReactionRemoved.d.ts +17 -0
- package/dist/post/events/onPostReactionRemoved.d.ts.map +1 -0
- package/dist/post/events/onPostUnflagged.d.ts +17 -0
- package/dist/post/events/onPostUnflagged.d.ts.map +1 -0
- package/dist/post/events/onPostUpdated.d.ts +1 -1
- package/dist/post/events/onPostUpdated.d.ts.map +1 -1
- package/dist/post/events/utils.d.ts +2 -0
- package/dist/post/events/utils.d.ts.map +1 -0
- package/dist/post/observers/observePost.d.ts +1 -1
- package/dist/post/observers/observePost.d.ts.map +1 -1
- package/dist/post/observers/observePosts.d.ts +1 -1
- package/dist/post/observers/observePosts.d.ts.map +1 -1
- package/dist/reaction/events/onReactionAdded.d.ts +4 -2
- package/dist/reaction/events/onReactionAdded.d.ts.map +1 -1
- package/dist/reaction/events/onReactionRemoved.d.ts +4 -2
- package/dist/reaction/events/onReactionRemoved.d.ts.map +1 -1
- package/dist/reaction/utils/index.d.ts +1 -0
- package/dist/reaction/utils/index.d.ts.map +1 -1
- package/dist/reaction/utils/preparePayloadForCache.d.ts +3 -0
- package/dist/reaction/utils/preparePayloadForCache.d.ts.map +1 -0
- package/dist/report/api/createReport.d.ts.map +1 -1
- package/dist/report/api/deleteReport.d.ts.map +1 -1
- package/dist/user/events/index.d.ts +3 -0
- package/dist/user/events/index.d.ts.map +1 -1
- package/dist/user/events/onUserFlagCleared.d.ts +17 -0
- package/dist/user/events/onUserFlagCleared.d.ts.map +1 -0
- package/dist/user/events/onUserFlagged.d.ts +17 -0
- package/dist/user/events/onUserFlagged.d.ts.map +1 -0
- package/dist/user/events/onUserUnflagged.d.ts +17 -0
- package/dist/user/events/onUserUnflagged.d.ts.map +1 -0
- package/dist/user/events/onUserUpdated.d.ts +1 -1
- package/dist/user/events/onUserUpdated.d.ts.map +1 -1
- package/dist/user/events/utils.d.ts +2 -0
- package/dist/user/events/utils.d.ts.map +1 -0
- package/dist/user/observers/observeUser.d.ts +1 -1
- package/dist/user/observers/observeUser.d.ts.map +1 -1
- package/package.json +4 -1
- package/rollup.config.js +2 -2
- package/src/@types/core/events.ts +64 -23
- package/src/@types/core/transport.ts +14 -0
- package/src/@types/domains/client.ts +3 -0
- package/src/@types/domains/comment.ts +1 -0
- package/src/@types/domains/community.ts +1 -0
- package/src/@types/domains/group.ts +2 -2
- package/src/@types/domains/partials.ts +4 -0
- package/src/@types/domains/post.ts +1 -0
- package/src/@types/domains/user.ts +2 -0
- package/src/client/api/connectClient.ts +12 -2
- package/src/client/api/createClient.ts +7 -7
- package/src/client/api/disconnectClient.ts +5 -0
- package/src/client/api/getToken.ts +1 -1
- package/src/client/events/onConnectionError.ts +1 -1
- package/src/comment/api/createComment.ts +2 -2
- package/src/comment/api/deleteComment.ts +2 -2
- package/src/comment/api/updateComment.ts +1 -1
- package/src/comment/events/index.ts +6 -0
- package/src/comment/events/onCommentCreated.ts +4 -22
- package/src/comment/events/onCommentDeleted.ts +4 -22
- package/src/comment/events/onCommentFlagged.ts +21 -0
- package/src/comment/events/onCommentReactionAdded.ts +52 -0
- package/src/comment/events/onCommentReactionRemoved.ts +52 -0
- package/src/comment/events/onCommentUnflagged.ts +21 -0
- package/src/comment/events/onCommentUpdated.ts +4 -22
- package/src/comment/events/utils.ts +34 -0
- package/src/comment/observers/observeComment.ts +21 -7
- package/src/comment/observers/observeComments.ts +11 -3
- package/src/community/api/addCommunityMembers.ts +1 -1
- package/src/community/api/createCommunity.ts +1 -1
- package/src/community/api/deleteCommunity.ts +1 -1
- package/src/community/api/joinCommunity.ts +1 -1
- package/src/community/api/leaveCommunity.ts +1 -1
- package/src/community/api/removeCommunityMembers.ts +1 -1
- package/src/community/api/updateCommunity.ts +1 -1
- package/src/community/events/index.ts +5 -0
- package/src/community/events/onCommunityCreated.ts +5 -23
- package/src/community/events/onCommunityDeleted.ts +5 -23
- package/src/community/events/onCommunityJoined.ts +5 -23
- package/src/community/events/onCommunityLeft.ts +5 -23
- package/src/community/events/onCommunityUpdated.ts +5 -23
- package/src/community/events/onCommunityUserAdded.ts +19 -0
- package/src/community/events/onCommunityUserBanned.ts +19 -0
- package/src/community/events/onCommunityUserRemoved.ts +19 -0
- package/src/community/events/onCommunityUserUnbanned.ts +19 -0
- package/src/community/events/utils.ts +108 -0
- package/src/community/observers/observeCommunity.ts +23 -9
- package/src/core/cache/ingest.ts +19 -3
- package/src/core/events.ts +45 -4
- package/src/core/model/index.ts +1 -0
- package/src/core/model/isMatch.ts +12 -0
- package/src/core/network.ts +14 -0
- package/src/core/subscription.ts +75 -0
- package/src/core/transports/http.ts +63 -0
- package/src/core/transports/index.ts +3 -0
- package/src/core/transports/mqtt.ts +141 -0
- package/src/core/transports/utils.ts +25 -0
- package/src/core/transports/ws.ts +61 -0
- package/src/index.ts +1 -0
- package/src/post/api/createPost.ts +2 -2
- package/src/post/api/deletePost.ts +2 -2
- package/src/post/api/updatePost.ts +1 -1
- package/src/post/events/index.ts +9 -0
- package/src/post/events/onPostApproved.ts +19 -0
- package/src/post/events/onPostCreated.ts +4 -24
- package/src/post/events/onPostDeclined.ts +19 -0
- package/src/post/events/onPostDeleted.ts +4 -24
- package/src/post/events/onPostFlagged.ts +19 -0
- package/src/post/events/onPostReactionAdded.ts +50 -0
- package/src/post/events/onPostReactionRemoved.ts +50 -0
- package/src/post/events/onPostUnflagged.ts +19 -0
- package/src/post/events/onPostUpdated.ts +4 -24
- package/src/post/events/utils.ts +40 -0
- package/src/post/observers/observePost.ts +25 -7
- package/src/post/observers/observePosts.ts +12 -2
- package/src/reaction/events/onReactionAdded.ts +36 -15
- package/src/reaction/events/onReactionRemoved.ts +37 -14
- package/src/reaction/utils/dispatchReactable.ts +2 -2
- package/src/reaction/utils/index.ts +1 -0
- package/src/reaction/utils/preparePayloadForCache.ts +45 -0
- package/src/report/api/createReport.ts +5 -1
- package/src/report/api/deleteReport.ts +5 -1
- package/src/user/events/index.ts +4 -0
- package/src/user/events/onUserFlagCleared.ts +19 -0
- package/src/user/events/onUserFlagged.ts +19 -0
- package/src/user/events/onUserUnflagged.ts +19 -0
- package/src/user/events/onUserUpdated.ts +4 -24
- package/src/user/events/utils.ts +24 -0
- package/src/user/observers/observeUser.ts +11 -3
- package/dist/core/transports.d.ts +0 -49
- package/dist/core/transports.d.ts.map +0 -1
- package/src/core/transports.ts +0 -151
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createPostEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onPostFlagged } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onPostFlagged(post => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a {@link Amity.Post} has been flagged
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category Post Events
|
|
17
|
+
*/
|
|
18
|
+
export const onPostFlagged = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
|
|
19
|
+
createPostEventSubscriber('post.flagged', callback)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api'
|
|
2
|
+
import { decoratePayload } from '~/core/query'
|
|
3
|
+
import { ingestInCache, pullFromCache } from '~/core/cache'
|
|
4
|
+
import { createEventSubscriber } from '~/core/events'
|
|
5
|
+
import { preparePayloadForCache } from '~/reaction/utils'
|
|
6
|
+
import { isMatch } from '~/core/model'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ```js
|
|
10
|
+
* import { onPostReactionAdded } from '@amityco/ts-sdk'
|
|
11
|
+
* const dispose = onPostReactionAdded(post => {
|
|
12
|
+
* // ...
|
|
13
|
+
* })
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Fired when a {@link Amity.Post} has been reacted
|
|
17
|
+
*
|
|
18
|
+
* @param callback The function to call when the event was fired
|
|
19
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
20
|
+
*
|
|
21
|
+
* @category Post Events
|
|
22
|
+
*/
|
|
23
|
+
export const onPostReactionAdded = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber => {
|
|
24
|
+
const client = getActiveClient()
|
|
25
|
+
|
|
26
|
+
const filter = (payload: Amity.Events['post.addReaction']) => {
|
|
27
|
+
const [cached] = pullFromCache('post', payload.posts[0].postId) ?? []
|
|
28
|
+
|
|
29
|
+
const { reactor, ...postPayload } = payload;
|
|
30
|
+
|
|
31
|
+
decoratePayload(postPayload as Amity.PostPayload)
|
|
32
|
+
preparePayloadForCache('post.addReaction', payload)
|
|
33
|
+
ingestInCache(postPayload as Amity.PostPayload)
|
|
34
|
+
|
|
35
|
+
const [post] = pullFromCache('post', payload.posts[0].postId) ?? []
|
|
36
|
+
|
|
37
|
+
if (cached && isMatch(cached, post)) {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
callback(post)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return createEventSubscriber(
|
|
45
|
+
client,
|
|
46
|
+
'post.addReaction',
|
|
47
|
+
'post.addReaction',
|
|
48
|
+
filter
|
|
49
|
+
)
|
|
50
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api'
|
|
2
|
+
import { decoratePayload } from '~/core/query'
|
|
3
|
+
import { ingestInCache, pullFromCache } from '~/core/cache'
|
|
4
|
+
import { createEventSubscriber } from '~/core/events'
|
|
5
|
+
import { preparePayloadForCache } from '~/reaction/utils/preparePayloadForCache'
|
|
6
|
+
import { isMatch } from '~/core/model'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ```js
|
|
10
|
+
* import { onPostReactionRemoved } from '@amityco/ts-sdk'
|
|
11
|
+
* const dispose = onPostReactionRemoved(post => {
|
|
12
|
+
* // ...
|
|
13
|
+
* })
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Fired when a reaction has been removed from a {@link Amity.Post}
|
|
17
|
+
*
|
|
18
|
+
* @param callback The function to call when the event was fired
|
|
19
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
20
|
+
*
|
|
21
|
+
* @category Post Events
|
|
22
|
+
*/
|
|
23
|
+
export const onPostReactionRemoved = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber => {
|
|
24
|
+
const client = getActiveClient()
|
|
25
|
+
|
|
26
|
+
const filter = (payload: Amity.Events['post.removeReaction']) => {
|
|
27
|
+
const [cached] = pullFromCache('post', payload.posts[0].postId) ?? []
|
|
28
|
+
|
|
29
|
+
const { reactor, ...postPayload } = payload;
|
|
30
|
+
|
|
31
|
+
decoratePayload(postPayload as Amity.PostPayload)
|
|
32
|
+
preparePayloadForCache('post.removeReaction', payload)
|
|
33
|
+
ingestInCache(postPayload as Amity.PostPayload)
|
|
34
|
+
|
|
35
|
+
const [post] = pullFromCache('post', payload.posts[0].postId) ?? []
|
|
36
|
+
|
|
37
|
+
if (cached && isMatch(cached, post)) {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
callback(post)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return createEventSubscriber(
|
|
45
|
+
client,
|
|
46
|
+
'post.removeReaction',
|
|
47
|
+
'post.removeReaction',
|
|
48
|
+
filter
|
|
49
|
+
)
|
|
50
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createPostEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onPostUnflagged } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onPostUnflagged(post => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a flag has been removed from a {@link Amity.Post}
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category Post Events
|
|
17
|
+
*/
|
|
18
|
+
export const onPostUnflagged = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
|
|
19
|
+
createPostEventSubscriber('post.unflagged', callback)
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createEventSubscriber } from '~/core/events'
|
|
3
|
-
|
|
4
|
-
import { decoratePayload } from '~/core/query'
|
|
5
|
-
import { ingestInCache } from '~/core/cache'
|
|
1
|
+
import { createPostEventSubscriber } from './utils'
|
|
6
2
|
|
|
7
3
|
/**
|
|
8
4
|
* ```js
|
|
@@ -12,28 +8,12 @@ import { ingestInCache } from '~/core/cache'
|
|
|
12
8
|
* })
|
|
13
9
|
* ```
|
|
14
10
|
*
|
|
15
|
-
* Fired when
|
|
11
|
+
* Fired when a {@link Amity.Post} has been updated
|
|
16
12
|
*
|
|
17
13
|
* @param callback The function to call when the event was fired
|
|
18
14
|
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
19
15
|
*
|
|
20
16
|
* @category Post Events
|
|
21
17
|
*/
|
|
22
|
-
export const onPostUpdated = (
|
|
23
|
-
callback
|
|
24
|
-
): Amity.Unsubscriber => {
|
|
25
|
-
const client = getActiveClient()
|
|
26
|
-
|
|
27
|
-
const filter = (payload: Amity.PostPayload) => {
|
|
28
|
-
decoratePayload(payload)
|
|
29
|
-
ingestInCache(payload)
|
|
30
|
-
callback(payload.posts[0])
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return createEventSubscriber(
|
|
34
|
-
client,
|
|
35
|
-
'message/onPostUpdated',
|
|
36
|
-
'v3.post.didUpdate',
|
|
37
|
-
filter
|
|
38
|
-
)
|
|
39
|
-
}
|
|
18
|
+
export const onPostUpdated = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
|
|
19
|
+
createPostEventSubscriber('post.updated', callback)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getActiveClient } from '~/client/api'
|
|
2
|
+
import { decoratePayload } from '~/core/query'
|
|
3
|
+
import { ingestInCache, pullFromCache } from '~/core/cache'
|
|
4
|
+
import { createEventSubscriber, fireEvent } from '~/core/events'
|
|
5
|
+
import { isMatch } from '~/core/model'
|
|
6
|
+
|
|
7
|
+
export const createPostEventSubscriber = (
|
|
8
|
+
event: keyof Amity.MqttPostMessageEvents,
|
|
9
|
+
callback: Amity.Listener<Amity.Post>
|
|
10
|
+
) => {
|
|
11
|
+
const client = getActiveClient()
|
|
12
|
+
|
|
13
|
+
const filter = (payload: Amity.PostPayload) => {
|
|
14
|
+
const [cached] = pullFromCache('post', payload.posts[0].postId) ?? []
|
|
15
|
+
|
|
16
|
+
const { communities, ...others } = payload
|
|
17
|
+
|
|
18
|
+
decoratePayload(others as Amity.PostPayload)
|
|
19
|
+
ingestInCache(others as Amity.PostPayload)
|
|
20
|
+
|
|
21
|
+
if (communities?.[0]) {
|
|
22
|
+
fireEvent('community.updated', { communities })
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const [post] = pullFromCache('post', others.posts[0].postId) ?? []
|
|
26
|
+
|
|
27
|
+
if (cached && isMatch(cached, post)) {
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
callback(post)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return createEventSubscriber(
|
|
35
|
+
client,
|
|
36
|
+
event,
|
|
37
|
+
event,
|
|
38
|
+
filter
|
|
39
|
+
)
|
|
40
|
+
}
|
|
@@ -7,6 +7,12 @@ import { getPost } from '../api'
|
|
|
7
7
|
import {
|
|
8
8
|
onPostUpdated,
|
|
9
9
|
onPostDeleted,
|
|
10
|
+
onPostApproved,
|
|
11
|
+
onPostDeclined,
|
|
12
|
+
onPostFlagged,
|
|
13
|
+
onPostUnflagged,
|
|
14
|
+
onPostReactionAdded,
|
|
15
|
+
onPostReactionRemoved,
|
|
10
16
|
} from '../events'
|
|
11
17
|
|
|
12
18
|
/**
|
|
@@ -25,7 +31,7 @@ import {
|
|
|
25
31
|
*
|
|
26
32
|
* @category Post Observer
|
|
27
33
|
*/
|
|
28
|
-
export const observePost = <Events extends ['onFetch', 'onUpdate', 'onDelete']>(
|
|
34
|
+
export const observePost = <Events extends ['onFetch', 'onUpdate', 'onDelete', 'onApproved', 'onDeclined', 'onFlagged', 'onUnflagged', 'onReactionAdded', 'onReactionRemoved']>(
|
|
29
35
|
postId: string,
|
|
30
36
|
callback: Amity.ObjectListener<Amity.QueryResult<Amity.Post>, Events>,
|
|
31
37
|
policy: Amity.QueryPolicy = 'cache_then_server',
|
|
@@ -40,9 +46,6 @@ export const observePost = <Events extends ['onFetch', 'onUpdate', 'onDelete']>(
|
|
|
40
46
|
result: Amity.QueryResult<Amity.Post>,
|
|
41
47
|
action: Events[number]
|
|
42
48
|
) => {
|
|
43
|
-
// filter function
|
|
44
|
-
if (result.data?.postId !== postId) return
|
|
45
|
-
|
|
46
49
|
if (callback instanceof Function)
|
|
47
50
|
return callback(result)
|
|
48
51
|
|
|
@@ -52,16 +55,31 @@ export const observePost = <Events extends ['onFetch', 'onUpdate', 'onDelete']>(
|
|
|
52
55
|
callback[action]?.(result)
|
|
53
56
|
}
|
|
54
57
|
|
|
58
|
+
const realtimeRouter = (
|
|
59
|
+
result: Amity.QueryResult<Amity.Post>,
|
|
60
|
+
action: Events[number]
|
|
61
|
+
) => {
|
|
62
|
+
if (result.data?.postId !== postId) return
|
|
63
|
+
|
|
64
|
+
router(result, action)
|
|
65
|
+
}
|
|
66
|
+
|
|
55
67
|
const disposers: Amity.Unsubscriber[] = []
|
|
56
68
|
|
|
57
69
|
disposers.push(
|
|
58
|
-
onPostUpdated(data =>
|
|
59
|
-
onPostDeleted(data =>
|
|
70
|
+
onPostUpdated(data => realtimeRouter({ data }, 'onUpdate')),
|
|
71
|
+
onPostDeleted(data => realtimeRouter({ data }, 'onDelete')),
|
|
72
|
+
onPostApproved(data => realtimeRouter({ data }, 'onApproved')),
|
|
73
|
+
onPostDeclined(data => realtimeRouter({ data }, 'onDeclined')),
|
|
74
|
+
onPostFlagged(data => realtimeRouter({ data }, 'onFlagged')),
|
|
75
|
+
onPostUnflagged(data => realtimeRouter({ data }, 'onUnflagged')),
|
|
76
|
+
onPostReactionAdded(data => realtimeRouter({ data }, 'onReactionAdded')),
|
|
77
|
+
onPostReactionRemoved(data => realtimeRouter({ data }, 'onReactionRemoved')),
|
|
60
78
|
)
|
|
61
79
|
|
|
62
80
|
runQuery(
|
|
63
81
|
createQuery(getPost, postId),
|
|
64
|
-
(result) =>
|
|
82
|
+
(result) => router(result, 'onFetch'),
|
|
65
83
|
queryOptions(policy),
|
|
66
84
|
)
|
|
67
85
|
|
|
@@ -4,6 +4,10 @@ import {
|
|
|
4
4
|
onPostCreated,
|
|
5
5
|
onPostUpdated,
|
|
6
6
|
onPostDeleted,
|
|
7
|
+
onPostApproved,
|
|
8
|
+
onPostDeclined,
|
|
9
|
+
onPostFlagged,
|
|
10
|
+
onPostUnflagged, onPostReactionAdded, onPostReactionRemoved
|
|
7
11
|
} from '../events'
|
|
8
12
|
|
|
9
13
|
/**
|
|
@@ -30,7 +34,7 @@ export const observePosts = (params: {
|
|
|
30
34
|
targetType: Amity.PostTargetType,
|
|
31
35
|
targetId: Amity.Post['targetId'],
|
|
32
36
|
},
|
|
33
|
-
callback: Amity.ObjectListener<Amity.Post, ['onCreate', 'onUpdate', 'onDelete']>
|
|
37
|
+
callback: Amity.ObjectListener<Amity.Post, ['onCreate', 'onUpdate', 'onDelete', 'onApproved', 'onDeclined', 'onFlagged', 'onUnflagged', 'onReactionAdded', 'onReactionRemoved']>
|
|
34
38
|
): Amity.Unsubscriber => {
|
|
35
39
|
const { log } = getActiveClient()
|
|
36
40
|
|
|
@@ -41,7 +45,7 @@ export const observePosts = (params: {
|
|
|
41
45
|
|
|
42
46
|
const router = (
|
|
43
47
|
post: Amity.Post,
|
|
44
|
-
action: 'onCreate' | 'onUpdate' | 'onDelete'
|
|
48
|
+
action: 'onCreate' | 'onUpdate' | 'onDelete' | 'onApproved' | 'onDeclined' | 'onFlagged' | 'onUnflagged' | 'onReactionAdded' | 'onReactionRemoved'
|
|
45
49
|
) => {
|
|
46
50
|
if (params.targetId !== post.targetId
|
|
47
51
|
|| params.targetType !== post.targetType)
|
|
@@ -57,6 +61,12 @@ export const observePosts = (params: {
|
|
|
57
61
|
onPostCreated(post => router(post, 'onCreate')),
|
|
58
62
|
onPostUpdated(post => router(post, 'onUpdate')),
|
|
59
63
|
onPostDeleted(post => router(post, 'onDelete')),
|
|
64
|
+
onPostApproved(post => router(post, 'onApproved')),
|
|
65
|
+
onPostDeclined(post => router(post, 'onDeclined')),
|
|
66
|
+
onPostFlagged(post => router(post, 'onFlagged')),
|
|
67
|
+
onPostUnflagged(post => router(post, 'onUnflagged')),
|
|
68
|
+
onPostReactionAdded(post => router(post, 'onReactionAdded')),
|
|
69
|
+
onPostReactionRemoved(post => router(post, 'onReactionRemoved')),
|
|
60
70
|
)
|
|
61
71
|
|
|
62
72
|
return () => {
|
|
@@ -1,43 +1,64 @@
|
|
|
1
1
|
import { getActiveClient } from '~/client/api'
|
|
2
|
-
import { ingestInCache } from '~/core/cache'
|
|
2
|
+
import { ingestInCache, pullFromCache } from '~/core/cache'
|
|
3
3
|
import { createEventSubscriber } from '~/core/events'
|
|
4
|
+
import { getResolver } from '~/core/model'
|
|
4
5
|
import { decoratePayload } from '~/core/query'
|
|
6
|
+
import { onPostReactionAdded } from '~/post/events'
|
|
7
|
+
import { onCommentReactionAdded } from '~/comment/events'
|
|
5
8
|
|
|
6
9
|
/**
|
|
7
10
|
* ```js
|
|
8
11
|
* import { onReactionAdded } from '@amityco/ts-sdk'
|
|
9
|
-
* const dispose = onReactionAdded(
|
|
12
|
+
* const dispose = onReactionAdded('post', postId, post => {
|
|
10
13
|
* // ...
|
|
11
14
|
* })
|
|
12
15
|
* ```
|
|
13
16
|
*
|
|
14
17
|
* Fired when an {@link Amity.Reaction} has been added
|
|
15
18
|
*
|
|
19
|
+
* @param {@link Amity.ReactableType} referenceType
|
|
20
|
+
* @param {string} referenceId
|
|
16
21
|
* @param callback The function to call when the event was fired
|
|
17
22
|
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
18
23
|
*
|
|
19
24
|
* @category Message Events
|
|
20
25
|
**/
|
|
21
26
|
export const onReactionAdded = (
|
|
22
|
-
referenceType: Amity.
|
|
27
|
+
referenceType: Amity.ReactableType,
|
|
23
28
|
referenceId: Amity.Reaction['referenceId'],
|
|
24
29
|
callback: Amity.Listener<Amity.Model[typeof referenceType]>
|
|
25
30
|
): Amity.Unsubscriber => {
|
|
26
|
-
const
|
|
31
|
+
const callbackWrapper = (model: Amity.Model[typeof referenceType]) => {
|
|
32
|
+
if (getResolver(referenceType)(model) === referenceId) {
|
|
33
|
+
callback(model)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (referenceType === 'message') {
|
|
38
|
+
const client = getActiveClient()
|
|
27
39
|
|
|
28
|
-
|
|
40
|
+
const filter = (payload: Amity.MessagePayload) => {
|
|
41
|
+
const reactionsCountInCache = (pullFromCache('message', payload.messages[0].messageId) ?? [])[0]?.reactionsCount
|
|
42
|
+
const isReactionEvent = reactionsCountInCache !== payload.messages[0].reactionsCount
|
|
29
43
|
|
|
30
|
-
|
|
31
|
-
|
|
44
|
+
decoratePayload(payload)
|
|
45
|
+
ingestInCache(payload)
|
|
46
|
+
if (isReactionEvent) {
|
|
47
|
+
callbackWrapper(payload.messages[0])
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return createEventSubscriber(
|
|
52
|
+
client,
|
|
53
|
+
'reaction/onReactionAdded',
|
|
54
|
+
'v3.message.didUpdate',
|
|
55
|
+
filter
|
|
56
|
+
)
|
|
57
|
+
}
|
|
32
58
|
|
|
33
|
-
|
|
34
|
-
|
|
59
|
+
if (referenceType === 'post') {
|
|
60
|
+
return onPostReactionAdded(callbackWrapper)
|
|
35
61
|
}
|
|
36
62
|
|
|
37
|
-
return
|
|
38
|
-
client,
|
|
39
|
-
'reaction/onReactionAdded',
|
|
40
|
-
event,
|
|
41
|
-
filter
|
|
42
|
-
)
|
|
63
|
+
return onCommentReactionAdded(callbackWrapper)
|
|
43
64
|
}
|
|
@@ -1,41 +1,64 @@
|
|
|
1
1
|
import { getActiveClient } from '~/client/api'
|
|
2
|
-
import { ingestInCache } from '~/core/cache'
|
|
2
|
+
import { ingestInCache, pullFromCache } from '~/core/cache'
|
|
3
3
|
import { createEventSubscriber } from '~/core/events'
|
|
4
|
+
import { getResolver } from '~/core/model'
|
|
4
5
|
import { decoratePayload } from '~/core/query'
|
|
6
|
+
import { onPostReactionRemoved } from '~/post/events'
|
|
7
|
+
import { onCommentReactionRemoved } from '~/comment/events'
|
|
5
8
|
|
|
6
9
|
/**
|
|
7
10
|
* ```js
|
|
8
11
|
* import { onReactionRemoved } from '@amityco/ts-sdk'
|
|
9
|
-
* const dispose = onReactionRemoved(
|
|
12
|
+
* const dispose = onReactionRemoved('post', postId, post => {
|
|
10
13
|
* // ...
|
|
11
14
|
* })
|
|
12
15
|
* ```
|
|
13
16
|
*
|
|
14
17
|
* Fired when an {@link Amity.Reaction} has been removed
|
|
15
18
|
*
|
|
19
|
+
* @param {@link Amity.ReactableType} referenceType
|
|
20
|
+
* @param {string} referenceId
|
|
16
21
|
* @param callback The function to call when the event was fired
|
|
17
22
|
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
18
23
|
*
|
|
19
24
|
* @category Message Events
|
|
20
25
|
**/
|
|
21
26
|
export const onReactionRemoved = (
|
|
22
|
-
referenceType: Amity.
|
|
27
|
+
referenceType: Amity.ReactableType,
|
|
23
28
|
referenceId: Amity.Reaction['referenceId'],
|
|
24
29
|
callback: Amity.Listener<Amity.Model[typeof referenceType]>
|
|
25
30
|
): Amity.Unsubscriber => {
|
|
26
|
-
const
|
|
31
|
+
const callbackWrapper = (model: Amity.Model[typeof referenceType]) => {
|
|
32
|
+
if (getResolver(referenceType)(model) === referenceId) {
|
|
33
|
+
callback(model)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (referenceType === 'message') {
|
|
38
|
+
const client = getActiveClient()
|
|
39
|
+
|
|
40
|
+
const filter = (payload: Amity.MessagePayload) => {
|
|
41
|
+
const reactionsCountInCache = (pullFromCache('message', payload.messages[0].messageId) ?? [])[0]?.reactionsCount
|
|
42
|
+
const isReactionEvent = reactionsCountInCache !== payload.messages[0].reactionsCount
|
|
27
43
|
|
|
28
|
-
|
|
29
|
-
|
|
44
|
+
decoratePayload(payload)
|
|
45
|
+
ingestInCache(payload)
|
|
46
|
+
if (isReactionEvent) {
|
|
47
|
+
callbackWrapper(payload.messages[0])
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return createEventSubscriber(
|
|
52
|
+
client,
|
|
53
|
+
'reaction/onReactionRemoved',
|
|
54
|
+
'v3.message.didUpdate',
|
|
55
|
+
filter
|
|
56
|
+
)
|
|
57
|
+
}
|
|
30
58
|
|
|
31
|
-
|
|
32
|
-
|
|
59
|
+
if (referenceType === 'post') {
|
|
60
|
+
return onPostReactionRemoved(callbackWrapper)
|
|
33
61
|
}
|
|
34
62
|
|
|
35
|
-
return
|
|
36
|
-
client,
|
|
37
|
-
'reaction/onReactionRemoved',
|
|
38
|
-
'v3.message.didUpdate',
|
|
39
|
-
filter
|
|
40
|
-
)
|
|
63
|
+
return onCommentReactionRemoved(callbackWrapper)
|
|
41
64
|
}
|
|
@@ -12,8 +12,8 @@ export const dispatchReactable = <T extends Amity.ReactableType>(
|
|
|
12
12
|
fireEvent('v3.message.didUpdate', { messages: [model] })
|
|
13
13
|
else if (referenceType === 'post')
|
|
14
14
|
// @ts-ignore: refactor later
|
|
15
|
-
fireEvent('
|
|
15
|
+
fireEvent('post.updated', { posts: [model] })
|
|
16
16
|
else if (referenceType === 'comment')
|
|
17
17
|
// @ts-ignore: refactor later
|
|
18
|
-
fireEvent('
|
|
18
|
+
fireEvent('comment.updated', { comments: [model] })
|
|
19
19
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { pullFromCache } from '~/core/cache'
|
|
2
|
+
import { getActiveClient } from '~/client/api'
|
|
3
|
+
|
|
4
|
+
/** @hidden */
|
|
5
|
+
export const preparePayloadForCache = <T extends 'post.addReaction' | 'post.removeReaction' | 'comment.addReaction' | 'comment.removeReaction'>(
|
|
6
|
+
event: T,
|
|
7
|
+
payload: Amity.Events[T],
|
|
8
|
+
) => {
|
|
9
|
+
const client = getActiveClient()
|
|
10
|
+
|
|
11
|
+
if (client.userId !== payload.reactor.userId) {
|
|
12
|
+
return
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let model: Amity.Reactable
|
|
16
|
+
let cached: Amity.Reactable
|
|
17
|
+
|
|
18
|
+
if (event === 'post.addReaction' || event === 'post.removeReaction') {
|
|
19
|
+
const post = (payload as Amity.Events['post.addReaction']).posts[0]
|
|
20
|
+
cached = (pullFromCache('post', post.postId) ?? [])[0]
|
|
21
|
+
model = post
|
|
22
|
+
} else {
|
|
23
|
+
const comment = (payload as Amity.Events['comment.addReaction']).comments[0]
|
|
24
|
+
cached = (pullFromCache('comment', comment.commentId) ?? [])[0]
|
|
25
|
+
model = comment
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!cached || !cached.myReactions) {
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (event === 'post.addReaction' || event === 'comment.addReaction') {
|
|
33
|
+
if (cached.myReactions.includes(payload.reactor.reactionName)) {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
Object.assign(model, { myReactions: [...cached.myReactions, payload.reactor.reactionName] })
|
|
38
|
+
} else {
|
|
39
|
+
if (!cached.myReactions.includes(payload.reactor.reactionName)) {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
Object.assign(model, { myReactions: cached.myReactions.filter(x => x !== payload.reactor.reactionName) })
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -32,9 +32,13 @@ export const createReport = async (
|
|
|
32
32
|
`/api/v3/${domainName}/${referenceId}/flag`
|
|
33
33
|
)
|
|
34
34
|
|
|
35
|
+
const event = referenceType === 'message'
|
|
36
|
+
? 'v3.message.didUpdate' as const
|
|
37
|
+
: `${referenceType}.updated` as const
|
|
38
|
+
|
|
35
39
|
decoratePayload(data)
|
|
36
40
|
ingestInCache(data)
|
|
37
|
-
fireEvent(
|
|
41
|
+
fireEvent(event, data)
|
|
38
42
|
|
|
39
43
|
return !!data
|
|
40
44
|
}
|
|
@@ -32,9 +32,13 @@ export const deleteReport = async (
|
|
|
32
32
|
`/api/v3/${domainName}/${referenceId}/unflag`
|
|
33
33
|
)
|
|
34
34
|
|
|
35
|
+
const event = referenceType === 'message'
|
|
36
|
+
? 'v3.message.didUpdate' as const
|
|
37
|
+
: `${referenceType}.updated` as const
|
|
38
|
+
|
|
35
39
|
decoratePayload(data)
|
|
36
40
|
ingestInCache(data)
|
|
37
|
-
fireEvent(
|
|
41
|
+
fireEvent(event, data)
|
|
38
42
|
|
|
39
43
|
return !!data
|
|
40
44
|
}
|
package/src/user/events/index.ts
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createUserEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onUserFlagCleared } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onUserFlagCleared(user => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when flags have been cleared for a {@link Amity.User}
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category User Events
|
|
17
|
+
*/
|
|
18
|
+
export const onUserFlagCleared = (callback: Amity.Listener<Amity.User>) =>
|
|
19
|
+
createUserEventSubscriber('user.flagCleared', callback)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createUserEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onUserFlagged } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onUserFlagged(user => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a {@link Amity.User} has been flagged
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category User Events
|
|
17
|
+
*/
|
|
18
|
+
export const onUserFlagged = (callback: Amity.Listener<Amity.User>) =>
|
|
19
|
+
createUserEventSubscriber('user.flagged', callback)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createUserEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onUserUnflagged } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onUserUnflagged(user => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a flag has been removed from a {@link Amity.User}
|
|
12
|
+
*
|
|
13
|
+
* @param callback The function to call when the event was fired
|
|
14
|
+
* @returns an {@link Amity.Unsubscriber} function to stop listening
|
|
15
|
+
*
|
|
16
|
+
* @category User Events
|
|
17
|
+
*/
|
|
18
|
+
export const onUserUnflagged = (callback: Amity.Listener<Amity.User>) =>
|
|
19
|
+
createUserEventSubscriber('user.unflagged', callback)
|