Skip to content

feat(ScheduledMessages): show scheduled messages in a banner and list (REACT-1388) - #3366

Draft
NikolaGoranNaumovski wants to merge 8 commits into
feat/react-1387-scheduled-messages-schedulefrom
feat/react-1388-scheduled-messages-list
Draft

NikolaGoranNaumovski wants to merge 8 commits into
feat/react-1387-scheduled-messages-schedulefrom
feat/react-1388-scheduled-messages-list

Conversation

@NikolaGoranNaumovski

@NikolaGoranNaumovski NikolaGoranNaumovski commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

🎯 Goal

Show users the messages they have scheduled: a banner above the composer with the count, and a list of the scheduled messages for the channel (or thread) with their time and status. This is the entry point for managing scheduled messages (REACT-1389) and follows the web designs (Figma: Scheduled List and Confirmation sections).

Part of the scheduled messages feature (REACT-1388). Stacked on #3355 (schedule from the composer). The data comes from client.scheduledMessages (GetStream/stream-chat-js#1915).

🛠 Implementation details

Banner (ScheduledMessagesBanner)

  • Rendered above the composer in MessageComposerUI: "N scheduled messages" in a channel, "N scheduled replies" in a thread, with a View button.
  • Counts come from the store (useScheduledMessageCount), so the banner costs no requests and updates live from scheduled_message.* events.
  • Hidden at 0 and without the schedule-message capability. Overridable through ComponentContext (ScheduledMessagesBanner, null hides it).
  • View opens the list in a dialog (ScheduledMessageListDialog) for the banner's channel or thread.

List (ScheduledMessageList, exported standalone)

  • Props: cid, optional parentId (thread replies), optional searchQuery.
  • Failed messages first, then one group per day ("Today", "Tomorrow", weekday, date), each sorted by scheduled_at.
  • Each item (ScheduledMessageItem, overridable through ComponentContext) shows the text or an attachment summary, the scheduled time, a status badge (Scheduled / Sending… / Failed) and, for failed messages, the reason (translateScheduledMessageFailureReason).
  • "Load more" appears only when the store has another page (next), for older failed messages.
  • States:
    • first load: skeleton rows (ScheduledMessageListLoading)
    • first load failed: error state with Try again, which reloads the store (ScheduledMessagesLoadError); messages already in the store stay listed if a later reload fails
    • nothing scheduled: ScheduledMessagesEmptyList
    • search without matches: "No messages found" (ScheduledMessagesNoResults)
    • all empty states share ScheduledMessagesEmptyState

Channel Detail

  • New "Scheduled messages" section after Pinned messages (ScheduledMessagesView), listing the channel's scheduled messages.
  • A search field above the list (shown when the channel has scheduled messages) filters by message text.

Hooks and utilities

  • Hooks: useScheduledMessageGroups, useScheduledMessagesPagination, useScheduledMessagesLoadState.
  • Pure utilities with unit tests: grouping by failed / day, message preview, failure reason copy, text search.
  • getChannelContainer is shared with the schedule button for portals.

Translations
All new strings are in the 12 locales.

Testing

  • Unit: banner count per channel and thread, hidden at 0 and without the capability, live updates from events; list grouping and order, item content per status, load more, loading / error / retry / empty / no-results states, search; Channel Detail section and search; axe checks.
  • Manual in examples/vite against the scheduled messages test app: banner count and live updates, list grouping by day, status badges.

🎨 UI Changes

Screenshots: banner above the composer, list dialog, Channel Detail section with search, loading skeleton, error and empty states.

Move the channel container lookup used to portal the schedule dialog
into the ScheduledMessages utilities so other scheduled message dialogs
can reuse it.
…ties

Group scheduled messages into a failed group followed by one group per
local day, build list previews from stored scheduled messages, and map
each failure_reason to its user-facing copy. Add the list, item, banner
and group types used by the scheduled message list.
useScheduledMessageGroups groups the scoped scheduled messages for a
channel or thread, and useScheduledMessagesPagination exposes whether
another page exists and loads it through the manager.
Render a banner with the number of scheduled messages (or scheduled
thread replies) above the composer. View opens a list with failed
messages first and the rest grouped by day; each row shows the preview,
scheduled time, status and failure reason. Customise it through the
ScheduledMessagesBanner and ScheduledMessageItem component slots.
Add the banner counts, list titles, statuses, empty state, failure
reasons and the day group timestamp format in all locales.
List the channel's scheduled messages in a new ChannelDetail section
placed after the pinned messages.
@coderabbitai

coderabbitai Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.

…list

Follow the web designs for the scheduled message list:
- Channel Detail's scheduled section gets a search field (shown when the
  channel has scheduled messages) that filters the list by message text
- the first load shows skeleton rows instead of a spinner
- a failed first load shows an error state with Try again, which reloads
  the store; stored messages stay listed when a later reload fails
- a search without matches shows "No messages found"
- the empty, no-results and error states share one layout

New strings are translated in all 12 locales.

Refs: REACT-1388
@NikolaGoranNaumovski NikolaGoranNaumovski changed the title Feat/react 1388 scheduled messages list feat(ScheduledMessages): show scheduled messages in a banner and list (REACT-1388) Nov 2, 2026
@NikolaGoranNaumovski
NikolaGoranNaumovski force-pushed the feat/react-1387-scheduled-messages-schedule branch from 91bb21c to e6331d6 Compare November 3, 2026 09:07
@NikolaGoranNaumovski
NikolaGoranNaumovski force-pushed the feat/react-1388-scheduled-messages-list branch from 831f72f to 9d9b6c1 Compare November 3, 2026 09:07

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant