react-native-gifted-chat README

The project's README from github.com/FaridSafi/react-native-gifted-chat. As one markdown file: README.md.

npm version npm downloads build platforms TypeScript Expo compatible

React Native Gifted Chat

The most complete chat UI for React Native & Web

Try GiftedChat on Expo Snack

[!NOTE] Active development has moved. This package is now in maintenance mode and isn't receiving new features. Development continues - including streaming AI messages and the latest fixes - in a maintained fork: @kesha-antonov/react-native-chat. New projects are encouraged to use it; migrating is mostly a rename (see the fork's migration guide).


✨ Features

         


Sponsors

Le Reacteur - Coding Bootcamp in Paris co-founded by Farid Safi
Stream - Scalable chat API/Server written in Go (API Tour | Tutorial)
Ethora - A complete app engine featuring GiftedChat (GitHub)

📚 React Key Concepts (2nd ed.)


📖 Table of Contents


📋 Requirements

Requirement Version
React Native >= 0.70.0
iOS >= 13.4
Android API 21+ (Android 5.0)
Expo SDK 50+
TypeScript >= 5.0 (optional)

📦 Installation

Expo Projects

npx expo install react-native-gifted-chat react-native-reanimated react-native-gesture-handler react-native-safe-area-context react-native-keyboard-controller

Bare React Native Projects

Step 1: Install the packages

Using yarn:

yarn add react-native-gifted-chat react-native-reanimated react-native-gesture-handler react-native-safe-area-context react-native-keyboard-controller

Using npm:

npm install --save react-native-gifted-chat react-native-reanimated react-native-gesture-handler react-native-safe-area-context react-native-keyboard-controller

Step 2: Install iOS pods

npx pod-install

Step 3: Configure react-native-reanimated

Follow the react-native-reanimated installation guide to add the Babel plugin.


🚀 Usage

Basic Example

import React, { useState, useCallback, useEffect } from 'react'
import { GiftedChat } from 'react-native-gifted-chat'
import { useHeaderHeight } from '@react-navigation/elements'

export function Example() {
  const [messages, setMessages] = useState([])

  // keyboardVerticalOffset = distance from screen top to GiftedChat container
  // useHeaderHeight() returns status bar + navigation header height
  const headerHeight = useHeaderHeight()

  useEffect(() => {
    setMessages([
      {
        _id: 1,
        text: 'Hello developer',
        createdAt: new Date(),
        user: {
          _id: 2,
          name: 'John Doe',
          avatar: 'https://placeimg.com/140/140/any',
        },
      },
    ])
  }, [])

  const onSend = useCallback((messages = []) => {
    setMessages(previousMessages =>
      GiftedChat.append(previousMessages, messages),
    )
  }, [])

  return (
    <GiftedChat
      messages={messages}
      onSend={messages => onSend(messages)}
      user={{
        _id: 1,
      }}
      keyboardAvoidingViewProps={{ keyboardVerticalOffset: headerHeight }}
    />
  )
}

💡 Tip: Check out more examples in the example directory including Slack-style messages, quick replies, and custom components.


📊 Data Structure

Messages, system messages, and quick replies follow the structure defined in Models.ts.

Message Object Structure
interface IMessage {
  _id: string | number
  text: string
  createdAt: Date | number
  user: User
  image?: string
  video?: string
  audio?: string
  system?: boolean
  sent?: boolean
  received?: boolean
  pending?: boolean
  quickReplies?: QuickReplies
}

interface User {
  _id: string | number
  name?: string
  avatar?: string | number | (() => React.ReactNode)
}

📖 Props Reference

Core Configuration

Refs

Keyboard & Layout

Understanding keyboardVerticalOffset

The keyboardVerticalOffset tells the KeyboardAvoidingView where its container starts relative to the top of the screen. This is essential when GiftedChat is not positioned at the very top of the screen (e.g., when you have a navigation header).

Default value: insets.top (status bar height from useSafeAreaInsets()). This works correctly only when GiftedChat fills the entire screen without a navigation header. If you have a navigation header, you need to pass the correct offset via keyboardAvoidingViewProps.

What the value means: The offset equals the distance (in points) from the top of the screen to the top of your GiftedChat container. This typically includes:

How to use:

import { useHeaderHeight } from '@react-navigation/elements'

