DEV Community

Cover image for Building a Scalable Web App with React, Firebase, and GitHub Actions
Gladiators Battle
Gladiators Battle

Posted on

Building a Scalable Web App with React, Firebase, and GitHub Actions

Creating a modern web application requires a combination of scalable technology and an efficient workflow. In this guide, we’ll delve into using React for the frontend, Firebase for backend services (including real-time data storage, authentication, and deployment), and GitHub Actions for continuous deployment. We’ll cover essential steps, such as setting up routes, implementing authentication, handling data storage, and automating deployment to Firebase Hosting. By the end of this article, you’ll have a comprehensive guide to setting up a solid foundation for your web application.

  1. Setting Up Routes with React Router React Router enables seamless navigation within a React application. With react-router-dom, we can define routes for each component or page, ensuring that users can navigate easily throughout the application.

Steps to Implement Routing
Install React Router:

npm install react-router-dom

Create a Router Component: Set up BrowserRouter in a separate component, AppRouter.js, to manage all routes. This provides a single place to define which components should render for each path.

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Home from './components/Home';
import Profile from './components/Profile';
import Login from './components/Login';

function AppRouter() {
    return (
        <Router>
            <Routes>
                <Route path="/" element={<Home />} />
                <Route path="/profile" element={<Profile />} />
                <Route path="/login" element={<Login />} />
            </Routes>
        </Router>
    );
}

export default AppRouter;
Enter fullscreen mode Exit fullscreen mode

Implementing Dynamic Routes: Use dynamic route parameters, such as "/game/:gameId", to load specific game content based on the URL. This is useful for any application that dynamically renders content based on user interactions or choices.

  1. Firebase Configuration and Project Setup Firebase is a powerful platform that offers real-time database capabilities, user authentication, serverless functions, and hosting services, all of which can significantly simplify backend setup.

Create a Firebase Project: Set up a new project in the Firebase Console to get access to Firebase services like Firestore, Authentication, and Functions.

Install Firebase SDK: To connect Firebase to the React application, install the Firebase SDK:

npm install firebase

Initialize Firebase: In firebaseConfig.js, initialize Firebase with your project credentials. This allows you to access Firebase services in any component of your application.

import { initializeApp } from 'firebase/app';
import { getFirestore } from 'firebase/firestore';
import { getAuth } from 'firebase/auth';

const firebaseConfig = {
    apiKey: "YOUR_API_KEY",
    authDomain: "YOUR_AUTH_DOMAIN",
    projectId: "YOUR_PROJECT_ID",
    storageBucket: "YOUR_STORAGE_BUCKET",
    messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
    appId: "YOUR_APP_ID"
};

const app = initializeApp(firebaseConfig);
export const db = getFirestore(app);
export const auth = getAuth(app);
Enter fullscreen mode Exit fullscreen mode

Setting Up Firebase Services: Initialize Firestore for data storage, Firebase Authentication for user management, and other services as needed.

  1. Implementing User Authentication and Saving User Data Firebase Authentication enables easy integration of secure user registration, login, and logout functionalities. Additionally, Firestore allows us to save user data, such as profile information, to provide a personalized experience.

User Authentication with Firebase
Enable Authentication in Firebase Console: Go to the Firebase Console, navigate to the Authentication section, and enable Email/Password sign-in (or other options as needed).

Define Authentication Functions: Create functions for registration, login, and logout in firebaseService.js. These functions will handle user authentication and save additional user data to Firestore.

import { createUserWithEmailAndPassword, signInWithEmailAndPassword, signOut } from 'firebase/auth';
import { auth, db } from './firebaseConfig';
import { doc, setDoc } from 'firebase/firestore';

// Register User
const registerUser = async (email, password, additionalData) => {
    try {
        const userCredential = await createUserWithEmailAndPassword(auth, email, password);
        const user = userCredential.user;

        // Save additional user data to Firestore
        await setDoc(doc(db, 'users', user.uid), {
            email: user.email,
            ...additionalData
        });
        return user;
    } catch (error) {
        console.error("Registration Error:", error);
    }
};

// Login User
const loginUser = async (email, password) => {
    try {
        const userCredential = await signInWithEmailAndPassword(auth, email, password);
        return userCredential.user;
    } catch (error) {
        console.error("Login Error:", error);
    }
};

// Logout User
const logoutUser = async () => {
    await signOut(auth);
};

export { registerUser, loginUser, logoutUser };
Enter fullscreen mode Exit fullscreen mode

