Initial commit from remix

This commit is contained in:
gpt-engineer-app[bot]
2025-09-25 16:01:00 +00:00
commit 5ddc52658d
149 changed files with 32798 additions and 0 deletions

260
src/App.tsx Normal file
View File

@@ -0,0 +1,260 @@
import React from "react";
import { Toaster } from "@/components/ui/toaster";
import { Toaster as Sonner } from "@/components/ui/sonner";
import { TooltipProvider } from "@/components/ui/tooltip";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
import { useAuth, AuthProvider } from "@/contexts/AuthContext";
import { CartProvider } from "@/contexts/CartContext";
import { LanguageProvider } from "@/contexts/LanguageContext";
import ErrorBoundary from "@/components/ErrorBoundary";
import FrontendLayout from "@/components/layouts/FrontendLayout";
import Index from "./pages/Index";
import SignIn from "./pages/SignIn";
import SignUp from "./pages/SignUp";
import Explore from "./pages/Explore";
import { ListingDetails } from "./pages/ListingDetails";
import OfferDetails from "./pages/OfferDetails";
import Checkout from "./pages/Checkout";
import OrderConfirmation from "./pages/OrderConfirmation";
import DashboardLayout from "./components/DashboardLayout";
import Dashboard from "./pages/dashboard/Dashboard";
import AdminDashboard from "./pages/dashboard/AdminDashboard";
import AddListing from "./pages/dashboard/AddListing";
import Wallet from "./pages/dashboard/Wallet";
import MyListings from "./pages/dashboard/MyListings";
import Messages from "./pages/dashboard/Messages";
import Reviews from "./pages/dashboard/Reviews";
import Bookings from "./pages/dashboard/Bookings";
import Bookmarks from "./pages/dashboard/Bookmarks";
import Profile from "./pages/dashboard/Profile";
import Settings from "./pages/dashboard/Settings";
import Invoices from "./pages/dashboard/Invoices";
import InvoiceDetail from "./pages/dashboard/InvoiceDetail";
import NotFound from "./pages/NotFound";
const queryClient = new QueryClient();
// Protected Route Component
const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
const { isAuthenticated, isLoading } = useAuth();
if (isLoading) {
return (
<div className="flex items-center justify-center h-screen">
<div className="text-lg">Loading...</div>
</div>
);
}
return isAuthenticated ? <>{children}</> : <Navigate to="/sign-in" />;
};
// Router component that has access to Auth context
const DashboardGate = () => {
const { user, isLoading } = useAuth();
console.log('🚪 DashboardGate - user:', user ? { email: user.email, role: (user as any)?.role, roleId: (user as any)?.roleId } : 'null');
if (isLoading) {
return (
<div className="flex items-center justify-center h-screen">
<div className="text-lg">Loading...</div>
</div>
);
}
const role = (user as any)?.role;
console.log('🚪 DashboardGate - checking role:', role, 'isAdmin?', (role === 'admin' || role === 'super_admin'));
if (role === 'admin' || role === 'super_admin') {
console.log('🚪 Redirecting to admin dashboard');
return <Navigate to="/dashboard/admin" replace />;
}
console.log('🚪 Showing regular dashboard');
return (
<DashboardLayout>
<Dashboard />
</DashboardLayout>
);
};
const AppRouter = () => (
<BrowserRouter>
<Routes>
{/* Public Routes with Frontend Layout */}
<Route path="/" element={
<FrontendLayout>
<Index />
</FrontendLayout>
} />
<Route path="/sign-in" element={
<FrontendLayout>
<SignIn />
</FrontendLayout>
} />
<Route path="/sign-up" element={
<FrontendLayout>
<SignUp />
</FrontendLayout>
} />
<Route path="/explore" element={
<FrontendLayout>
<Explore />
</FrontendLayout>
} />
<Route path="/explore/:category" element={
<FrontendLayout>
<Explore />
</FrontendLayout>
} />
<Route path="/listing-details" element={
<FrontendLayout>
<ListingDetails />
</FrontendLayout>
} />
<Route path="/offer/:slug" element={
<FrontendLayout>
<OfferDetails />
</FrontendLayout>
} />
<Route path="/checkout" element={
<FrontendLayout>
<Checkout />
</FrontendLayout>
} />
<Route path="/order-confirmation" element={
<FrontendLayout>
<OrderConfirmation />
</FrontendLayout>
} />
{/* Protected Dashboard Routes */}
<Route path="/dashboard" element={
<ProtectedRoute>
<DashboardGate />
</ProtectedRoute>
} />
<Route path="/dashboard/admin" element={
<ProtectedRoute>
<DashboardLayout>
<AdminDashboard />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/add-listing" element={
<ProtectedRoute>
<DashboardLayout>
<AddListing />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/wallet" element={
<ProtectedRoute>
<DashboardLayout>
<Wallet />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/my-listings" element={
<ProtectedRoute>
<DashboardLayout>
<MyListings />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/messages" element={
<ProtectedRoute>
<DashboardLayout>
<Messages />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/reviews" element={
<ProtectedRoute>
<DashboardLayout>
<Reviews />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/bookings" element={
<ProtectedRoute>
<DashboardLayout>
<Bookings />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/bookmarks" element={
<ProtectedRoute>
<DashboardLayout>
<Bookmarks />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/profile" element={
<ProtectedRoute>
<DashboardLayout>
<Profile />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/settings" element={
<ProtectedRoute>
<DashboardLayout>
<Settings />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/invoices" element={
<ProtectedRoute>
<DashboardLayout>
<Invoices />
</DashboardLayout>
</ProtectedRoute>
} />
<Route path="/dashboard/invoice/:id" element={
<ProtectedRoute>
<DashboardLayout>
<InvoiceDetail />
</DashboardLayout>
</ProtectedRoute>
} />
{/* Catch-all route */}
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
);
const App = () => (
<QueryClientProvider client={queryClient}>
<TooltipProvider>
<Toaster />
<Sonner />
<AuthProvider>
<LanguageProvider>
<CartProvider>
<ErrorBoundary>
<AppRouter />
</ErrorBoundary>
</CartProvider>
</LanguageProvider>
</AuthProvider>
</TooltipProvider>
</QueryClientProvider>
);
export default App;