import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination"; import { useDateContext } from "@/context/DateContext"; import { useEffect, useMemo, useState } from "react"; import { autoPlaceArticles, createArticlesFromFilenames, isSameDay, } from "../../utils/helpers"; import { usePageContext } from "@/context/PageContext"; // Type Definitions interface ArticleImage { page: number; date: string; articles: string[]; } interface Origin { x: number; y: number; } const NewspaperViewer = () => { const { currentPage, setCurrentPage } = usePageContext(); const [selectedArticle, setSelectedArticle] = useState(null); const [images, setImages] = useState([]); const [colCount, setColCount] = useState(8); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const { date } = useDateContext(); const [origin, setOrigin] = useState({ x: 0, y: 0 }); // Update column count based on page useEffect(() => { setColCount(currentPage === 1 ? 6 : 8); }, [currentPage]); // Simulated async fetch (replace with actual fetch if needed) useEffect(() => { const fetchImages = async () => { try { setIsLoading(true); setError(null); // Simulate delay await new Promise((res) => setTimeout(res, 500)); setImages([ { page: 1, date: "Mon May 13 2025 22:00:46 GMT+0600 (Bangladesh Standard Time)", articles: [ "1_r2_c6.jpg", "1_r3_c3.jpg", "1_r3_c1.jpg", "1_r3_c2.jpg", "1_r4_c2.jpg", "(1_r4_c1).jpg", "(1_r4_c2).jpg", "1_r2_c1.jpg", "1_r2_c1_g6.jpg", ], }, { page: 2, date: "Mon May 13 2025 22:00:00 GMT+0600 (Bangladesh Standard Time)", articles: [ "2_r1_c8.jpg", "2_r2_c2_g1).jpg", "2_r1_c2_g3.jpg", "2_r1_c4_g5.jpg", "(2_r1_c4_g5.jpg", "2_r1_c1_g8).jpg", "2_r1_c1_g8.jpg", "2_r1_c2_g3).jpg", "2_r2_c2_g3.jpg", "2_r2_c3_g5.jpg", "2_r3_c3_g3.jpg", "(2_r3_c3)_g5.jpg", "(2_r1_c2)_g1.jpg", "((2_r1_c2)_g1.jpg", "2_r2_c2_g1.jpg", ], }, ]); } catch (err) { setError("Failed to load newspaper data."); } finally { setIsLoading(false); } }; fetchImages(); }, []); const zoomIn = (articleUrl: string, e: React.MouseEvent) => { const { clientX, clientY } = e; setOrigin({ x: clientX, y: clientY }); setSelectedArticle(articleUrl); }; const zoomOut = () => { setSelectedArticle(null); }; const dateFilteredContent = useMemo( () => images.filter((item) => isSameDay(item.date, date)), [images, date] ); const hasContentForDate = dateFilteredContent.length > 0; const dateArticles = useMemo( () => hasContentForDate ? dateFilteredContent.flatMap((pageGroup) => createArticlesFromFilenames(pageGroup.articles, pageGroup.page) ) : [], [dateFilteredContent, hasContentForDate] ); const currentPageArticles = dateArticles.filter( (a) => a.page === currentPage ); const placedArticles = useMemo( () => autoPlaceArticles(currentPageArticles, colCount), [currentPageArticles, colCount] ); const totalPages = hasContentForDate ? Math.max(...dateFilteredContent.map((item) => item.page)) : 0; return (
{isLoading ? (
Loading...
) : error ? (
{error}
) : hasContentForDate ? ( <> {/* Pagination */}
{ e.preventDefault(); setCurrentPage((prev: number) => Math.max(1, prev - 1)); }} /> {Array.from({ length: totalPages }, (_, i) => i + 1).map( (n) => ( { e.preventDefault(); setCurrentPage(n); }} > {n} ) )} { e.preventDefault(); setCurrentPage((prev) => Math.min(totalPages, prev + 1)); }} />
{/* Articles */}
{placedArticles.map((article) => (
zoomIn(`/${article.image}`, e)} src={`/${article.image}`} alt={`Article ${article.id}`} style={{ width: "100%", height: "100%", objectFit: "cover", display: "block", }} />
))}
) : (

No newspaper available

There is no newspaper edition for{" "} {date?.toLocaleDateString("en-US", { weekday: "long", year: "numeric", month: "long", day: "numeric", })}

)} {/* Zoomed View */} {selectedArticle && (
e.stopPropagation()} > Zoomed Article
)}
); }; export default NewspaperViewer;