// src/pages/Home.tsx import { useEffect, useState, useRef } from "react" import MainLayout from "../layouts/MainLayout" import DealCardMain from "../components/Shared/DealCardMain" import { getDeals } from "../api/deal/getDeal" import { mapDealCardResponseToDeal } from "../adapters/responses/dealCardAdapter" import { timeAgo } from "../utils/timeAgo" import type { DealCard } from "../models/deal/DealCard" type HomeProps = { onRequireLogin: () => void } export default function HomePage({ onRequireLogin }: HomeProps) { const [deals, setDeals] = useState([]) const [page, setPage] = useState(1) const [hasMore, setHasMore] = useState(true) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const observerRef = useRef(null) useEffect(() => { const loadDeals = async () => { if (loading || !hasMore) return setLoading(true) try { const apiDeals = await getDeals(page) if (apiDeals.length === 0) { setHasMore(false) } else { const mappedDeals = apiDeals.map(mapDealCardResponseToDeal) setDeals((prev) => { const existingIds = new Set(prev.map((d) => d.id)) const filtered = mappedDeals.filter( (d) => !existingIds.has(d.id) ) return [...prev, ...filtered] }) } } catch (err: any) { setError(err.message ?? "Bir hata oluştu") } finally { setLoading(false) } } loadDeals() }, [page]) useEffect(() => { const observer = new IntersectionObserver( (entries) => { if (entries[0].isIntersecting && hasMore && !loading) { setPage((prev) => prev + 1) } }, { threshold: 1 } ) if (observerRef.current) observer.observe(observerRef.current) return () => observer.disconnect() }, [hasMore, loading]) if (error) { return

{error}

} return (
{/* SOL: Deal listesi */}
{deals.map((deal) => ( ))} {loading && (

Yükleniyor...

)} {!hasMore && (

Tüm fırsatlar yüklendi.

)}
{/* SAĞ: sidebar */}
) }