function ChatScreen() {
  // useHeaderHeight() returns status bar + navigation header height on iOS
  const headerHeight = useHeaderHeight()

  return (
    <GiftedChat
      keyboardAvoidingViewProps={{ keyboardVerticalOffset: headerHeight }}
      // ... other props
    />
  )
}

Note: useHeaderHeight() requires your chat component to be rendered inside a proper navigation screen (not conditional rendering). If it returns 0, ensure your chat screen is a real navigation screen with a visible header.

Why this matters: Without the correct offset, the keyboard may overlap the input field or leave extra space. The KeyboardAvoidingView uses this value to calculate how much to shift the content when the keyboard appears.

Using your own KeyboardProvider

By default GiftedChat wraps itself in a KeyboardProvider with statusBarTranslucent and navigationBarTranslucent enabled. On some Android/Expo (edge-to-edge) setups this can cause the screen to shift down, flicker on mount, or distort a navigation header - especially when another KeyboardProvider already exists higher in the tree.

Set disableKeyboardProvider to skip the built-in wrapper:

import { KeyboardProvider } from 'react-native-keyboard-controller'

// Mount a single KeyboardProvider once, near the root of your app
function App() {
  return (
    <KeyboardProvider>
      {/* ...navigation / screens... */}
    </KeyboardProvider>
  )
}

function ChatScreen() {
  return (
    <GiftedChat
      disableKeyboardProvider
      // ... other props
    />
  )
}

Important: GiftedChat's keyboard avoidance relies on a KeyboardProvider being present in the tree. When you set disableKeyboardProvider, you must mount your own KeyboardProvider above GiftedChat - otherwise the keyboard will cover the input. Mounting exactly one provider (yours) is what avoids the double edge-to-edge shift.

Text Input & Composer

Actions & Action Sheet

Messages & Message Container

Message Bubbles & Content

react-native-gifted-chat (FaridSafi/react-native-gifted-chat)

Searching Database…

Что это?react-native-gifted-chat — это библиотека компонентов для интерфейса чата на React Native, которую можно очень гибко настраивать. Поддерживаются React Native Web и Expo. Из коробки есть аватары, индикаторы набора текста, реакции эмодзи, быстрые ответы и многое другое.
Это готовое приложение для переписки или то, что я добавляю в своё приложение?Это библиотека компонентов для React Native: вы устанавливаете её и встраиваете в экраны своего приложения, а не получаете готовое приложение для переписки.
Как добавить это в проект на React Native?Установите пакет через yarn или npm вместе с необходимыми зависимостями, выполните `pod install` для iOS и настройте плагин Babel для react-native-reanimated, как описано в его собственном руководстве по установке. В проектах Expo установка немного отличается, это показано в разделе про Expo.
Какие версии React Native, iOS и Android нужны?Нужны React Native 0.70+, iOS 13.4+, Android API 21+ (Android 5.0) и Expo SDK 50+, если вы используете Expo. TypeScript 5.0+ необязателен.
Продолжается ли активная разработка этого проекта?Нет, проект переведён в режим поддержки, новые функции в нём не добавляются. Автор рекомендует для дальнейшей разработки форк сообщества @kesha-antonov/react-native-chat, а переход на него в основном сводится к переименованию.
Работает ли это в вебе или только на iOS и Android?Работает на iOS, Android и в вебе через react-native-web, а также легко интегрируется с проектами Expo.
Можно ли настроить отдельные части интерфейса чата?Почти любую часть можно заменить собственным компонентом через свойства render*: пузыри сообщений, поле ввода, кнопку отправки, аватары, всплывающее меню действий, а также отрисовщики текстовых, графических, видео- и аудиосообщений.
Есть ли поддержка отметок о прочтении и индикаторов набора текста?Да, есть индикатор набора текста и статусы в виде галочек для состояний «отправлено», «доставлено» и «прочитано», а также свайп для ответа, реакции эмодзи и кнопки быстрых ответов в стиле бота.
Что происходит с экранной клавиатурой?GiftedChat сам оборачивается в KeyboardProvider для автоматического сдвига при появлении клавиатуры, но в некоторых настройках Android/Expo с режимом edge-to-edge это может вызывать мерцание или смещение вёрстки. Можно отключить встроенный провайдер и подключить свой.
Creator
FaridSafi
Size
52.5 MB
Stars
14.4K
Age
10y
Commits · 90 Days