link,[object Object]
Skip to content

Routing Structure ​

Route Organization ​

AcqMarketplace uses React Router v6 with a centralized route definition in src/components/routing/AppRoutes.tsx. All routes are wrapped with the AppLayout component for consistent navigation and footer.

Route Map ​

Based on src/components/routing/AppRoutes.tsx, here are all available routes:

Public Routes ​

RouteComponentDescriptionLayout
/IndexHomepage with featured listingsAppLayout
/exploreExploreBrowse all listings with filtersAppLayout
/listing/:idListingDetailIndividual listing detailsAppLayout
/authAuthLogin/register pageAppLayout
/auth/confirmAuthConfirmEmail confirmationNone
/auth/update-passwordUpdatePasswordPassword reset formAppLayout
/reset-passwordResetPasswordPassword reset requestAppLayout
/how-it-worksHowItWorksPlatform explanationAppLayout
/how-to-buy-sellHowToBuySellUser guidesAppLayout
/faqFAQFrequently asked questionsAppLayout
/blogBlogBlog post listingAppLayout
/blog/:slugBlogPostIndividual blog postAppLayout
/profile/:idPublicProfilePublic user profileAppLayout
/page/:slugSimplePageCMS-managed pagesAppLayout

Protected Routes (Authenticated Users) ​

