Message Reminders

Message reminders allow users to set reminders for messages. This feature is useful when users want to be notified about messages that they need to follow up on.

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
await client.createReminder(
  messageId,
  // Remind in 1 hour
  remindAt: DateTime.now().add(const Duration(hours: 1)),
);

// Create a "Save for later" reminder without a specific time
await client.createReminder(messageId);

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
await client.updateReminder(
  messageId,
  // New reminder time in 2 hours
  remindAt: DateTime.now().add(const Duration(hours: 2)),
);

// Convert a timed reminder to "Save for later"
await client.updateReminder(
  messageId,
  remindAt: null, // Remove specific reminder time
);

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(messageId);

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.

// Retrieve all reminders for the current user.
await client.queryReminders();

Filtering reminders

You can filter the reminders based on different criteria:

  • 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).

// Retrieve all the overdue reminders for the current user sorted by remindAt.
final now = DateTime.timestamp();
await client.queryReminders(
  filter: Filter.lessOrEqual('remind_at', now.toIso8601String()),
  sort: [SortOption.desc(MessageReminderSortKey.remindAt)],
);

// Retrieve all the upcoming reminders for the current user sorted by remindAt.
final now = DateTime.timestamp();
await client.queryReminders(
  filter: Filter.greaterOrEqual('remind_at', now.toIso8601String()),
  sort: [SortOption.asc(MessageReminderSortKey.remindAt)],
);

// Retrieve all the reminders saved for later (no remind_at).
await client.queryReminders(
  filter: Filter.notExists('remind_at'),
  sort: [SortOption.desc(MessageReminderSortKey.createdAt)],
);

Pagination

If you have many reminders, you can paginate the results.

// 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.

// 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}');
});
© Getstream.io, Inc. All Rights Reserved.