Repository navigation
6.0.0
A new default look and built-in messenger features: emoji keyboard, attachment menu, link previews, multi-select, media transfer states, and reworked voice and round video notes.
💥 Breaking
- FlashList support removed (
isFlashListEnabled, the@shopify/flash-listpeer): it stopped drawing after fast flings on Android - The message list is Legend List instead of
FlatList(far fewer dropped frames).listPropstakes Legend List props,messagesContainerRefis aLegendListRef, and the list renders oldest first (indexes count from the oldest;onEndReachedfires at the newest) - New default look (gradient outgoing bubbles, wallpaper, tails, inline time, in-bubble reactions, name colors, floating composer); restore any of it through
theme/darkTheme - Requires
react-native-gesture-handler3, React Native 0.82+ and React 19; components rendered outsideChatneed aGestureHandlerRootView - Round video notes require
react-native-vision-camera5 (with nitro modules / image) and expo-video'screateVideoPlayer; add the camera and microphone permission keys - The native attachment sheet requires
@lodev09/react-native-true-sheet3+ - On by default (with an opt-out): voice and round notes once their peers are installed (
audioRecording/videoRecording={false}), emoji button and paperclip (emojiKeyboard/attachments={false}), long-press menu (defaultMessageActions={false}), swipe-to-reply (reply.swipe.isEnabled: false), scroll-to-bottom button (isScrollToBottomEnabled={false}), reactions expand button (reactions.renderExpandedPicker={null}), big emoji (theme.bubble.bigEmojiMaxCount: 0), empty-chat greeting (renderChatEmpty) - The send / record button sits outside the composer's capsule; a custom
renderSendgoes there too - The long-press menu opens beside the finger after 0.4s; Delete is no longer red; actions run after it closes
reply.swipe.renderActiongetsprogressas distance over 50ptscrollToBottomOffsetdefaults to100- Avatars and sender names show in group chats only (
isAvatarVisible,isGroupChat) isInfiniteScrollEnabledshows a loading cell;activityIndicatorSizeis ignoredreactions.isEnableddefaults to on whenonReactionPressis passed; tapping a reply quote jumps to it unlessreply.onPressis set- Voice notes: round notes don't autoplay (
mediaPlayback.isRoundVideoAutoplayEnabled), the unread dot readsisMediaUnread, takes of 700ms or less are dropped,theme.voicethresholds changed, speed control moved to the "now playing" bar textInputRefis typedRefObject<ComponentRef<typeof TextInput> | null>
✨ Features
- Round video notes pause and resume into the same video; the paused circle holds its last frame (Android)
- Swipe between all of a chat's photos in the viewer, with counter, caption, sender and date; pinch / double-tap to zoom (
mediaViewerCounter,mediaViewerDatelabels) - Slide along the emoji category strip
- Reaction pills show who reacted (
reactions.getUser); up to three reactions per person (Chat.toggleReaction,{ maxPerUser }) - A round note keeps playing in the long-press menu
TypingStatusfor headers and list rows (TypingAction,getTypingText)- Drafts (
onDraftChange), kept aside while editing ChatListanduseChatList: search, selection, archive, swipe to archive, pinned chats, unread, typing, drafts- Built-in emoji keyboard (
emojiKeyboard,EmojiGrid) and attachment menu (attachments,AttachmentMenu) - File messages (
IMessage.file,MessageFile) and link previews (IMessage.linkPreview,fetchLinkPreview,LinkPreviewCard) - Media transfer states: progress, cancel, download (
IMessage.transfer,isDownloadRequired,mediaTransfer) isLoadingspinner over an empty chat- Multi-select (
onSelectionChange,onForwardMessages,onDeleteMessages,renderSelectionBar) - "Unread Messages" bar (
firstUnreadMessageId,UnreadSeparator) - Default message actions Reply, Copy, Forward, Pin, Edit, Select, Delete (
defaultMessageActions); amessageActionsfunction receives them - Edit mode, "edited" mark, failed status badge
- Voice and round notes: lock, pause, resume, trim, send animations, waveform bubbles, floating round note, "now playing" bar, auto-play next, playback speed, view once, transcription, raise to listen, server waveforms
useChatMessages,reply.isEnabled,reply.onReply,isGroupChat,isAvatarVisible,getChatCapabilities()- Wallpaper (
theme.wallpaper,renderWallpaper) and screen-fixed outgoing gradient - New theme tokens, icons, exports and labels in all 15 locales
⚡ Performance
lib/is compiled with the React Compiler, so every app gets its memoization- Rows render only what changed: a send, status tick, reaction or streamed token re-renders one row
- A keystroke, reply, edit or recording tick re-renders only the composer (or just the timer), not
Chator the rows - Selection, highlights, link previews and the unread bar wake only the rows they concern
- Chats open faster: menus, recorders, the attachment menu and swipe arrows mount on first use; messages paint a frame after the composer
- Cheaper rows and gradient: cached day labels and times, shared themed styles, one colour-scheme subscription
- Voice and round-note progress runs on the UI thread
🐛 Fixes
- Round video notes play on a finger tap on Android
- Round video notes record on Android again (a zoom or torch error no longer ends the take)
- A round note's time pill is no longer cut under the circle
- No Reanimated "Reading from
valueduring component render" warning with the React Compiler - A photo grouped under its sender's previous message no longer pokes past the bubble's corner
ChatList: failed avatars fall back to initials, failed thumbnails are dropped, Android rows no longer clip text- Emoji categories answer a tap mid-scroll
- Gradient bubbles are no longer one colour on iOS
- A chat opens with its rows in place on Android
- A custom
renderChatEmptyis no longer upside down - Streamed markdown replies show text as it arrives
- Switching light / dark no longer scrolls the chat
- The long-press menu follows its message and no longer covers it
- A long-press on media no longer also opens it on release
- RTL for the context menu and reaction picker
- Many smaller animation, layout and Android fixes
📦 Dependencies
- New optional peers:
@react-native-async-storage/async-storage,expo-media-library,expo-document-picker,expo-location,expo-sharing,expo-image,expo-clipboard,@react-native-clipboard/clipboard - Toolchain: React Native 0.88.1, React 19.3.1, gesture-handler 3.4.0, Reanimated 4.7.1, worklets 0.13.1, Jest 30, ESLint 10
📲 Example app
- New Chats tab: a small messenger on
ChatListwith profiles, archive, typing and an AI bot - Demo messages go through sending, sent and read
- Native tabs; Expo SDK 58; runs on Android
- Demo photos from Unsplash
- Examples slimmed to defaults plus what each shows
📝 Docs
- New README screenshots; README covers the new features, peers and permissions
- Troubleshooting: iOS 26 blur, "Cannot read property 'Chat' of undefined", bare React Native setup
- README, streaming guide and migration guide cover the photo viewer, round-note pause, app-owned status, Stop button,
forceRTL, theme tokens and building blocks
Upgrading from 5.x: see the 💥 Breaking list above and docs/MIGRATION.md.
Full history: CHANGELOG.md