Save User Data in Firestore: Upon registration, save additional user data in Firestore. This can include profile information or any specific settings related to the user, accessible across sessions.

  1. Building a Responsive Navbar and Footer Creating a Navbar and Footer ensures that users can navigate easily. Both components enhance accessibility and keep essential links readily available.

Create a Navbar Component
The Navbar links to primary routes and conditionally shows user options based on authentication status.

import { Link } from 'react-router-dom';
import { useAuth } from '../hooks/useAuth';

function Navbar() {
    const { user } = useAuth();

    return (
        <nav>
            <Link to="/">Home</Link>
            {user ? (
                <>
                    <Link to="/profile">Profile</Link>
                    <button onClick={handleLogout}>Logout</button>
                </>
            ) : (
                <Link to="/login">Login</Link>
            )}
        </nav>
    );
}

export default Navbar;
Enter fullscreen mode Exit fullscreen mode

Create a Footer Component
A Footer adds links to policies, contact information, and any social media links.

function Footer() {
    return (
        <footer>
            <p>&copy; 2023 Your App Name</p>
            <Link to="/privacy-policy">Privacy Policy</Link>
        </footer>
    );
}

export default Footer;
Enter fullscreen mode Exit fullscreen mode
  1. Developing the Homepage The homepage introduces your app, highlights its main features, and engages users with CTAs.
function Home() {
    return (
        <div className="homepage">
            <h1>Welcome to Your App</h1>
            <p>Explore the features and join us today.</p>
            <button>Play Now</button>
        </div>
    );
}

export default Home;
Enter fullscreen mode Exit fullscreen mode
  1. Automating Deployment with GitHub Actions and Firebase Hosting GitHub Actions can automate the deployment of your app to Firebase Hosting. Each time code is pushed to the main branch, GitHub Actions triggers the deployment process, ensuring your live app is always up to date.

Steps for CI/CD Deployment
Set Up Firebase Hosting in the Firebase Console.

Configure GitHub Actions: Create a .github/workflows/firebase-hosting.yml file to define your CI/CD workflow.

name: Deploy to Firebase Hosting

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Repository
      uses: actions/checkout@v2

    - name: Install Dependencies
      run: npm install

    - name: Build Application
      run: npm run build

    - name: Deploy to Firebase Hosting
      env:
        FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
      run: firebase deploy --only hosting
Enter fullscreen mode Exit fullscreen mode

Secure Firebase Token: Use firebase login:ci to create a Firebase token and add it to GitHub secrets for secure deployment.

  1. Testing and Deployment Verification Performing comprehensive testing ensures smooth deployment:

Functionality Testing: Verify that routes, authentication, and data storage work as expected.
Responsive Testing: Check the application’s usability across different devices.
Deployment Verification: Ensure your updates are successfully deployed on Firebase Hosting.

Conclusion
Building a dynamic, scalable web application with React and Firebase has provided a powerful foundation for Gladiators Battle. Leveraging Firebase's secure authentication, real-time Firestore database, and automated deployment through GitHub Actions has streamlined the development process and enabled us to create an engaging, real-time experience for players. Integrating Vertex AI adds another layer, delivering sophisticated, AI-driven interactions that enhance gameplay and bring the thrill of ancient gladiatorial combat to life.

If you're interested in diving deeper into the development journey, upcoming articles will explore advanced topics, such as enhancing authentication flows with Firebase, managing real-time data with Firestore, and refining game mechanics, including the strategies behind creating a compelling collectible card game. We’ll also cover how to efficiently bridge front-end and back-end services to support seamless, responsive interactions within a browser-based environment.

Whether you’re developing your own interactive web application or simply curious about the technology behind Gladiators Battle, this series will provide actionable insights and practical guidance. Each article will focus on best practices, performance optimization, and effective use of Firebase and AI to bring your ideas to life.

🔹 Discover More:

Visit Gladiators Battle: Explore the world of Roman warriors and strategic gameplay at gladiatorsbattle.com.
Explore Our GitHub: View the codebase and documentation for Gladiators Battle on GitHub.
Connect on LinkedIn: Follow for updates and insights into future projects and game development on LinkedIn.
By following this series, you’ll gain valuable insights into full-stack development with Firebase, as well as learn techniques for improving user engagement, incorporating AI, and enhancing the overall web experience. Join us as we continue building a unique blend of history and gameplay—bringing the arena battles of ancient Rome into the digital age, one development step at a time!

Top comments (0)