DEV Community

Cover image for Creating Gladiator Rankings: A Comprehensive DevBlog
Gladiators Battle
Gladiators Battle

Posted on

Creating Gladiator Rankings: A Comprehensive DevBlog

Introduction

The Gladiator Rankings feature on GladiatorsBattle.com immerses users in the spirit of Ancient Rome, letting them rank, share, and discuss gladiators as if they were back in the Colosseum. Our goal was to create a highly interactive, visually engaging, and community-driven experience, combining historical significance with modern web design. In this article, we’ll break down our approach to creating this feature, the technical choices we made, the challenges we faced, and how we leveraged various tools and technologies to bring it all together.

Gladiator Rankings on GladiatorsBattle.com
Project Setup and Core Technologies
We chose a stack focused on simplicity, scalability, and real-time engagement, utilizing the following core technologies:

React: React’s component-based architecture was ideal for building a modular, reusable, and scalable UI. It allowed us to create custom components for each part of the ranking system, improving both maintainability and extensibility.

Firebase: Firebase covered our backend needs:

Firestore: A real-time, NoSQL database for storing and updating rankings, likes, and comments.
Firebase Auth: Managed user authentication and authorization seamlessly, allowing secure data access.
Firebase Storage: Hosted our gladiator images and other media assets.
React DnD: This library powered the drag-and-drop functionality, providing an intuitive ranking experience on desktop and an adaptable fallback for mobile.

React Helmet and JSON-LD: These were critical for SEO optimization, helping us structure metadata and enhance visibility in search engines.

Component Breakdown: Building the Ranking Interface with Drag-and-Drop
The ranking interface is the heart of the Gladiator Rankings feature. We aimed for a smooth, intuitive experience that would engage users from the moment they landed on the page. Let’s dive into each component and its functionality.

UserRanking.js: The Core Ranking Component
The UserRanking.js component is where users create, arrange, and publish their rankings. This component uses Firebase for image storage and Firestore for ranking storage.

Loading Gladiator Images: Images are asynchronously fetched from Firebase Storage. By using Firebase’s getDownloadURL, images load quickly and reliably, and we cache URLs to avoid unnecessary re-fetching.

useEffect(() => {
    const loadGladiatorImages = async () => {
        const storage = getStorage();
        const images = await Promise.all(gladiatorNames.map(async (name) => {
            const imageRef = ref(storage, `gladiators/${name}.webp`);
            return { name, imageUrl: await getDownloadURL(imageRef) };
        }));
        setGladiators(images);
    };
    loadGladiatorImages();
}, []);
Enter fullscreen mode Exit fullscreen mode

Drag-and-Drop Ranking: The useDrag and useDrop hooks from React DnD handle the drag-and-drop functionality. Each gladiator card is wrapped in a draggable component, and each category (e.g., S-tier, A-tier) serves as a drop target.

const handleDrop = (category, gladiator) => {
    setCategories(prevCategories => {
        const updatedCategories = { ...prevCategories };
        updatedCategories[category] = [...updatedCategories[category], gladiator];
        return updatedCategories;
    });
};
Enter fullscreen mode Exit fullscreen mode

This functionality enables dynamic updates, allowing users to continually refine their rankings and receive immediate feedback.

RankingCategory.js: Handling Drop Targets
The RankingCategory.js component registers each category as a drop target, updating its contents when a gladiator is dropped into it.

Feedback on Drop: The isOver state from useDrop provides visual feedback when a gladiator is dragged over a category, changing its background color. This enhances UX by showing where gladiators will be placed when dropped.

const [{ isOver }, drop] = useDrop(() => ({
    accept: 'GLADIATOR',
    drop: (item) => onDrop(item),
    collect: (monitor) => ({
        isOver: !!monitor.isOver(),
    }),
}));
Enter fullscreen mode Exit fullscreen mode

This visual feedback makes the user interface more intuitive and engaging.

Mobile Responsiveness: Alternative Selection for Mobile Users
Since drag-and-drop can be challenging on mobile devices, we implemented a fallback. Mobile users can tap a gladiator to open a modal where they can choose a category from a dropdown list, ensuring the feature is accessible on all devices.

Ranking Publication and Community Engagement
After creating a ranking, users can publish it for community engagement. This publication feature required several layers of functionality.

Publishing a Ranking
The handlePublish function in UserRanking.js stores a ranking in Firestore under the userRankings collection. Each ranking document includes the user ID, title, description, categories, and timestamp.

const handlePublish = async () => {
    const rankingData = {
        title,
        description,
        categories,
        userId: auth.currentUser.uid,
        createdAt: new Date(),
    };
    await addDoc(collection(db, 'userRankings'), rankingData);
};
Enter fullscreen mode Exit fullscreen mode

This function is asynchronous to ensure reliability. If a user isn’t logged in, we prompt them to authenticate, maintaining security and community integrity.

Viewing and Interacting with Published Rankings
Once published, a ranking is available for viewing, commenting, and liking. These interactions are crucial for creating a sense of community and engagement on GladiatorsBattle.com.

