import React, { useState, useEffect, Suspense, lazy, useMemo } from 'react';
import { Routes, Route, useLocation, useNavigate, Navigate } from 'react-router-dom';
import { Toaster } from '@/components/ui/toaster';
import { toast } from '@/components/ui/use-toast';
import { supabase } from '@/lib/supabaseClient';
import Header from '@/components/layout/Header';
import Footer from '@/components/layout/Footer';
import CouponCodeDialog from '@/components/dialogs/CouponCodeDialog';
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import HomePage from '@/pages/HomePage';
import CouponDetailPage from '@/pages/CouponDetailPage';
import AdminLoginPage from '@/pages/AdminLoginPage';
import Meta from '@/components/Meta';
import useCoupons from '@/hooks/useCoupons';
import useAdminPanel from '@/hooks/useAdminPanel';
import useCouponDisplay from '@/hooks/useCouponDisplay';
import useMobileMenu from '@/hooks/useMobileMenu';
import { slugify } from '@/utils/slugify';
const AdminPanel = lazy(() => import('@/components/AdminPanel'));
const HowWeMakeMoneyDialog = lazy(() => import('@/components/dialogs/HowWeMakeMoneyDialog'));
const TermsOfUseDialog = lazy(() => import('@/components/dialogs/TermsOfUseDialog'));
const PrivacyPolicyDialog = lazy(() => import('@/components/dialogs/PrivacyPolicyDialog'));
const ITEMS_PER_PAGE = 15;
const LoadingFallback = () => (
);
const App = () => {
const [currentPage, setCurrentPage] = useState(1);
const {
adminCoupons,
setAdminCoupons,
loading: couponsLoading,
fetchCoupons,
handleAddCoupon,
handleEditCoupon,
handleDeleteCouponInternal,
handleToggleCouponVisibility,
} = useCoupons(toast, currentPage, ITEMS_PER_PAGE);
const {
showAdmin: showAdminViaHook,
setShowAdmin: setShowAdminViaHook,
editingCoupon,
setEditingCoupon,
} = useAdminPanel();
const [session, setSession] = useState(null);
const [authLoading, setAuthLoading] = useState(true);
const [adminSortOrder, setAdminSortOrder] = useState('desc');
const publicCoupons = useMemo(() => adminCoupons.filter(c => !c.is_hidden && c.title && c.brand), [adminCoupons]);
const {
sortOption,
setSortOption,
filterStatus,
setFilterStatus,
searchTerm,
setSearchTerm,
selectedBrand,
setSelectedBrand,
selectedCoupon,
showCouponDialog,
setShowCouponDialog,
filteredAndSortedCoupons: getFilteredAndSortedPublicCoupons,
handleCouponClick: baseHandleCouponClick,
handleCopyCode,
} = useCouponDisplay(publicCoupons, toast);
const {
filteredAndSortedCoupons: getFilteredAndSortedAdminCoupons,
} = useCouponDisplay(adminCoupons, toast, true, adminSortOrder);
const { isMobileMenuOpen, setIsMobileMenuOpen, toggleMobileMenu: toggleMobileMenuHook } = useMobileMenu();
const [showHowWeMakeMoneyDialog, setShowHowWeMakeMoneyDialog] = useState(false);
const [showTermsOfUseDialog, setShowTermsOfUseDialog] = useState(false);
const [showPrivacyPolicyDialog, setShowPrivacyPolicyDialog] = useState(false);
const [showDeleteConfirmDialog, setShowDeleteConfirmDialog] = useState(false);
const [couponToDelete, setCouponToDelete] = useState(null);
const navigate = useNavigate();
const location = useLocation();
useEffect(() => {
const getSession = async () => {
const { data: { session: currentSession } } = await supabase.auth.getSession();
setSession(currentSession);
if (currentSession && location.pathname === '/admin-dashboard') {
setShowAdminViaHook(true);
}
setAuthLoading(false);
};
getSession();
const authSubscription = supabase.auth.onAuthStateChange((_event, newSession) => {
setSession(newSession);
if (_event === 'SIGNED_OUT') {
setShowAdminViaHook(false);
navigate('/');
}
if (_event === 'SIGNED_IN') {
setShowAdminViaHook(true);
if (location.pathname === '/secure-admin-login' || location.pathname === '/') {
navigate('/admin-dashboard');
}
}
});
return () => {
authSubscription.data.subscription.unsubscribe();
};
}, [navigate, location.pathname, setShowAdminViaHook]);
useEffect(() => {
fetchCoupons(currentPage, ITEMS_PER_PAGE);
}, [currentPage, fetchCoupons]);
const handleRegularLogoClick = () => {
if (location.pathname !== "/") {
navigate("/");
} else {
window.location.href = "https://alogapedia.com";
}
};
const handleAdminLogout = async () => {
const { error } = await supabase.auth.signOut();
if (error) {
toast({ title: 'Logout Error', description: error.message, variant: 'destructive' });
} else {
toast({ title: 'Logged Out', description: 'You have been successfully logged out.' });
setSession(null);
setShowAdminViaHook(false);
navigate('/');
}
};
const triggerAdminPanelAction = () => {
if (session) {
const newShowAdminState = !showAdminViaHook;
setShowAdminViaHook(newShowAdminState);
if (newShowAdminState) {
if (location.pathname !== '/admin-dashboard') {
navigate('/admin-dashboard');
}
} else {
if (location.pathname.startsWith('/admin-dashboard')) {
navigate('/');
}
}
} else {
navigate('/secure-admin-login');
}
};
const navLinks = [
{ href: "https://alogapedia.com", text: "Home" },
{ href: "/", text: "Deals", active: location.pathname === '/' || location.pathname.startsWith('/deal/') },
{ href: "https://alogapedia.com/product-reviews/", text: "Reviews" },
{ href: "https://alogapedia.com/recommendations/", text: "Recommendations" },
{ href: "https://alogapedia.com/about/", text: "About" }
];
const displayedPublicCoupons = getFilteredAndSortedPublicCoupons();
const totalPublicCoupons = displayedPublicCoupons.length;
const totalPages = Math.ceil(totalPublicCoupons / ITEMS_PER_PAGE);
const paginatedPublicCoupons = displayedPublicCoupons.slice((currentPage - 1) * ITEMS_PER_PAGE, currentPage * ITEMS_PER_PAGE);
const uniqueBrands = useMemo(() => {
const brands = new Set(publicCoupons.map(coupon => coupon.brand).filter(Boolean));
return Array.from(brands).sort();
}, [publicCoupons]);
useEffect(() => {
setCurrentPage(1);
}, [selectedBrand, sortOption, filterStatus, searchTerm]);
const handlePageChange = (page) => {
setCurrentPage(page);
window.scrollTo(0, 0);
};
const handleDeleteRequest = (couponId) => {
setCouponToDelete(couponId);
setShowDeleteConfirmDialog(true);
};
const confirmDeleteCoupon = async () => {
if (couponToDelete) {
await handleDeleteCouponInternal(couponToDelete);
setCouponToDelete(null);
setShowDeleteConfirmDialog(false);
fetchCoupons(currentPage, ITEMS_PER_PAGE);
}
};
const handleCouponCardClick = (coupon) => {
if (coupon && coupon.brand && coupon.title) {
const couponSlug = `${slugify(coupon.brand)}-${slugify(coupon.title).substring(0,50)}`;
navigate(`/deal/${couponSlug}/`);
} else {
baseHandleCouponClick(coupon);
}
};
if (authLoading) {
return ;
}
return (
}>
{showHowWeMakeMoneyDialog &&
}
{showTermsOfUseDialog &&
}
{showPrivacyPolicyDialog &&
}
Are you sure?
This action cannot be undone. This will permanently delete the coupon.
setShowDeleteConfirmDialog(false)}>Cancel
Delete
}
/>
}
/>
: }
/>
}>
fetchCoupons(currentPage, ITEMS_PER_PAGE)}
isPublicInterface={false}
/>
) : session && !showAdminViaHook && location.pathname === '/admin-dashboard' ? (
) : !session ? (
) : null
}
/>
{(location.pathname === '/admin-dashboard' && session && showAdminViaHook) ? null : (
);
};
export default App;