// Enabling it for a channel
await channel.updatePartial({
config_overrides: {
user_message_reminders: true,
},
});
// Enabling it for a channel type
const update = await client.updateChannelType("messaging", {
user_message_reminders: true,
});
Message Reminders
Message reminders let users schedule notifications for specific messages, making it easier to follow up later. When a reminder includes a timestamp, it’s like saying “remind me later about this message,” and the user who set it will receive a notification at the designated time. If no timestamp is provided, the reminder functions more like a bookmark, allowing the user to save the message for later reference.
Enabling reminders
The Message Reminders feature must be activated at the channel level before it can be used. You have two configuration options: activate it for a single channel using configuration overrides, or enable it globally for all channels of a particular type.
// Enabling it for a channel
$channel->updatePartial([
'config_overrides' => [
'user_message_reminders' => true
]
]);
// Enabling it for a channel type
$client->updateChannelType('messaging', [
'user_message_reminders' => true
]);
# Enabling it for a channel
channel.update_partial(
config_overrides: {
user_message_reminders: true
}
)
# Enabling it for a channel type
client.update_channel_type('messaging', user_message_reminders: true)
// Enabling it for a channel
await channelClient.PartialUpdateAsync(channel.Type, channel.Id, new PartialUpdateChannelRequest
{
Set = new Dictionary<string, object>
{
{ "config_overrides", new Dictionary<string, object> { { "user_message_reminders", true } } }
}
});
// Enabling it for a channel type
await channelTypeClient.UpdateChannelTypeAsync("messaging", new ChannelTypeWithStringCommandsRequest
{
UserMessageReminders = true
});
// Backend SDK
// Enabling it for a channel type
ChannelType.update("messaging")
.userMessageReminders(true)
.request();
# Enabling it for a channel
channel.update_partial(
config_overrides={
"user_message_reminders": True
}
)
# Enabling it for a channel type
client.update_channel_type("messaging", user_message_reminders=True)
// Enabling it for a channel
channel.PartialUpdate(ctx, PartialUpdate{
Set: map[string]interface{}{
"config_overrides": map[string]interface{}{
"user_message_reminders": true,
},
},
})
// Enabling it for a channel type
client.UpdateChannelType(ctx, "messaging", map[string]interface{}{
"user_message_reminders": true,
})
Message reminders allow users to:
- schedule a notification after given amount of time has elapsed
- bookmark a message without specifying a deadline
Enabling message reminders
Message reminders have to be enabled using an API call.
// enables message reminders for the channel type `messaging`
await client.updateChannelType("messaging", {
user_message_reminders: true,
});
Limits
- A user cannot have more than 250 reminders scheduled
- A user can only have one reminder created per message
Creating a message reminder
You can create a reminder for any message. When creating a reminder, you can specify a reminder time or save it for later without a specific time.
// Create a reminder with a specific due date
const reminder = await client.createReminder(
"message-id",
"user-id",
new Date(Date.now() + 3600000),
);
// Create a "Save for later" reminder without a specific time
const reminder = await client.createReminder("message-id", "user-id");
// Create a reminder with a specific due date
$remindAt = new DateTime('+1 hour');
$reminder = $client->createReminder('message-id', 'user-id', $remindAt);
// Create a "Save for later" reminder without a specific time
$reminder = $client->createReminder('message-id', 'user-id');
# Create a reminder with a specific due date
reminder = client.create_reminder('message-id', 'user-id', DateTime.now + 1)
# Create a "Save for later" reminder without a specific time
reminder = client.create_reminder('message-id', 'user-id')
// Create a reminder with a specific due date
var reminder = await messageClient.CreateReminderAsync("message-id", "user-id", DateTimeOffset.Now.AddHours(1));
// Create a "Save for later" reminder without a specific time
var reminder = await messageClient.CreateReminderAsync("message-id", "user-id");
// Backend SDK
// Create a reminder with a specific due date
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 1);
Date remindAt = cal.getTime();
MessageReminder reminder = MessageReminder.create("message-id", "user-id", remindAt).request();
// Create a "Save for later" reminder without a specific time
MessageReminder reminder = MessageReminder.create("message-id", "user-id").request();
from datetime import datetime, timedelta
# Create a reminder with a specific due date
remind_at = datetime.now() + timedelta(hours=1)
reminder = client.create_reminder('message-id', 'user-id', remind_at)
# Create a "Save for later" reminder without a specific time
reminder = client.create_reminder('message-id', 'user-id')
import "time"
// Create a reminder with a specific due date
remindAt := time.Now().Add(time.Hour)
reminder, err := client.CreateReminder(ctx, "message-id", "user-id", &remindAt)
// Create a "Save for later" reminder without a specific time
reminder, err := client.CreateReminder(ctx, "message-id", "user-id", nil)
// Get a message controller for the message
let messageController = chatClient.messageController(
cid: ChannelId(type: .messaging, id: "general"),
messageId: "message-id"
)
// Create a reminder with a specific due date
messageController.createReminder(
remindAt: Date().addingTimeInterval(3600) // Reminder in 1 hour
) { result in
switch result {
case .success(let reminder):
print("Reminder created: \(reminder)")
case .failure(let error):
print("Failed to create reminder: \(error)")
}
}
// Create a "Save for later" reminder without a specific time
messageController.createReminder(
remindAt: nil // No specific reminder time
) { result in
switch result {
case .success(let reminder):
print("Message saved for later: \(reminder)")
case .failure(let error):
print("Failed to save message for later: \(error)")
}
}
// Create a reminder with a specific due date (direct API call)
await client.createReminder({
messageId: "message-id",
// Remind in offsetMs
remind_at: new Date(new Date().getTime() + offsetMs).toISOString(),
// in case of server-side integration, include the id of a user on behalf of which the reminder is created
//user_id: 'some-user-id'
});
// Create a reminder with a specific due date (client state optimistic update (no server-side use))
await client.reminders.upsertReminder({
messageId: "message-id",
// Remind in offsetMs
remind_at: new Date(new Date().getTime() + offsetMs).toISOString(),
// in case of server-side integration, include the id of a user on behalf of which the reminder is created
//user_id: 'some-user-id'
});
// Create a "Save for later" reminder without a specific time (direct API call)
await client.createReminder({
messageId: "message-id",
// in case of server-side integration, include the id of a user on behalf of which the reminder is created
//user_id: 'some-user-id'
});
// Create a "Save for later" reminder without a specific time (client state optimistic update (no server-side use))
await client.reminders.upsertReminder({
messageId: "message-id",
});
Updating a message reminder
You can update an existing reminder for a message to change the reminder time.
// Update a reminder with a new due date
const updatedReminder = await client.updateReminder(
"message-id",
"user-id",
new Date(Date.now() + 7200000),
);
// Convert a timed reminder to "Save for later"
const updatedReminder = await client.updateReminder(
"message-id",
"user-id",
null,
);
// Update a reminder with a new due date
$remindAt = new DateTime('+2 hours');
$updatedReminder = $client->updateReminder('message-id', 'user-id', $remindAt);
// Convert a timed reminder to "Save for later"
$updatedReminder = $client->updateReminder('message-id', 'user-id', null);
# Update a reminder with a new due date
updated_reminder = client.update_reminder('message-id', 'user-id', DateTime.now + 2)
# Convert a timed reminder to "Save for later"
updated_reminder = client.update_reminder('message-id', 'user-id', nil)
// Update a reminder with a new due date
var updatedReminder = await messageClient.UpdateReminderAsync("message-id", "user-id", DateTimeOffset.Now.AddHours(2));
// Convert a timed reminder to "Save for later"
var updatedReminder = await messageClient.UpdateReminderAsync("message-id", "user-id", null);
// Backend SDK
// Update a reminder with a new due date
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 2);
Date remindAt = cal.getTime();
MessageReminder updatedReminder = MessageReminder.update("message-id", "user-id", remindAt).request();
// Convert a timed reminder to "Save for later"
MessageReminder updatedReminder = MessageReminder.update("message-id", "user-id", null).request();
from datetime import datetime, timedelta
# Update a reminder with a new due date
remind_at = datetime.now() + timedelta(hours=2)
updated_reminder = client.update_reminder('message-id', 'user-id', remind_at)
# Convert a timed reminder to "Save for later"
updated_reminder = client.update_reminder('message-id', 'user-id', None)
import "time"
// Update a reminder with a new due date
remindAt := time.Now().Add(2 * time.Hour)
updatedReminder, err := client.UpdateReminder(ctx, "message-id", "user-id", &remindAt)
// Convert a timed reminder to "Save for later"
updatedReminder, err := client.UpdateReminder(ctx, "message-id", "user-id", nil)
// Get a message controller for the message
let messageController = chatClient.messageController(
cid: ChannelId(type: .messaging, id: "general"),
messageId: "message-id"
)
// Update a reminder with a new due date
messageController.updateReminder(
remindAt: Date().addingTimeInterval(7200) // New reminder time (2 hours)
) { result in
switch result {
case .success(let reminder):
print("Reminder updated: \(reminder)")
case .failure(let error):
print("Failed to update reminder: \(error)")
}
}
// Convert a timed reminder to "Save for later"
messageController.updateReminder(
remindAt: nil // Remove specific reminder time
) { result in
switch result {
case .success(let reminder):
print("Reminder updated to save for later: \(reminder)")
case .failure(let error):
print("Failed to update reminder: \(error)")
}
}
// Update a reminder with a new due date (direct API call)
await client.updateReminder({
messageId: "message-id",
// Remind in newOffsetMs
remind_at: new Date(new Date().getTime() + newOffsetMs).toISOString(),
// in case of server-side integration, include the id of a user on behalf of which the reminder is created
//user_id: 'some-user-id'
});
// Update a reminder with a new due date (client state optimistic update (no server-side use))
await client.reminders.upsertReminder({
messageId: "message-id",
// Remind in newOffsetMs
remind_at: new Date(new Date().getTime() + newOffsetMs).toISOString(),
// in case of server-side integration, include the id of a user on behalf of which the reminder is created
//user_id: 'some-user-id'
});
// Convert a timed reminder to "Save for later" (direct API call)
await client.updateReminder({
messageId: "message-id",
remind_at: null,
// in case of server-side integration, include the id of a user on behalf of which the reminder is created
//user_id: 'some-user-id'
});
// Convert a timed reminder to "Save for later" (client state optimistic update (no server-side use))
await client.reminders.upsertReminder({
messageId: "message-id",
remind_at: null,
});
Deleting a message reminder
You can delete a reminder for a message when it’s no longer needed.
// Delete the reminder for the message
await client.deleteReminder("message-id", "user-id");
// Delete the reminder for the message
$client->deleteReminder('message-id', 'user-id');
# Delete the reminder for the message
client.delete_reminder('message-id', 'user-id')
// Delete the reminder for the message
await messageClient.DeleteReminderAsync("message-id", "user-id");
// Backend SDK
// Delete the reminder for the message
MessageReminder.delete("message-id", "user-id").request();
# Delete the reminder for the message
client.delete_reminder('message-id', 'user-id')
// Delete the reminder for the message
err := client.DeleteReminder(ctx, "message-id", "user-id")
// Get a message controller for the message
let messageController = chatClient.messageController(
cid: ChannelId(type: .messaging, id: "general"),
messageId: "message-id"
)
// Delete the reminder for the message
messageController.deleteReminder { result in
switch result {
case .success:
print("Reminder deleted successfully")
case .failure(let error):
print("Failed to delete reminder: \(error)")
}
}
// Delete a reminder for a message with id 'message-id' (direct API call)
await client.deleteReminder("message-id");
// Delete a reminder for a message with id 'message-id' (client state optimistic update (no server-side use))
await client.reminders.deleteReminder("message-id");
Querying message reminders
The SDK allows you to fetch all reminders of the current user. You can filter, sort, and paginate through all the user’s reminders.
// Query reminders for a user
const reminders = await client.queryReminders("user-id");
// Query reminders with filters
const filter = { channel_cid: "messaging:general" };
const reminders = await client.queryReminders("user-id", filter);
// Query reminders for a user
$reminders = $client->queryReminders('user-id');
// Query reminders with filters
$filter = ['channel_cid' => 'messaging:general'];
$reminders = $client->queryReminders('user-id', $filter);
# Query reminders for a user
reminders = client.query_reminders('user-id')
# Query reminders with filters
filter = { 'channel_cid' => 'messaging:general' }
reminders = client.query_reminders('user-id', filter)
// Query reminders for a user
var reminders = await messageClient.QueryRemindersAsync("user-id");
// Query reminders with filters
var filter = new Dictionary<string, object> { { "channel_cid", "messaging:general" } };
var reminders = await messageClient.QueryRemindersAsync("user-id", filter);
// Backend SDK
// Query reminders for a user
List<MessageReminder> reminders = MessageReminder.list("user-id").request();
// Query reminders with filters
Map<String, Object> filter = new HashMap<>();
filter.put("channel_cid", "messaging:general");
List<MessageReminder> reminders = MessageReminder.list("user-id").filter(filter).request();
# Query reminders for a user
reminders = client.query_reminders('user-id')
# Query reminders with filters
filter_conditions = {'channel_cid': 'messaging:general'}
reminders = client.query_reminders('user-id', filter_conditions)
// Query reminders for a user
reminders, err := client.QueryReminders(ctx, "user-id", nil)
// Query reminders with filters
filter := map[string]interface{}{
"channel_cid": "messaging:general",
}
reminders, err := client.QueryReminders(ctx, "user-id", filter)
// Create a reminder list controller
let reminderListController = chatClient.messageReminderListController()
// Sync reminders
reminderListController.synchronize { error in
if let error = error {
print("Failed to synchronize reminders: \(error)")
}
}
reminderListController.delegate = self
// Get notified about reminders changes
class MyReminderListView: MessageReminderListControllerDelegate {
let controller: MessageReminderListController
init(controller: MessageReminderListController) {
self.controller = controller
controller.delegate = self
}
func controller(
_ controller: MessageReminderListController,
didChangeReminders changes: [ListChange<MessageReminder>]
) {
// Handle changes to reminders
print("New reminders: \(controller.reminders)")
}
}
// Retrieve the first page of reminders for the current user (direct API call).
await client.queryReminders();
// For the client-side pagination there are two methods representing two directions of pagination
// Query the first page (client state optimistic update (no server-side use))
await client.reminders.queryNextReminders();
// Retrieve all reminders for the current user.
await client.queryReminders();
Filtering reminders
You can filter the reminders based on different criteria:
message_id
- Filter by the message that the reminder is created on.remind_at
- Filter by the reminder time.created_at
- Filter by the creation date.channel_cid
- Filter by the channel ID.
The most common use case would be to filter by the reminder time. Like filtering overdue reminders, upcoming reminders, or reminders with no due date (saved for later).
// Filter overdue reminders
const overdueFilter = { remind_at: { $lt: new Date() } };
const overdueReminders = await client.queryReminders("user-id", overdueFilter);
// Filter upcoming reminders
const upcomingFilter = { remind_at: { $gt: new Date() } };
const upcomingReminders = await client.queryReminders(
"user-id",
upcomingFilter,
);
// Filter reminders with no due date (saved for later)
const savedFilter = { remind_at: null };
const savedReminders = await client.queryReminders("user-id", savedFilter);
// Filter overdue reminders
$overdueFilter = ['remind_at' => ['$lt' => new DateTime()]];
$overdueReminders = $client->queryReminders('user-id', $overdueFilter);
// Filter upcoming reminders
$upcomingFilter = ['remind_at' => ['$gt' => new DateTime()]];
$upcomingReminders = $client->queryReminders('user-id', $upcomingFilter);
// Filter reminders with no due date (saved for later)
$savedFilter = ['remind_at' => null];
$savedReminders = $client->queryReminders('user-id', $savedFilter);
# Filter overdue reminders
overdue_filter = { 'remind_at' => { '$lt' => DateTime.now } }
overdue_reminders = client.query_reminders('user-id', overdue_filter)
# Filter upcoming reminders
upcoming_filter = { 'remind_at' => { '$gt' => DateTime.now } }
upcoming_reminders = client.query_reminders('user-id', upcoming_filter)
# Filter reminders with no due date (saved for later)
saved_filter = { 'remind_at' => nil }
saved_reminders = client.query_reminders('user-id', saved_filter)
// Filter overdue reminders
var overdueFilter = new Dictionary<string, object>
{
{ "remind_at", new Dictionary<string, object> { { "$lt", DateTimeOffset.Now } } }
};
var overdueReminders = await messageClient.QueryRemindersAsync("user-id", overdueFilter);
// Filter upcoming reminders
var upcomingFilter = new Dictionary<string, object>
{
{ "remind_at", new Dictionary<string, object> { { "$gt", DateTimeOffset.Now } } }
};
var upcomingReminders = await messageClient.QueryRemindersAsync("user-id", upcomingFilter);
// Filter reminders with no due date (saved for later)
var savedFilter = new Dictionary<string, object> { { "remind_at", null } };
var savedReminders = await messageClient.QueryRemindersAsync("user-id", savedFilter);
// Backend SDK
import java.util.Date;
// Filter overdue reminders
Map<String, Object> overdueFilter = new HashMap<>();
overdueFilter.put("remind_at", Map.of("$lt", new Date()));
List<MessageReminder> overdueReminders = MessageReminder.list("user-id").filter(overdueFilter).request();
// Filter upcoming reminders
Map<String, Object> upcomingFilter = new HashMap<>();
upcomingFilter.put("remind_at", Map.of("$gt", new Date()));
List<MessageReminder> upcomingReminders = MessageReminder.list("user-id").filter(upcomingFilter).request();
// Filter reminders with no due date (saved for later)
Map<String, Object> savedFilter = new HashMap<>();
savedFilter.put("remind_at", null);
List<MessageReminder> savedReminders = MessageReminder.list("user-id").filter(savedFilter).request();
from datetime import datetime
# Filter overdue reminders
overdue_filter = {'remind_at': {'$lt': datetime.now()}}
overdue_reminders = client.query_reminders('user-id', overdue_filter)
# Filter upcoming reminders
upcoming_filter = {'remind_at': {'$gt': datetime.now()}}
upcoming_reminders = client.query_reminders('user-id', upcoming_filter)
# Filter reminders with no due date (saved for later)
saved_filter = {'remind_at': None}
saved_reminders = client.query_reminders('user-id', saved_filter)
import "time"
// Filter overdue reminders
overdueFilter := map[string]interface{}{
"remind_at": map[string]interface{}{"$lt": time.Now()},
}
overdueReminders, err := client.QueryReminders(ctx, "user-id", overdueFilter)
// Filter upcoming reminders
upcomingFilter := map[string]interface{}{
"remind_at": map[string]interface{}{"$gt": time.Now()},
}
upcomingReminders, err := client.QueryReminders(ctx, "user-id", upcomingFilter)
// Filter reminders with no due date (saved for later)
savedFilter := map[string]interface{}{
"remind_at": nil,
}
savedReminders, err := client.QueryReminders(ctx, "user-id", savedFilter)
// Create filter for overdue reminders
let query = MessageReminderListQuery(
filter: .overdue, // Same as .less(.remindAt, than: Date())
sort: [.init(key: .remindAt, isAscending: false)]
)
// Create filter for upcoming reminders
let query = MessageReminderListQuery(
filter: .upcoming, // Same as .greater(.remindAt, than: Date())
sort: [.init(key: .remindAt, isAscending: true)]
)
// Create filter for reminders with no due date (saved for later)
let query = MessageReminderListQuery(
filter: .isNil(.remindAt),
sort: [.init(key: .createdAt, isAscending: false)]
)
// Apply the filter to the controller
let reminderListController = chatClient.messageReminderListController(query: query)
reminderListController.delegate = self
reminderListController.synchronize()
// Direct API call
// Create filter for overdue reminders
await client.queryReminders({
filter: {
remind_at: { $lte: new Date().toISOString() },
},
sort: {
remind_at: -1, // sort from the most recently expired
},
});
// Create filter for upcoming reminders
await client.queryReminders({
filter: {
remind_at: { $gt: new Date().toISOString() },
},
sort: {
remind_at: 1, // sort from the nearest to expire
},
});
// Create filter for reminders with no due date (saved for later)
await client.queryReminders({
filter: {
remind_at: null,
},
sort: {
created_at: -1, // sort from the most recently created
},
});
// Client-side calls with local state updates before starting the pagination.
// Setting sort or filters resets the pagination state
// Create filter for overdue reminders
client.reminders.paginator.filters = {
remind_at: { $lte: new Date().toISOString() },
};
client.reminders.paginator.sort = {
remind_at: -1, // sort from the most recently expired
};
// Create filter for upcoming reminders
client.reminders.paginator.filters = {
remind_at: { $gt: new Date().toISOString() },
};
client.reminders.paginator.sort = {
remind_at: 1, // sort from the nearest to expire
};
// Create filter for reminders with no due date (saved for later)
client.reminders.paginator.filters = {
remind_at: null,
};
client.reminders.paginator.sort = {
created_at: -1, // sort from the most recently created
};
// adjust the page size
client.reminders.paginator.pageSize = 15;
Pagination
If you have many reminders, you can paginate the results.
// Load reminders with pagination
const options = { limit: 10, offset: 0 };
const reminders = await client.queryReminders("user-id", {}, options);
// Load next page
const nextPageOptions = { limit: 10, offset: 10 };
const nextReminders = await client.queryReminders(
"user-id",
{},
nextPageOptions,
);
// Load reminders with pagination
$options = ['limit' => 10, 'offset' => 0];
$reminders = $client->queryReminders('user-id', [], $options);
// Load next page
$nextPageOptions = ['limit' => 10, 'offset' => 10];
$nextReminders = $client->queryReminders('user-id', [], $nextPageOptions);
# Load reminders with pagination
options = { limit: 10, offset: 0 }
reminders = client.query_reminders('user-id', {}, options)
# Load next page
next_page_options = { limit: 10, offset: 10 }
next_reminders = client.query_reminders('user-id', {}, next_page_options)
// Load reminders with pagination
var options = new Dictionary<string, object> { { "limit", 10 }, { "offset", 0 } };
var reminders = await messageClient.QueryRemindersAsync("user-id", null, options);
// Load next page
var nextPageOptions = new Dictionary<string, object> { { "limit", 10 }, { "offset", 10 } };
var nextReminders = await messageClient.QueryRemindersAsync("user-id", null, nextPageOptions);
// Backend SDK
// Load reminders with pagination
List<MessageReminder> reminders = MessageReminder.list("user-id")
.limit(10)
.offset(0)
.request();
// Load next page
List<MessageReminder> nextReminders = MessageReminder.list("user-id")
.limit(10)
.offset(10)
.request();
# Load reminders with pagination
options = {'limit': 10, 'offset': 0}
reminders = client.query_reminders('user-id', {}, options)
# Load next page
next_page_options = {'limit': 10, 'offset': 10}
next_reminders = client.query_reminders('user-id', {}, next_page_options)
// Load reminders with pagination
options := map[string]interface{}{
"limit": 10,
"offset": 0,
}
reminders, err := client.QueryReminders(ctx, "user-id", nil, options)
// Load next page
nextPageOptions := map[string]interface{}{
"limit": 10,
"offset": 10,
}
nextReminders, err := client.QueryReminders(ctx, "user-id", nil, nextPageOptions)
// Load more reminders
reminderListController.loadMoreReminders { error in
switch result {
case .success(let newReminders):
print("Loaded \(newReminders.count) more reminders")
case .failure(let error):
print("Failed to load more reminders: \(error)")
}
}
// Load the next page (direct API call).
await client.queryReminders({ filter, sort, limit, next }); // limit is the page size
// Load the previous page (direct API call).
await client.queryReminders({ filter, sort, limit, prev }); // limit is the page size
// For the client-side pagination there are two methods representing two directions of pagination
// Set the filter and (or) sort params - this resets the pagination
client.reminders.paginator.filters = filters;
client.reminders.paginator.sort = sort;
// Query the next page of reminders starting from 0 (client state optimistic update
await client.reminders.queryNextReminders();
// Query the previous page of reminders if already some reminders were queried previously
await client.reminders.queryPreviousReminders();
// Load more reminders
final response = await client.queryReminders(
sort: sort,
filter: filter,
// Pass the limit and next page key for pagination
pagination: PaginationParams(limit: limit, next: nextPageKey),
);
Events
The following WebSocket events are available for message reminders:
reminder.created
, triggered when a reminder is created.reminder.updated
, triggered when a reminder is updated.reminder.deleted
, triggered when a reminder is deleted.notification.reminder_due
, triggered when a reminder’s due time is reached.
When a reminder’s due time is reached, the server will also send a push notification to the user. Make sure you have configured push notifications in your app to handle these reminders.
client.on("reminder.created", (event) => {
console.log("Reminder created for message:", event.message_id);
});
client.on("reminder.updated", (event) => {
console.log("Reminder updated for message:", event.message_id);
});
client.on("reminder.deleted", (event) => {
console.log("Reminder deleted for message:", event.message_id);
});
client.on("notification.reminder_due", (event) => {
console.log("Reminder due for message:", event.message_id);
});
// Events are typically handled through webhooks in PHP
// Configure webhook endpoint to receive reminder events
# Events are typically handled through webhooks in Ruby
# Configure webhook endpoint to receive reminder events
// Subscribe to reminder events
client.MessageReminderCreated += (sender, args) => {
Console.WriteLine($"Reminder created for message: {args.MessageId}");
};
client.MessageReminderUpdated += (sender, args) => {
Console.WriteLine($"Reminder updated for message: {args.MessageId}");
};
client.MessageReminderDeleted += (sender, args) => {
Console.WriteLine($"Reminder deleted for message: {args.MessageId}");
};
client.NotificationReminderDue += (sender, args) => {
Console.WriteLine($"Reminder due for message: {args.MessageId}");
};
// Events are typically handled through webhooks in Java server-side SDK
// Configure webhook endpoint to receive reminder events
# Events are typically handled through webhooks in Python
# Configure webhook endpoint to receive reminder events
// Events are typically handled through webhooks in Go
// Configure webhook endpoint to receive reminder events
let chatClient = ChatClient.shared
let eventsController = chatClient.eventsController()
eventsController.delegate = self
public func eventsController(_ controller: EventsController, didReceiveEvent event: any Event) {
if let event = event as? MessageReminderCreatedEvent {
print("Reminder created for message: \(event.messageId)")
} else if let event = event as? MessageReminderUpdatedEvent {
print("Reminder updated for message: \(event.messageId)")
} else if let event = event as? MessageReminderDeletedEvent {
print("Reminder deleted for message: \(event.messageId)")
} else if let event = event as? MessageReminderDueEvent {
print("Reminder due for message: \(event.messageId)")
}
}
const { unsubscribe } = client.on("reminder.created", handler);
const { unsubscribe } = client.on("reminder.updated", handler);
const { unsubscribe } = client.on("reminder.deleted", handler);
const { unsubscribe } = client.on("notification.reminder_due", handler);
// Listen for reminder created events
client.on(EventType.reminderCreated).listen((event) {
print('Reminder created for message: ${event.messageId}');
});
// Listen for reminder updated events
client.on(EventType.reminderUpdated).listen((event) {
print('Reminder updated for message: ${event.messageId}');
});
// Listen for reminder deleted events
client.on(EventType.reminderDeleted).listen((event) {
print('Reminder deleted for message: ${event.messageId}');
});
// Listen for reminder due events
client.on(EventType.notificationReminderDue).listen((event) {
print('Reminder due for message: ${event.messageId}');
});