Introduction
Hey there! I'm Aadarsh Verma,
Here's the thing - I started this cool project because everyone in my class was doing the same old web applications with HTML, CSS, JS. I wanted to stand out, to be that guy who takes a different route. So I decided to develop a mobile app! 
Sure, I could've chosen Java or Kotlin, but who has time for that when you're juggling college assignments, right? That's when I discovered React Native - same JavaScript foundation, but for mobile apps! Win-win! 🎯
My React Native Journey
Let me be real with you - I failed multiple times trying to build this Google Auth + CRUD app. The lack of proper tutorials, mentors, and clear guidance was frustrating. But you know what? I had two secret weapons: determination and the official React Native Firebase documentation!
Building FireApp (Yes, I named it after myself 😎)
Let's jump right in and create our React Native app with Firebase integration.
Step 1: Setting Up Your React Native Project
// I'm using Bare React Native
// Open your terminal and run:
npx react-native init fireApp
// This command will download all necessary files and dependencies
Step 2: Adding Firebase to Your React Native Project
First, install the required packages:
# Install Firebase core
npm install @react-native-firebase/app
# For Google Authentication
npm install @react-native-firebase/auth
npm install @react-native-google-signin/google-signin
# For Realtime Database
npm install @react-native-firebase/database
Step 3: Firebase Setup in Firebase Console
- Go to Firebase Console
 - Create a new project (name it "FireApp" 🔥)
 - Add Android/iOS app to your project
 - Download 
google-services.json(Android) orGoogleService-Info.plist(iOS) - Place these files in their respective folders
 
Step 4: Configuring Google Authentication
import { GoogleSignin } from '@react-native-google-signin/google-signin';
import auth from '@react-native-firebase/auth';
// Initialize Google Sign In
GoogleSignin.configure({
  webClientId: 'YOUR_WEB_CLIENT_ID', // from Firebase Console
});
// Sign In function
const signInWithGoogle = async () => {
  try {
    const { idToken } = await GoogleSignin.signIn();
    const googleCredential = auth.GoogleAuthProvider.credential(idToken);
    await auth().signInWithCredential(googleCredential);
    console.log('Signed in with Google!');
  } catch (error) {
    console.error(error);
  }
};
Step 5: Setting Up Firebase Realtime Database
import database from '@react-native-firebase/database';
// Create (Add Data)
const addData = async (key, value) => {
  try {
    await database()
      .ref(`/users/${key}`)
      .set({
        name: value,
        age: 20,
        timestamp: database.ServerValue.TIMESTAMP
      });
    console.log('Data added successfully!');
  } catch (error) {
    console.error(error);
  }
};
// Read (Fetch Data)
const readData = async () => {
  try {
    const snapshot = await database().ref('/users').once('value');
    const data = snapshot.val();
    console.log('User data: ', data);
  } catch (error) {
    console.error(error);
  }
};
// Update Data
const updateData = async (key, newValue) => {
  try {
    await database()
      .ref(`/users/${key}`)
      .update({
        name: newValue,
        lastUpdated: database.ServerValue.TIMESTAMP
      });
    console.log('Data updated successfully!');
  } catch (error) {
    console.error(error);
  }
};
// Delete Data
const deleteData = async (key) => {
  try {
    await database()
      .ref(`/users/${key}`)
      .remove();
    console.log('Data deleted successfully!');
  } catch (error) {
    console.error(error);
  }
};
Step 6: Creating a Complete App Component
import React, { useState, useEffect } from 'react';
import { View, Text, Button, TextInput } from 'react-native';
import auth from '@react-native-firebase/auth';
import database from '@react-native-firebase/database';
import { GoogleSignin } from '@react-native-google-signin/google-signin';
const FireApp = () => {
  const [user, setUser] = useState(null);
  const [text, setText] = useState('');
  const [data, setData] = useState(null);
  useEffect(() => {
    // Listen for authentication state to change
    const subscriber = auth().onAuthStateChanged(setUser);
    return subscriber; // unsubscribe on unmount
  }, []);
  const signInWithGoogle = async () => {
    // ... (Google sign in code from above)
  };
  const signOut = async () => {
    try {
      await auth().signOut();
      console.log('User signed out!');
    } catch (error) {
      console.error(error);
    }
  };
  // CRUD Operations
  const handleCreate = () => {
    if (user && text) {
      addData(user.uid, text);
      setText('');
    }
  };
  const handleRead = async () => {
    if (user) {
      const snapshot = await database().ref(`/users/${user.uid}`).once('value');
      setData(snapshot.val());
    }
  };
  const handleUpdate = () => {
    if (user && text) {
      updateData(user.uid, text);
      setText('');
    }
  };
  const handleDelete = () => {
    if (user) {
      deleteData(user.uid);
      setData(null);
    }
  };
  return (
    <View style={{ padding: 20 }}>
      {user ? (
        <>
          <Text>Welcome, {user.email}</Text>
          <Button title="Sign Out" onPress={signOut} />
          <TextInput
            value={text}
            onChangeText={setText}
            placeholder="Enter data"
            style={{ borderWidth: 1, marginTop: 20, padding: 10 }}
          />
          <View style={{ marginTop: 20 }}>
            <Button title="Create" onPress={handleCreate} />
            <Button title="Read" onPress={handleRead} />
            <Button title="Update" onPress={handleUpdate} />
            <Button title="Delete" onPress={handleDelete} />
          </View>
          {data && (
            <Text style={{ marginTop: 20 }}>
              Current Data: {JSON.stringify(data, null, 2)}
            </Text>
          )}
        </>
      ) : (
        <Button title="Sign In with Google" onPress={signInWithGoogle} />
      )}
    </View>
  );
};
export default FireApp;
Pro Tips from My Experience 💡
- Error Handling: Always wrap Firebase operations in try-catch blocks
 - Authentication State: Use listeners to track auth state changes
 - Database Security: Set up proper Firebase rules
 - Offline Support: Firebase Realtime Database has built-in offline support!
 - Debug Mode: Enable Firebase debug mode during development
 
Common Pitfalls I Encountered
- Forgetting to configure SHA-1 fingerprint for Android
 - Not enabling Google Sign-In in Firebase Console
 - Firebase rules too restrictive (or too open!)
 - Mixing promises with async/await
 
Resources That Saved My Life 🙏
- React Native Firebase Documentation
 - Firebase Console
 - React Native Google SignIn Docs
 - Stack Overflow (obviously!)
 - Firebase YouTube Channel
 
Conclusion
Building FireApp was challenging but incredibly rewarding. React Native with Firebase is a powerful combination for creating cross-platform mobile apps. Remember, every expert was once a beginner. Keep coding, keep failing, and most importantly, keep learning!
Go build something amazing! 🚀
P.S.: If you're stuck somewhere, DM me on LinkedIn or check out my GitHub for the complete source code!
#ReactNative #Firebase #MobileDevelopment #Authentication #CRUD #IndianDevelopers
    
Top comments (0)