React Native Chat
⨠Featuresâ
- đ Dark mode & theming - full light/dark token system, switchable at runtime
- đ¤ Streaming AI messages - token-by-token replies with a typing caret and stop control
- đ Emoji reactions - long-press picker and reaction pills
- đĨ Video & audio messages - real inline playback, with a tappable fallback
- đī¸ Voice & video recording - Telegram-style hold-to-record notes (opt-in)
- đ Location messages - map card that opens the system maps app
- âŠī¸ Swipe to reply - reply preview and message threading
- đ Long-press actions - themed context menu anchored to the bubble
- ⥠Quick replies - bot-style reply buttons
- đ Smart link parsing - URLs, emails, phones, hashtags, mentions
- đ¤ Avatars - user initials or custom images
- âī¸ Typing indicator - show when someone is typing
- âŽī¸ Load earlier messages - pagination and infinite scroll
- âŦī¸ Scroll to bottom - quick jump back to the latest
- â Message status - ticks for sent, delivered and read
- đŦ System messages - in-line notifications
- đ Localized dates & i18n - Day.js dates, translated UI strings
- â¨ī¸ Keyboard handling - smart avoidance on every platform
- đ¨ Fully customizable - override any component with your own
- đą Expo & đ Web - works with Expo and react-native-web
- đ TypeScript - complete definitions, generic over your message type
Actively maintained, New Architecture ready, built for the latest Reanimated / Gesture Handler.
   Â
   Â
Quick startâ
npx expo install @kesha-antonov/react-native-chat react-native-reanimated react-native-gesture-handler react-native-safe-area-context react-native-keyboard-controller
import { useCallback, useState } from 'react'
import { Chat } from '@kesha-antonov/react-native-chat'
export function Example () {
const [messages, setMessages] = useState([
{
_id: 1,
text: 'Hello developer',
createdAt: new Date(),
user: { _id: 2, name: 'John Doe', avatar: 'https://placeimg.com/140/140/any' },
},
])
const onSend = useCallback((newMessages = []) => {
setMessages(previous => Chat.append(previous, newMessages))
}, [])
return <Chat messages={messages} onSend={onSend} user={{ _id: 1 }} />
}
That is the whole setup - everything below is optional.