Repository navigation
Releases
Releases · kesha-antonov/react-native-chat
6.1.5
6.1.4
📝 Docs
- The README's opening GIF loads from the release tag as well, like the feature showcase
6.1.3
📝 Docs
- The README's showcase GIFs load from the release tag, so the npm page shows the current ones instead of a cached copy
6.1.2
📝 Docs
- The feature showcase opens in the dark theme and switches to light, with a wider typing indicator
6.1.1
📝 Docs
- The README's Features section (and so the npm page) and the website's intro play an animated showcase of the chat's features, in light and dark
6.1.0
✨ Features
ChatHeader: the chat screen's bar to matchChatList(back arrow, avatar, name, "online" / "typing" status line, buttons); its status colors aretheme.chatList.headerSubtitle/headerSubtitleActivechatRefwithscrollToMessage(id, { animated, viewPosition, isHighlighted }), to move to a message from outside the chathighlightText/highlightTextStylemark words in every message's text, e.g. a search queryonRetryMessageadds "Retry" to your own failed messagestheme.textScalemultiplies every text size, for an app's own text-size settingbottomInsetfor a host that knows the composer's bottom inset better than the measurementattachments.pickers(gallery,camera,file) use the app's own pickers instead of the Expo ones, andattachments.isGalleryGridEnabled: falseleaves Gallery to the system picker (noREAD_MEDIA_IMAGESneeded)ChatList:timeFormat/dateFormatfor the rows' time and date,headerRightPosition: 'afterSearch'- A custom
renderFootergets the typing indicator as its second argument
🐛 Fixes
ChatList: a failed last message shows the red error badge instead of a check that read as sent- Android: the send and attach buttons' press ripple is round instead of a square around the circle
- With voice and video notes off, the send button stays in its slot (disabled while empty) instead of leaving a blank space
ChatList: swiping or dragging a row no longer copies the whole chat to the UI thread, which failed on aDateinlastMessage.createdAtlistPropshandlers the list uses itself (drag, momentum, content size, item size, metrics) run after its own instead of being dropped, andcontentContainerStyleadds to its padding- The chat measures its place in the window again as the keyboard opens, so a chat in a panel that slides in with a transform keeps the composer on the keyboard
- Android: the composer's text no longer drops a little on the first typed letter
Chatis memoized: a parent re-render with the same props no longer renders the conversation again
6.0.1
📝 Docs
- The README (and so the npm page) opens with a showcase of the example app's Chats demo
Full history: CHANGELOG.md
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