RankingDetail.js: Displaying Detailed View of Published Rankings
This component shows each gladiator’s position within a ranking, providing users with a detailed view.

Real-Time Updates with Firestore: Likes and comments update in real-time, thanks to Firestore’s capabilities, providing immediate feedback and boosting user interaction.
Like and Comment System
The LikeAndComment component allows users to interact with rankings via likes and comments, fostering engagement and discussion.

Like Toggling: We implemented a toggle feature that adds or removes a like in Firestore when clicked.

const handleLikeToggle = async () => {
    if (userLiked) {
        await deleteDoc(userLikeDocRef);
        setLikes(likes - 1);
    } else {
        await setDoc(userLikeDocRef, { userId: currentUser.uid });
        setLikes(likes + 1);
    }
};
Enter fullscreen mode Exit fullscreen mode

The likes and comments are displayed in real-time, adding to the interactive feel and ensuring users receive immediate acknowledgment.

Comment Pagination and Real-Time Engagement
Comments are fetched and displayed with real-time updates. To prevent long comment lists from affecting performance, we use pagination to manage comments, loading a limited number per page with navigation buttons.

Advanced Features and Enhancements
User Customization
We’re planning updates that allow users to filter gladiators by attributes like combat style or historical significance, offering a more tailored experience for enthusiasts.

Leaderboard for Popular Rankings
A leaderboard feature will highlight the most-liked and most-commented rankings, promoting friendly competition and encouraging thoughtful, high-quality rankings.

SEO and Structured Data for Enhanced Visibility
To increase visibility and drive organic traffic, we implemented SEO best practices:

Keyword Optimization: Each ranking includes keywords like “Gladiator Rankings,” “Ancient Rome Gladiators,” and “Arena Combat.”

JSON-LD Structured Data: JSON-LD structured data improves how our pages appear in search results.

<script type="application/ld+json">
    {JSON.stringify({
        "@context": "https://schema.org",
        "@type": "ItemList",
        "name": "Legendary Gladiator Ranking",
        "itemListElement": ranking.categories ? 
            Object.entries(ranking.categories).flatMap(([category, gladiators]) =>
                gladiators.map((gladiator, index) => ({
                    "@type": "ListItem",
                    "position": index + 1,
                    "name": gladiator.name,
                    "category": category
                }))
            ) : []
    })}
</script>
Enter fullscreen mode Exit fullscreen mode

This structured data helps Google better understand the page and increases its prominence in search results, attracting more visitors.

Technical Challenges and Solutions
Firebase Latency: Loading images and real-time data could introduce lag. We optimized this by caching image URLs locally and using batch-fetching for data.

Drag-and-Drop on Mobile: React DnD doesn’t support mobile drag-and-drop natively, so we developed a modal-based selection system for mobile users.

Spam Prevention: To prevent spammy interactions, we implemented rate limiting on likes and comments, maintaining a high-quality community experience.

Conclusion
Building Gladiator Rankings for Gladiators Battle has been an exciting journey of combining React, Firebase, and interactive design to bring the spirit of the Roman arena to life online. Leveraging Firebase's secure, real-time Firestore database, robust authentication, and cloud storage has enabled us to create a scalable, community-driven feature that seamlessly integrates player interactions. Additionally, using Firebase Hosting for deployment and GitHub Actions for continuous integration has streamlined the development process, allowing us to focus on enhancing the player experience.

The integration of Vertex AI opens new possibilities for evolving gameplay, introducing AI-driven opponents and challenges that add depth to the game and make the combat experience even more immersive. This fusion of historical strategy and modern technology allows players to engage with the world of ancient gladiators in a truly interactive way.

As we continue to refine Gladiator Rankings and expand the feature set on GladiatorsBattle.com, we’re excited to dive deeper into topics that are critical to real-time, interactive web applications. Upcoming articles will explore advanced techniques, such as optimizing Firebase authentication flows, handling large datasets with Firestore, and enhancing gameplay logic to create compelling user experiences. We’ll also share insights on bridging front-end and back-end services to support a seamless, responsive, browser-based environment.

Whether you're working on your own interactive web project or just interested in the tech behind Gladiators Battle, this series will provide valuable insights into building modern web applications. We’ll cover best practices, performance optimizations, and actionable advice on utilizing Firebase and AI to bring your ideas to life.

🔹 Discover More:

Explore Gladiators Battle: Dive into the world of Roman warriors and strategy gameplay at https://gladiatorsbattle.com/gladiator-ranking.
Check Out Our GitHub: Browse the codebase and documentation of Gladiators Battle on https://github.com/HanGPIErr/Gladiators-Battle-Documentation.
Connect on LinkedIn: Follow our journey and stay updated on future projects by connecting on https://www.linkedin.com/in/pierre-romain-lopez/.
By following along, you’ll gain an in-depth understanding of full-stack development with Firebase, learn how to integrate AI to enhance engagement, and see how thoughtful design can bring historical themes to life. Join us as we continue to merge history with modern technology, reimagining the battles of ancient Rome for the digital age, one development step at a time.

Top comments (0)