Files
adopt-a-street/frontend/src/components/Navbar.js
T
William Valentin 3e4c730860 feat: implement comprehensive gamification, analytics, and leaderboard system
This commit adds a complete gamification system with analytics dashboards,
leaderboards, and enhanced badge tracking functionality.

Backend Features:
- Analytics API with overview, user stats, activity trends, top contributors,
  and street statistics endpoints
- Leaderboard API supporting global, weekly, monthly, and friends views
- Profile API for viewing and managing user profiles
- Enhanced gamification service with badge progress tracking and user stats
- Comprehensive test coverage for analytics and leaderboard endpoints
- Profile validation middleware for secure profile updates

Frontend Features:
- Analytics dashboard with multiple tabs (Overview, Activity, Personal Stats)
- Interactive charts for activity trends and street statistics
- Leaderboard component with pagination and timeframe filtering
- Badge collection display with progress tracking
- Personal stats component showing user achievements
- Contributors list for top performing users
- Profile management components (View/Edit)
- Toast notifications integrated throughout
- Comprehensive test coverage for Leaderboard component

Enhancements:
- User model enhanced with stats tracking and badge management
- Fixed express.Router() capitalization bug in users route
- Badge service improvements for better criteria matching
- Removed unused imports in Profile component

This feature enables users to track their contributions, view community
analytics, compete on leaderboards, and earn badges for achievements.

🤖 Generated with OpenCode

Co-Authored-By: AI Assistant <noreply@opencode.ai>
2025-11-03 13:53:48 -08:00

67 lines
2.0 KiB
JavaScript

import React, { useContext } from 'react';
import { Link } from 'react-router-dom';
import { AuthContext } from '../context/AuthContext';
const Navbar = () => {
const { auth, logout } = useContext(AuthContext);
const authLinks = (
<ul className="navbar-nav ml-auto">
<li className="nav-item">
<Link className="nav-link" to="/map">Map</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/tasks">Tasks</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/feed">Feed</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/events">Events</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/rewards">Rewards</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/leaderboard">Leaderboard</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/analytics">Analytics</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/profile">Profile</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/premium">Premium</Link>
</li>
<li className="nav-item">
<a onClick={logout} href="#!" className="nav-link">Logout</a>
</li>
</ul>
);
const guestLinks = (
<ul className="navbar-nav ml-auto">
<li className="nav-item">
<Link className="nav-link" to="/register">Register</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/login">Login</Link>
</li>
</ul>
);
return (
<nav className="navbar navbar-expand-sm navbar-dark bg-dark mb-4">
<div className="container">
<Link className="navbar-brand" to="/">Adopt-a-Street</Link>
<div className="collapse navbar-collapse">
{auth.isAuthenticated ? authLinks : guestLinks}
</div>
</div>
</nav>
);
};
export default Navbar;