Building a Real-Time Chat App with React Native: A Step-by-Step Tutorial

Creating a chat application using React Native involves building both the frontend user interface and the backend server for handling messages between users. In this tutorial, we’ll focus on the frontend part, assuming you have a backend API or server in place to handle message exchange.

Prerequisites:

  1. Node.js and npm installed on your system.
  2. React Native development environment set up (follow React Native documentation for setup).
  3. Basic knowledge of React and React Native.

Let’s get started with the tutorial and code example for the chat application using React Native:

Step 1: Set up the project Create a new React Native project using the following command:

npx react-native init ChatApp
cd ChatApp

Step 2: Install required dependencies Install the necessary dependencies for our chat app:

npm install axios react-native-gifted-chat @react-native-community/async-storage
  • axios is used to make HTTP requests to your backend API.
  • react-native-gifted-chat provides a ready-to-use chat UI component.
  • @react-native-community/async-storage allows us to store user information locally for a better user experience.

Step 3: Implement the Chat Screen Create a new file ChatScreen.js inside the src folder (create the folder if it doesn’t exist). The ChatScreen component will display the chat interface.

// src/ChatScreen.js
import React, { useState, useEffect } from 'react';
import { View, Platform, KeyboardAvoidingView } from 'react-native';
import { GiftedChat } from 'react-native-gifted-chat';
import axios from 'axios';

const SERVER_URL = 'YOUR_BACKEND_API_URL'; // Replace with your backend API URL

const ChatScreen = () => {
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    // Load previous messages from server on component mount
    loadMessages();
  }, []);

  const loadMessages = async () => {
    try {
      const response = await axios.get(`${SERVER_URL}/messages`);
      const messages = response.data.map((message) => ({
        _id: message.id,
        text: message.text,
        createdAt: new Date(message.createdAt),
        user: {
          _id: message.user.id,
          name: message.user.name,
        },
      }));
      setMessages(messages.reverse());
    } catch (error) {
      console.error('Error fetching messages:', error);
    }
  };

  const onSend = async (newMessages = []) => {
    setMessages((prevMessages) => GiftedChat.append(prevMessages, newMessages));
    try {
      await axios.post(`${SERVER_URL}/messages`, {
        text: newMessages[0].text,
        user: {
          id: 'USER_ID', // Replace with the user ID from your authentication system
          name: 'USERNAME', // Replace with the username or display name
        },
      });
    } catch (error) {
      console.error('Error sending message:', error);
    }
  };

  return (
    <View style={{ flex: 1 }}>
      <GiftedChat
        messages={messages}
        onSend={(newMessages) => onSend(newMessages)}
        user={{
          _id: 'USER_ID', // Replace with the user ID from your authentication system
          name: 'USERNAME', // Replace with the username or display name
        }}
      />
      {Platform.OS === 'android' && <KeyboardAvoidingView behavior="padding" />}
    </View>
  );
};

export default ChatScreen;

Step 4: App.js Setup Now, we need to modify the App.js file to include our ChatScreen component.

// App.js
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import ChatScreen from './src/ChatScreen';

const App = () => {
  return (
    <View style={styles.container}>
      <Text style={styles.header}>Chat App</Text>
      <ChatScreen />
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
  },
  header: {
    fontSize: 24,
    fontWeight: 'bold',
    textAlign: 'center',
    padding: 20,
    backgroundColor: '#f0f0f0',
  },
});

export default App;

Step 5: Running the App You can now run your React Native app on your emulator or physical device using the following command:

npx react-native run-android   # For Android
npx react-native run-ios       # For iOS

Ensure your backend API is running so that the chat messages can be exchanged between users.

Please note that this tutorial doesn’t cover the backend part or user authentication, so you’ll need to handle those aspects separately. Additionally, if you want real-time chat functionality, consider using WebSockets or a real-time messaging service like Firebase Cloud Messaging.

Remember to replace the placeholders (YOUR_BACKEND_API_URL, USER_ID, and USERNAME) with your actual backend API URL, user information, and authentication details.

With this example, you should have a simple chat application up and running in React Native. As you explore further, you can enhance the app with features like image sharing, message status (delivered, read), and more to make it a full-fledged chat application.

Leave a Comment

Your email address will not be published. Required fields are marked *

Let's Get in Touch

Read our customer feedback

Please fill in the form below.


    To top