// Add a reaction to an activity
let reaction = try await feed.addReaction(
activityId: "activity_123",
request: .init(
custom: ["emoji": "❤️"],
type: "like"
)
)
// Remove a reaction
_ = try await feed.deleteReaction(activityId: "activity_123", type: "like")Reactions
Overview
You can react to both activities and comments. It's possible to configure any reaction types that best fit your app.
When adding reactions and the enforce_unique flag is set to true, the existing reaction of a user will be overridden with the new reaction. Use this flag if you want to ensure users have a single reaction per each comment/activity. The default value is false, in which case users can have multiple reactions.
# Add a reaction to an activity
reaction_request = GetStream::Generated::Models::AddReactionRequest.new(
type: 'like',
user_id: 'user123',
custom: {
emoji: '❤️'
}
)
response = client.feeds.add_reaction(activity_id, reaction_request)
# Adding a reaction without triggering push notifications
reaction_request_skip_push = GetStream::Generated::Models::AddReactionRequest.new(
type: 'like',
user_id: 'user123',
custom: {
emoji: '❤️'
},
skip_push: true
)
response = client.feeds.add_reaction(activity_id, reaction_request_skip_push)
# Add a reaction to a comment
comment_reaction_request = GetStream::Generated::Models::AddCommentReactionRequest.new(
type: 'like',
user_id: 'user123',
custom: {
emoji: '👍'
}
)
response = client.feeds.add_comment_reaction(comment_id, comment_reaction_request)
# Delete activity reaction
response = client.feeds.delete_activity_reaction(activity_id, 'like', 'user123')Overview of the reaction model
By default creating a reaction doesn't create an activity.
When you read a feed the reactions are included. Here's an example:
# Query reactions to a specific activity
# First page
first_page = client.feeds.query_activity_reactions(
activity_id,
GetStream::Generated::Models::QueryActivityReactionsRequest.new(
limit: 10,
filter: {
reaction_type: 'like'
}
)
)
# Second page using next cursor from first page
if first_page.next
second_page = client.feeds.query_activity_reactions(
activity_id,
GetStream::Generated::Models::QueryActivityReactionsRequest.new(
limit: 10,
filter: {
reaction_type: 'like'
},
next: first_page.next
)
)
end
# Access reaction data
puts first_page.reactions
puts first_page.reaction_groupsQuerying Reactions
You can query reactions to both activities and comments. Here are some examples:
// Query reactions to a specific activity
val activityReactionList = client.activityReactionList(
ActivityReactionsQuery(
activityId = "activity-123",
filter = ActivityReactionsFilterField.reactionType.equal("like"),
)
)
activityReactionList.get()
activityReactionList.state.reactions.collect { reactions ->
// Handle activity reactions
}
// Query reactions to a specific comment
val commentReactionList = client.commentReactionList(
CommentReactionsQuery(
commentId = "comment-456",
filter = CommentReactionsFilterField.reactionType.equal("like"),
)
)
commentReactionList.get()
commentReactionList.state.reactions.collect { reactions ->
// Handle comment reactions
}Reaction Queryable Built-In Fields
| name | type | description | supported operations | example |
|---|---|---|---|---|
reaction_type | string or list of strings | The type of reaction | $in, $eq | { reaction_type: { $in: [ 'like', 'heart', 'thumbs_up' ] } } |
user_id | string or list of strings | The ID of the user who created the reaction | $in, $eq | { user_id: { $eq: 'user_123' } } |
created_at | string, must be formatted as an RFC3339 timestamp | The time the reaction was created | $eq, $gt, $gte, $lt, $lte | { created_at: { $gte: '2023-12-04T09:30:20.45Z' } } |