Skip to content

refactor: miscellaneous cleanup v10 - #3852

Merged
isekovanic merged 2 commits into
V10from
refactor/miscellaneous-cleanup-v10
Oct 12, 2026
Merged

isekovanic merged 2 commits into
V10from
refactor/miscellaneous-cleanup-v10

Conversation

@isekovanic

@isekovanic isekovanic commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

🎯 Goal

Fix the small bugs the V10 state cleanup audit found outside the main cleanup steps. Some are V10 regressions, some exist on develop as well. The branch also adds the perf gauntlet harness (perf/gauntlet/) and its skill, which we use to compare V10 with develop.

Linear ticket: https://linear.app/stream/issue/REACT-1223/miscellaneous-ui-sdk-bug-fixes-after-the-state-cleanup

🛠 Implementation details

Fixes

  • Plural count strings: messageList.newMessages.text, messageList.scrollToBottom.withCount.accessibilityLabel, channelPreview.unreadCount.accessibilityLabel, message.reactionList.more.accessibilityLabel and avatar.channel.group.accessibilityLabel are _one / _other keys. keys.ts is regenerated; the SampleApp German and Italian dictionaries, the key map and the a11y doc are updated.
  • useFetchReactions:
    • the reaction.* and offline_reactions.queried listeners ignore other messages;
    • the fetch no longer depends on the message object, so it doesn't refetch when the message changes;
    • it queries through client.queryReactionsAndHydrate.
  • MessageUserReactions: counts come from reaction_groups.
  • MessageHeader:
    • the "Saved for later" / reminder header choice moved into MessageReminderHeaderSwitch, which subscribes to the reminder's own state (remind_at);
    • it is mounted only when the message has a reminder, so other rows run the same hooks as before;
    • the comparator compares reminder instead of two booleans.
  • isMessageAIGenerated:
    • lives on ChatContext only, with a stable () => false default;
    • removed from ChannelProps, MessagesContextValue, MessageContextValue and MessageContent's props;
    • Message, MessageContent and MessageFooter read it from useChatContext().
  • useStickyHeaderDate: clears its dedupe ref when it hides the header.
  • MessageFlashList: when the content fits the window and there is no older page, the oldest message counts as on screen. FlashList keeps the offset from its initial scroll and never reports index 0 for short content.
  • useHandleLiveLocationEvents: returns early for message.updated events of other messages.
  • usePollAnswersPagination / usePollOptionVotesPagination: functional state updates; the listeners no longer depend on the votes array.
  • ThreadListUnreadBanner:
    • the error comes from client.threads.paginator.state (lastQueryError), since reload() records failures instead of throwing;
    • the error tile is pressable;
    • the pressable style is memoized.
  • ChannelDetailsBottomSheet: a DM's label reads the other member's user.online instead of watcherCount === 1.

Breaking changes (ai-docs/ai-migration-v9-to-v10.md Part Q)

  • Q.1: the five count strings are plural keys. A dictionary must provide the _one / _other forms; an override of the bare key no longer applies.
  • Q.3: isMessageAIGenerated is set on <Chat> only. Read it with useChatContext().

Perf gauntlet

  • Added:
    • perf/gauntlet/: the harness, which builds release APKs with React's profiling renderer for a base and a head ref, then runs ABBA sessions;
    • .claude/skills/perf-gauntlet/: the procedure;
    • pointers in AGENTS.md, perf/README.md and the perf-benchmarking skill.
  • Lint config: perf/gauntlet/ is ignored by ESLint (Node CommonJS scripts, an ES5 probe, exported baseline trees). Its generated output is in .prettierignore.
  • Nothing in the SDK or the SampleApp changes for it.

🎨 UI Changes

No layout changes. Visible differences: singular strings ("1 new message"), the DM "Online" / "Offline" label in the swipe sheet, the thread list retry tile, the reminder header switching in place, and no duplicate date in short FlashList channels.

iOS
Before After
Android
Before After

🧪 Testing

Perf: the gauntlet has successfully covered this branch entirely, as a good testing ground for the gauntlet as well.

☑️ Checklist

  • I have signed the Stream CLA (required)
  • PR targets the develop branch
  • Documentation is updated
  • New code is tested in main example apps, including all possible scenarios
    • SampleApp iOS and Android
    • Expo iOS and Android

@Stream-SDK-Bot

Copy link
Copy Markdown
Contributor

SDK Size

title develop branch diff status
js_bundle_size 2033 KB 2014 KB -19356 B 🚀

@isekovanic
isekovanic merged commit ee238ad into V10 Oct 12, 2026
4 of 5 checks passed
@isekovanic
isekovanic deleted the refactor/miscellaneous-cleanup-v10 branch October 12, 2026 10:58
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.

2 participants