@amityco/ts-sdk 0.0.1-beta.5 → 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 +4 -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 +37 -1
- package/dist/comment/api/deleteComment.d.ts.map +1 -1
- package/dist/comment/api/getComment.d.ts.map +1 -1
- package/dist/comment/api/queryComments.d.ts +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/query/paging.d.ts.map +1 -1
- 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/feed/api/queryGlobalFeed.d.ts +1 -1
- package/dist/file/api/deleteFile.d.ts +3 -1
- package/dist/file/api/deleteFile.d.ts.map +1 -1
- package/dist/index.cjs.js +1292 -526
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +1268 -527
- package/dist/index.umd.js +19 -5144
- package/dist/post/api/deletePost.d.ts +40 -1
- package/dist/post/api/deletePost.d.ts.map +1 -1
- package/dist/post/api/getPost.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/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +7 -2
- package/rollup.config.js +63 -23
- package/src/@types/core/events.ts +64 -23
- package/src/@types/core/transport.ts +14 -0
- package/src/@types/domains/client.ts +5 -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 +23 -15
- package/src/client/api/disconnectClient.ts +5 -0
- package/src/client/api/getToken.ts +3 -2
- package/src/client/events/onConnectionError.ts +1 -1
- package/src/comment/api/createComment.ts +2 -2
- package/src/comment/api/deleteComment.ts +25 -5
- package/src/comment/api/getComment.ts +17 -5
- package/src/comment/api/queryComments.ts +9 -8
- 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/query/paging.ts +4 -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/feed/api/queryGlobalFeed.ts +1 -1
- package/src/file/api/deleteFile.ts +5 -6
- package/src/index.ts +3 -0
- package/src/post/api/createPost.ts +2 -2
- package/src/post/api/deletePost.ts +29 -8
- package/src/post/api/getPost.ts +17 -5
- 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/src/version.ts +2 -0
- package/tsconfig.json +1 -0
- 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,141 @@
|
|
|
1
|
+
import mqtt, { MqttClient, IClientOptions, ISubscriptionGrant } from 'mqtt'
|
|
2
|
+
import { ASCError, ASCUnknownError } from '~/core/errors'
|
|
3
|
+
|
|
4
|
+
const QOS_FAILURE_CODE = 128
|
|
5
|
+
|
|
6
|
+
const RETRY_BASE_TIMEOUT = 1000;
|
|
7
|
+
const RETRY_COUNT_MAX = 10;
|
|
8
|
+
|
|
9
|
+
const enum MqttError {
|
|
10
|
+
IDENTIFIER_REJECTED = 2,
|
|
11
|
+
BAD_USERNAME_OR_PASSWORD = 4,
|
|
12
|
+
NOT_AUTHORIZED = 5,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getMqttOptions(params: { username: string, password: string, clientId?: string }): IClientOptions {
|
|
16
|
+
return {
|
|
17
|
+
clean: false, // keep subscriptions
|
|
18
|
+
clientId: `mqttjs_ + ${Math.random().toString(16).substr(2, 8)}`,
|
|
19
|
+
protocolId: 'MQTT',
|
|
20
|
+
protocolVersion: 4,
|
|
21
|
+
reconnectPeriod: 0, // disable auto reconnect
|
|
22
|
+
will: {
|
|
23
|
+
topic: 'WillMsg',
|
|
24
|
+
payload: 'Connection Closed abnormally..!',
|
|
25
|
+
qos: 0,
|
|
26
|
+
retain: false
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
...params
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Creates a pre-configured socket.io instance
|
|
35
|
+
*
|
|
36
|
+
* @param endpoint The mqtt server's URL
|
|
37
|
+
* @returns A pre-configured (non-connected) mqtt client instance
|
|
38
|
+
*
|
|
39
|
+
* @category Transport
|
|
40
|
+
* @hidden
|
|
41
|
+
*/
|
|
42
|
+
export const createMqttTransport = (endpoint: string): Amity.MqttClient => {
|
|
43
|
+
let mqttClient: MqttClient | void;
|
|
44
|
+
let retryCount = 0
|
|
45
|
+
let allowReconnection = true
|
|
46
|
+
|
|
47
|
+
async function connect(params: { accessToken: string, userId: string }): Promise<void> {
|
|
48
|
+
if (mqttClient) {
|
|
49
|
+
mqttClient.removeAllListeners();
|
|
50
|
+
mqttClient.end(true)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
mqttClient = mqtt.connect(endpoint, getMqttOptions({ username: params.userId, password: params.accessToken }))
|
|
54
|
+
|
|
55
|
+
mqttClient.on('connect', () => {
|
|
56
|
+
retryCount = 0
|
|
57
|
+
allowReconnection = true
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
mqttClient.on('error', (error: Error & { code: number }) => {
|
|
61
|
+
switch (error.code) {
|
|
62
|
+
case MqttError.IDENTIFIER_REJECTED:
|
|
63
|
+
case MqttError.BAD_USERNAME_OR_PASSWORD:
|
|
64
|
+
case MqttError.NOT_AUTHORIZED:
|
|
65
|
+
allowReconnection = false
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
mqttClient.on('close', () => {
|
|
70
|
+
if (allowReconnection) {
|
|
71
|
+
reconnect()
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
return new Promise(resolve => mqttClient!.once('connect', () => resolve()))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const reconnect = () => {
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
retryCount = retryCount + 1
|
|
81
|
+
mqttClient!.reconnect()
|
|
82
|
+
}, RETRY_BASE_TIMEOUT * Math.pow(2, retryCount > RETRY_COUNT_MAX ? RETRY_COUNT_MAX : retryCount))
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
connect,
|
|
87
|
+
async disconnect(): Promise<void> {
|
|
88
|
+
allowReconnection = false
|
|
89
|
+
|
|
90
|
+
if (this.connected) {
|
|
91
|
+
return new Promise(resolve => mqttClient?.end(true, undefined, () => resolve()))
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
get connected() {
|
|
95
|
+
return !!mqttClient?.connected
|
|
96
|
+
},
|
|
97
|
+
on<T extends keyof Amity.MqttEvents>(event: T, handler: (payload: Amity.MqttEvents[T]) => void) {
|
|
98
|
+
mqttClient?.on(event, handler)
|
|
99
|
+
},
|
|
100
|
+
once<T extends keyof Amity.MqttEvents>(event: T, handler: (payload: Amity.MqttEvents[T]) => void) {
|
|
101
|
+
mqttClient?.once(event, handler)
|
|
102
|
+
},
|
|
103
|
+
off<T extends keyof Amity.MqttEvents>(event: T, handler?: (payload: Amity.MqttEvents[T]) => void) {
|
|
104
|
+
if (handler !== undefined) {
|
|
105
|
+
mqttClient?.off(event, handler)
|
|
106
|
+
} else {
|
|
107
|
+
mqttClient?.removeAllListeners(event)
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
removeAllListeners() {
|
|
111
|
+
mqttClient?.removeAllListeners()
|
|
112
|
+
},
|
|
113
|
+
subscribe(topic: string, callback?: Amity.Listener<ASCError | void>): Amity.Unsubscriber {
|
|
114
|
+
const callbackWrapper = (error: Error, granted: ISubscriptionGrant[]) => {
|
|
115
|
+
if (error || granted[0].qos === QOS_FAILURE_CODE) {
|
|
116
|
+
const ascError = error
|
|
117
|
+
? new ASCError(error.message, Amity.ClientError.UNKNOWN_ERROR, Amity.ErrorLevel.ERROR)
|
|
118
|
+
// TODO throw the actual error, once BE can tell us the actual error code
|
|
119
|
+
: new ASCUnknownError(Amity.ClientError.UNKNOWN_ERROR, Amity.ErrorLevel.ERROR)
|
|
120
|
+
|
|
121
|
+
console.error(`Failed to subscribe to topic ${topic}`, ascError)
|
|
122
|
+
callback?.(ascError)
|
|
123
|
+
} else {
|
|
124
|
+
console.log(`Subscribed to topic ${granted[0].topic}`)
|
|
125
|
+
callback?.()
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (mqttClient) {
|
|
130
|
+
mqttClient.subscribe(topic, { qos: 0 }, callbackWrapper)
|
|
131
|
+
} else {
|
|
132
|
+
callbackWrapper(new Error('No connection to broker'), []);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return () => mqttClient?.unsubscribe(topic)
|
|
136
|
+
},
|
|
137
|
+
unsubscribe(topic: string) {
|
|
138
|
+
mqttClient?.unsubscribe(topic)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ASCApiError, ASCUnknownError } from '~/core/errors'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Unwraps v3 server payload (for error handling and type extraction)
|
|
5
|
+
*
|
|
6
|
+
* @param response A typical "v3" response (related to backend's service strategy)
|
|
7
|
+
*
|
|
8
|
+
* @returns The data returned by the backend
|
|
9
|
+
* @throws An error related to backend's rejection
|
|
10
|
+
*
|
|
11
|
+
* @category Transport
|
|
12
|
+
* @hidden
|
|
13
|
+
*/
|
|
14
|
+
export const unwrapPayload = <T>(response: Amity.Response<T>): T => {
|
|
15
|
+
if (response.status === 'success') {
|
|
16
|
+
return response.data
|
|
17
|
+
} else if (response.status === 'fail') {
|
|
18
|
+
throw new ASCUnknownError(response.code)
|
|
19
|
+
} else if (response.status === 'error') {
|
|
20
|
+
throw new ASCApiError(response.message, response.code, Amity.ErrorLevel.ERROR)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// unjust, but helps force uncast "T | undefined" to allow deconstruction without warnings
|
|
24
|
+
return undefined as unknown as T
|
|
25
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import io from 'socket.io-client'
|
|
2
|
+
import { unwrapPayload } from './utils'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates a pre-configured socket.io instance
|
|
6
|
+
*
|
|
7
|
+
* @param endpoint The socket.io server's URL
|
|
8
|
+
* @returns A pre-configured (non-connected) socket.io client instance
|
|
9
|
+
*
|
|
10
|
+
* @category Transport
|
|
11
|
+
* @hidden
|
|
12
|
+
*/
|
|
13
|
+
export const createWebsocketTransport = (endpoint: string) => {
|
|
14
|
+
const socket = io(endpoint, {
|
|
15
|
+
autoConnect: false,
|
|
16
|
+
reconnectionDelay: 2000,
|
|
17
|
+
transports: ['websocket'],
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
// FIXME: disconnectClient removes this listener and client can get global ban event
|
|
21
|
+
socket.on('disconnect', (reason: string) => {
|
|
22
|
+
if (reason === 'io server disconnect')
|
|
23
|
+
socket.connect()
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
return socket
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Promisify a websocket event emission - resulting in a synchronous http-like XHR (ws legacy)
|
|
31
|
+
*
|
|
32
|
+
* @param client The current client for which to send the event with
|
|
33
|
+
* @param event The websocket event name
|
|
34
|
+
* @param data The event's payload
|
|
35
|
+
*
|
|
36
|
+
* @returns The data returned by the backend
|
|
37
|
+
* @throws An error related to backend's rejection
|
|
38
|
+
*
|
|
39
|
+
* @category Transport
|
|
40
|
+
* @async
|
|
41
|
+
* @hidden
|
|
42
|
+
*/
|
|
43
|
+
export const synchronousWSCall = async <T>(
|
|
44
|
+
client: Amity.Client,
|
|
45
|
+
event: string,
|
|
46
|
+
data?: Object,
|
|
47
|
+
)=> {
|
|
48
|
+
const { ws } = client
|
|
49
|
+
|
|
50
|
+
const value = await new Promise<T | undefined>((resolve, reject) => {
|
|
51
|
+
ws.emit(event, data, (response: Amity.Response<T>) => {
|
|
52
|
+
try {
|
|
53
|
+
resolve(unwrapPayload(response))
|
|
54
|
+
} catch (error) {
|
|
55
|
+
reject(error)
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
return value
|
|
61
|
+
}
|
|
@@ -19,7 +19,7 @@ import { decoratePayload, toPage, toToken } from '~/core/query'
|
|
|
19
19
|
* @async
|
|
20
20
|
**/
|
|
21
21
|
export const queryGlobalFeed = async (query?: {
|
|
22
|
-
dataTypes?: ('video' | 'image' | 'file')[]
|
|
22
|
+
dataTypes?: ('video' | 'image' | 'file' | 'liveStream')[]
|
|
23
23
|
page?: Amity.Page
|
|
24
24
|
}) => {
|
|
25
25
|
const client = getActiveClient()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getActiveClient } from '~/client/api'
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { dropFromCache } from '~/core/cache'
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* ```js
|
|
@@ -22,14 +22,13 @@ export const deleteFile = async (
|
|
|
22
22
|
const client = getActiveClient()
|
|
23
23
|
client.log('file/deleteFile', fileId)
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
// API-FIX: payload is different than swagger docs!!
|
|
26
|
+
const { data } = await client.http.delete<{ fileId: string }>(
|
|
26
27
|
`/api/v3/files/${fileId}`,
|
|
27
28
|
)
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
dropFromCache('file', {fileId: data.fileId})
|
|
30
31
|
|
|
31
|
-
if (success)
|
|
32
|
-
mergeInCache('file', { fileId, isDeleted: true })
|
|
33
32
|
|
|
34
|
-
return success
|
|
33
|
+
return { success: true }
|
|
35
34
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
// types
|
|
2
2
|
import './@types'
|
|
3
3
|
|
|
4
|
+
export * from './version'
|
|
5
|
+
|
|
4
6
|
// sdk core
|
|
5
7
|
export * from './core/query'
|
|
6
8
|
export * from './core/cache'
|
|
7
9
|
export * from './core/stores'
|
|
10
|
+
export * from './core/subscription'
|
|
8
11
|
|
|
9
12
|
export * from './client/api'
|
|
10
13
|
export * from './client/events'
|
|
@@ -41,8 +41,8 @@ export const createPost = async <T extends Amity.PostContentType | string>(
|
|
|
41
41
|
decoratePayload(data)
|
|
42
42
|
ingestInCache(data)
|
|
43
43
|
|
|
44
|
-
fireEvent('
|
|
45
|
-
fireEvent('
|
|
44
|
+
fireEvent('community.updated', { communities: data.communities! })
|
|
45
|
+
fireEvent('post.created', data)
|
|
46
46
|
|
|
47
47
|
const { posts } = data
|
|
48
48
|
return posts[0]
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getActiveClient } from '~/client/api'
|
|
2
2
|
import { getCommunity } from '~/community/api'
|
|
3
3
|
import { fireEvent } from '~/core/events'
|
|
4
|
+
import { dropFromCache, mergeInCache } from '~/core/cache'
|
|
4
5
|
|
|
5
6
|
import { getPost } from './getPost'
|
|
6
7
|
|
|
@@ -20,24 +21,44 @@ import { getPost } from './getPost'
|
|
|
20
21
|
*/
|
|
21
22
|
export const deletePost = async (
|
|
22
23
|
postId: Amity.Post['postId'],
|
|
24
|
+
permanent: boolean = false,
|
|
23
25
|
) => {
|
|
24
26
|
const client = getActiveClient()
|
|
25
27
|
client.log('post/deletePost', postId)
|
|
26
28
|
|
|
29
|
+
let post = await getPost(postId)
|
|
30
|
+
|
|
27
31
|
// API-FIX: This endpoint has not been implemented yet.
|
|
28
32
|
await client.http.delete<{ success: boolean }>(
|
|
29
|
-
`/api/
|
|
33
|
+
`/api/v4/posts/${postId}`, {
|
|
34
|
+
params: {
|
|
35
|
+
postId,
|
|
36
|
+
permanent,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
30
39
|
)
|
|
31
40
|
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
// there is currently a limitation which doesn't allow us to fire event to tell that community
|
|
42
|
+
// has been updated. reason is that, when the object is deleted, we don't have its `communityId`
|
|
43
|
+
// and so we cannot refetch the community or advertise on events. hopefully this should be solved
|
|
44
|
+
// later when realtime events covers that for us.
|
|
45
|
+
if (post.targetType === 'community') {
|
|
46
|
+
const community = await getCommunity(post.targetId);
|
|
47
|
+
fireEvent('community.updated', { communities: [community] })
|
|
38
48
|
}
|
|
39
49
|
|
|
40
|
-
|
|
50
|
+
// to support hard deletion
|
|
51
|
+
const deleted = { ...post, isDeleted: true }
|
|
52
|
+
|
|
53
|
+
fireEvent('post.deleted', { posts: [deleted] })
|
|
54
|
+
|
|
55
|
+
if (permanent) {
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
dropFromCache('post', {postId})
|
|
58
|
+
}, 0)
|
|
59
|
+
} else {
|
|
60
|
+
mergeInCache('post', {postId, isDeleted: true})
|
|
61
|
+
}
|
|
41
62
|
|
|
42
63
|
return deleted
|
|
43
64
|
}
|
package/src/post/api/getPost.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getActiveClient } from '~/client/api'
|
|
2
|
-
import { ingestInCache, pullFromCache } from '~/core/cache'
|
|
2
|
+
import { ingestInCache, pullFromCache, dropFromCache } from '~/core/cache'
|
|
3
3
|
import { decoratePayload } from '~/core/query'
|
|
4
4
|
|
|
5
5
|
import { getPosts } from './getPosts'
|
|
@@ -24,10 +24,22 @@ export const getPost = async (
|
|
|
24
24
|
const client = getActiveClient()
|
|
25
25
|
client.log('post/getPost', postId)
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
let data: Amity.PostPayload;
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
// API-FIX: endpoint should not be /list, parameters should be querystring.
|
|
31
|
+
const response = await client.http.get<Amity.PostPayload>(
|
|
32
|
+
`/api/v3/posts/${postId}`,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
data = response.data;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if ((error as Amity.ErrorResponse)?.code === Amity.ServerError.ITEM_NOT_FOUND) {
|
|
38
|
+
dropFromCache('post', {postId})
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
31
43
|
|
|
32
44
|
decoratePayload(data)
|
|
33
45
|
ingestInCache(data)
|
package/src/post/events/index.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
export * from './onPostCreated'
|
|
2
2
|
export * from './onPostUpdated'
|
|
3
3
|
export * from './onPostDeleted'
|
|
4
|
+
|
|
5
|
+
export * from './onPostApproved'
|
|
6
|
+
export * from './onPostDeclined'
|
|
7
|
+
|
|
8
|
+
export * from './onPostFlagged'
|
|
9
|
+
export * from './onPostUnflagged'
|
|
10
|
+
|
|
11
|
+
export * from './onPostReactionAdded'
|
|
12
|
+
export * from './onPostReactionRemoved'
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createPostEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onPostApproved } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onPostApproved(post => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a {@link Amity.Post} has been updated
|
|
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 onPostApproved = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
|
|
19
|
+
createPostEventSubscriber('post.approved', 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 {@link Amity.Post} has been created
|
|
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 onPostCreated = (
|
|
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/onPostCreated',
|
|
36
|
-
'v3.post.didCreate',
|
|
37
|
-
filter
|
|
38
|
-
)
|
|
39
|
-
}
|
|
18
|
+
export const onPostCreated = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
|
|
19
|
+
createPostEventSubscriber('post.created', callback)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createPostEventSubscriber } from './utils'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ```js
|
|
5
|
+
* import { onPostDeclined } from '@amityco/ts-sdk'
|
|
6
|
+
* const dispose = onPostDeclined(post => {
|
|
7
|
+
* // ...
|
|
8
|
+
* })
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Fired when a {@link Amity.Post} has been updated
|
|
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 onPostDeclined = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
|
|
19
|
+
createPostEventSubscriber('post.declined', 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 deleted
|
|
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 onPostDeleted = (
|
|
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/onPostDeleted',
|
|
36
|
-
'v3.post.didDelete',
|
|
37
|
-
filter
|
|
38
|
-
)
|
|
39
|
-
}
|
|
18
|
+
export const onPostDeleted = (callback: Amity.Listener<Amity.Post>): Amity.Unsubscriber =>
|
|
19
|
+
createPostEventSubscriber('post.deleted', callback)
|
|
@@ -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)
|