RouteComponentGuardDescription
/buyer-dashboardBuyerDashboardProtectedRouteBuyer's main dashboard
/seller-dashboardSellerDashboardProtectedRouteSeller's main dashboard
/seller-verificationSellerVerificationProtectedRouteSeller verification form
/profile-verificationProfileVerificationProtectedRouteProfile verification form
/create-listingCreateListingProtectedRouteCreate new business listing
/messages/*MessagesProtectedRouteMessaging system
/notificationsNotificationsProtectedRouteUser notifications
/notification/:idNotificationDetailProtectedRouteIndividual notification
/my-offersMyOffersProtectedRouteUser's offers (buy/sell)
/my-listingsMyListingsProtectedRouteSeller's listings
/transactionsTransactionHistoryProtectedRouteTransaction history
/watchlistWatchlistProtectedRouteSaved listings
/account-settingsAccountSettingsProtectedRouteUser settings
/contact-adminContactAdminProtectedRouteContact admin form
/invoice-historyInvoiceHistoryProtectedRouteBilling history
/price-alertsPriceAlertsProtectedRoutePrice alert management
/activitiesActivitiesProtectedRouteUser activity log
/dashboard/pricingDashboardPricingProtectedRouteSubscription management
/deal-new/:idDealNewProtectedRouteNew deal creation
/deal/:idDealPageProtectedRouteDeal management
/listing/:id/commentsListingWithCommentsPageProtectedRouteListing admin comments

Admin Routes (Admin Users Only) ​

RouteComponentGuardDescription
/adminAdminDashboardAdminProtectedRouteAdmin main dashboard
/admin/usersAdminUsersAdminProtectedRouteUser management
/admin/listingsAdminListingsAdminProtectedRouteListing moderation
/admin/listings/:idAdminListingEditAdminProtectedRouteEdit individual listing
/admin/listings/:id/detailsAdminListingsDetailAdminProtectedRouteListing details view
/admin/offersAdminOffersAdminProtectedRouteOffer management
/admin/reportsAdminReportsAdminProtectedRouteUser reports
/admin/transactionsAdminTransactionsAdminProtectedRouteTransaction oversight
/admin/deal/:idDealPageAdminProtectedRouteDeal administration
/admin/analyticsAdminAnalyticsAdminProtectedRoutePlatform analytics
/admin/blogAdminBlogAdminProtectedRouteBlog management
/admin/blog/:idAdminBlogDetailAdminProtectedRouteEdit blog post
/admin/pagesAdminPagesAdminProtectedRouteCMS page management
/admin/profile-verificationsAdminSellerVerificationsAdminProtectedRouteVerification requests
/admin/subscription-plansAdminSubscriptionPlansAdminProtectedRouteSubscription management
/admin/storageAdminStorageAdminProtectedRouteFile storage management
/admin/sitemapAdminSitemapAdminProtectedRouteSEO sitemap tools
/admin/settingsAdminSettingsAdminProtectedRoutePlatform settings
/admin/logsAdminLogsAdminProtectedRouteSystem logs
/admin/message-historyAdminMessageHistoryAdminProtectedRouteMessage moderation
/admin/price-alertsAdminPriceAlertsAdminProtectedRoutePrice alert admin
/admin/templatesAdminTemplatesAdminProtectedRouteEmail templates

Special Routes ​

RouteComponentDescription
*NotFound404 error page (with AppLayout)

Route Guards ​

ProtectedRoute Component ​

File: src/components/ProtectedRoute.tsx

  • Checks user authentication status
  • Redirects to /auth if not authenticated
  • Allows access to protected user features

AdminProtectedRoute Component ​

File: src/components/AdminProtectedRoute.tsx

  • Checks both authentication and admin role
  • Redirects non-admin users to appropriate dashboard
  • Protects administrative functionality

Layout Components ​

AppLayout Component ​

File: src/components/layout/AppLayout.tsx

Provides consistent structure for all routes:

  • Header with navigation
  • Main content area
  • Footer
  • Sidebar (context-dependent)

Layout Behavior ​

  • Public Routes: Standard header/footer
  • Protected Routes: Authenticated user navigation
  • Admin Routes: Admin-specific sidebar and navigation
  • Auth Routes: Minimal layout for focus

Route Configuration ​

Router Setup ​

File: src/App.tsx:21-30

typescript
const router = createBrowserRouter([
  {
    path: "*",
    element: <AppRoutes />,
  },
], {
  future: {
    v7_relativeSplatPath: true,
  },
});

Route Navigation Patterns ​

Programmatic Navigation ​

typescript
import { useNavigate } from 'react-router-dom';

const navigate = useNavigate();

// Redirect after successful action
navigate('/dashboard');

// Replace current entry in history
navigate('/login', { replace: true });

// Navigate with state
navigate('/deal/123', { state: { fromOffer: true } });
typescript
import { Link, NavLink } from 'react-router-dom';

// Standard link
<Link to="/explore">Browse Listings</Link>

// Navigation link with active state
<NavLink to="/my-listings" className={({ isActive }) => 
  isActive ? 'active-nav' : 'nav-link'
}>
  My Listings
</NavLink>

Route Parameters ​

Dynamic Route Parameters ​

PatternExampleComponent Access
/:id/listing/123const { id } = useParams()
/blog/:slug/blog/how-to-sellconst { slug } = useParams()
/deal/:id/deal/456const { id } = useParams()

Query Parameters ​

typescript
import { useSearchParams } from 'react-router-dom';

const [searchParams] = useSearchParams();
const category = searchParams.get('category');
const page = searchParams.get('page') || '1';

Route Protection Logic ​

Authentication Check ​

typescript
// ProtectedRoute implementation
const { user, loading } = useAuth();

if (loading) return <LoadingSpinner />;
if (!user) return <Navigate to="/auth" replace />;

return children;

Role-Based Access ​

typescript
// AdminProtectedRoute implementation
const { user, loading } = useAuth();
const { userRole } = useUserRole();

if (loading) return <LoadingSpinner />;
if (!user) return <Navigate to="/auth" replace />;
if (userRole !== 'admin') return <Navigate to="/dashboard" replace />;

return children;

SEO and Route Metadata ​

Dynamic Page Titles ​

Each route component should implement SEO metadata:

typescript
import { Helmet } from 'react-helmet-async';

function ListingDetail() {
  return (
    <>
      <Helmet>
        <title>Business Listing - AcqMarketplace</title>
        <meta name="description" content="..." />
      </Helmet>
      {/* Component content */}
    </>
  );
}

Route Performance ​

Code Splitting ​

Routes are automatically code-split by Vite, but you can implement manual splitting:

typescript
import { lazy, Suspense } from 'react';

const AdminDashboard = lazy(() => import('@/pages/admin/AdminDashboard'));

// In route definition
<Suspense fallback={<LoadingSpinner />}>
  <AdminDashboard />
</Suspense>

Route Preloading ​

Critical routes can be preloaded:

typescript
import { router } from './App';

// Preload route on hover
<Link 
  to="/listing/123" 
  onMouseEnter={() => router.preloadRoute('/listing/123')}
>
  View Listing
</Link>

Related Documentation: