The most complete chat UI for React Native (formerly known as Gifted Messenger).
- Fully customizable components
- Composer actions (to attach photos, etc.)
- Load earlier messages
- Copy messages to clipboard
- Touchable links using react-native-parsed-text
- Avatar as user's initials
- Localized dates
- Multiline TextInput
- InputToolbar avoiding keyboard
- Use version
0.2.xfor RN>= 0.44.0 - Use version
0.1.xfor RN>= 0.40.0 - Use version
0.0.10for RN< 0.40.0
- Using npm:
npm install react-native-gifted-chat --save - Using Yarn:
yarn add react-native-gifted-chat
import { GiftedChat } from 'react-native-gifted-chat';
class Example extends React.Component {
state = {
messages: [],
};
componentWillMount() {
this.setState({
messages: [
{
_id: 1,
text: 'Hello developer',
createdAt: new Date(),
user: {
_id: 2,
name: 'React Native',
avatar: 'https://facebook.github.io/react/img/logo_og.png',
},
},
],
});
}
onSend(messages = []) {
this.setState((previousState) => ({
messages: GiftedChat.append(previousState.messages, messages),
}));
}
render() {
return (
<GiftedChat
messages={this.state.messages}
onSend={(messages) => this.onSend(messages)}
user={{
_id: 1,
}}
/>
);
}
}See example/App.js for a working demo!
e.g.
{
_id: 1,
text: 'My message',
createdAt: new Date(Date.UTC(2016, 5, 11, 17, 20, 0)),
user: {
_id: 2,
name: 'React Native',
avatar: 'https://facebook.github.io/react/img/logo_og.png',
},
image: 'https://facebook.github.io/react/img/logo_og.png',
// Any additional custom parameters are passed through
}messages(Array) - Messages to displaymessageIdGenerator(Function) - Generate an id for new messages. Defaults to UUID v4, generated by uuiduser(Object) - User sending the messages:{ _id, name, avatar }onSend(Function) - Callback when sending a messagelocale(String) - Locale to localize the datestimeFormat(String) - Format to use for rendering times; default is 'LT'dateFormat(String) - Format to use for rendering dates; default is 'll'isAnimated(Bool) - Animates the view when the keyboard appearsloadEarlier(Bool) - Enables the "Load earlier messages" buttononLoadEarlier(Function) - Callback when loading earlier messagesisLoadingEarlier(Bool) - Display anActivityIndicatorwhen loading earlier messagesrenderLoading(Function) - Render a loading view when initializingrenderLoadEarlier(Function) - Custom "Load earlier messages" buttonrenderAvatar(Function) - Custom message avatar; set tonullto not render any avatar for the messageonPressAvatar(Function(user)) - Callback when a message avatar is tappedrenderAvatarOnTop(Bool) - Render the message avatar at the top of consecutive messages, rather than the bottom (default)renderBubble(Function) - Custom message bubbleonLongPress(Function(context,message)) - Callback when a message bubble is long-pressed; default is to show an ActionSheet with "Copy Text" (see example usingshowActionSheetWithOptions())renderMessage(Function) - Custom message containerrenderMessageText(Function) - Custom message textrenderMessageImage(Function) - Custom message imageimageProps(Object) - Extra props to be passed to the<Image>component created by the defaultrenderMessageImagelightboxProps(Object) - Extra props to be passed to theMessageImage's LightboxrenderCustomView(Function) - Custom view inside the bubblerenderDay(Function) - Custom day above a messagerenderTime(Function) - Custom time inside a messagerenderFooter(Function) - Custom fixed bottom view, e.g. "User is typing..."; see example/App.js for an examplerenderInputToolbar(Function) - Custom message composer containerrenderComposer(Function) - Custom text input message composerrenderActions(Function) - Custom action button on the left of the message composerrenderSend(Function) - Custom send buttonrenderAccessory(Function) - Custom second line of actions below the message composeronPressActionButton(Function) - Callback when the Action button is pressed (if set, the defaultactionSheetwill not be used)bottomOffset(Integer) - Distance of the chat from the bottom of the screen (e.g. useful if you display a tab bar)minInputToolbarHeight(Integer) - Minimum height of the input toolbar; default is44listViewProps(Object) - Extra props to be passed to the messages<ListView>; some props can't be overridden, see the code inMessageContainer.render()for detailskeyboardShouldPersistTaps(Enum) - Determines whether the keyboard should stay visible after a tap; see<ScrollView>docsonInputTextChanged(Function) - Callback when the input text changesmaxInputLength(Integer) - Max message composer TextInput length
If you are using Create React Native App / Expo, no Android specific installation steps are required -- you can skip this seciton. Otherwise we recommend modifying your project configuration as follows.
-
Make sure you have
android:windowSoftInputMode="adjustResize"in yourAndroidManifest.xml:<activity android:name=".MainActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustResize" android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
-
If you plan to use
GiftedChatinside aModal, see #200.
You can use wml to keep the example app in sync
with any changes you make to the library during development. Steps:
- Install it:
npm install -g wml - Configure it:
wml add . example/node_modules/react-native-gifted-chatfrom the root directory cd examplenpm startwml startin another terminal window (doesn't matter where)
Note that it's important for wml start to come after npm start, or you'll get Can't find entry file index.js errors.
If you have any issues, you can clear your watches using watchman watch-del-all and try again.
Feel free to ask me questions on Twitter @FaridSafi!

