'use client'; import React, { useState, useEffect } from 'react'; import Image from 'next/image'; import CreditCardApplyModal from '@/components/customui/CreditCardApplyModal'; type Feature = { id: number; details: string }; type Offer = { id: number; details: string }; interface Card { id: number; name: string; minSalary: string; annualFee: string; image: string; points: string[]; features: Feature[]; offers: Offer[]; } interface CardGroup { title: string; cards: Card[]; } const useIsMobile = () => { const [isMobile, setIsMobile] = useState(false); useEffect(() => { const check = () => setIsMobile(window.innerWidth < 768); check(); window.addEventListener('resize', check); return () => window.removeEventListener('resize', check); }, []); return isMobile; }; const CardOfferCarousel: React.FC = () => { const [cardGroups, setCardGroups] = useState([]); const [activeGroupIndex, setActiveGroupIndex] = useState(0); const [activeSlideIndex, setActiveSlideIndex] = useState(0); const [cardsPerSlide, setCardsPerSlide] = useState(5); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedCard, setSelectedCard] = useState(null); const isMobile = useIsMobile(); const updateCardsPerSlide = () => { const width = window.innerWidth; if (width < 640) setCardsPerSlide(2); else if (width < 1024) setCardsPerSlide(3); else if (width < 1280) setCardsPerSlide(4); else setCardsPerSlide(5); }; useEffect(() => { updateCardsPerSlide(); window.addEventListener('resize', updateCardsPerSlide); return () => window.removeEventListener('resize', updateCardsPerSlide); }, []); useEffect(() => { const fetchData = async () => { try { const res = await fetch('/api/creditcards/cards'); if (!res.ok) throw new Error('Failed to load cards'); const data = await res.json(); setCardGroups(data); setLoading(false); } catch (err) { if (err instanceof Error) { setError(err.message); } else { setError('Something went wrong'); } setLoading(false); } }; fetchData(); }, []); useEffect(() => { const groupInterval = setInterval(() => { setActiveGroupIndex((prev) => (prev + 1) % cardGroups.length); setActiveSlideIndex(0); }, 15000); return () => clearInterval(groupInterval); }, [cardGroups.length]); useEffect(() => { const slideInterval = setInterval(() => { const totalSlides = Math.ceil( cardGroups[activeGroupIndex]?.cards.length / cardsPerSlide ); setActiveSlideIndex((prev) => (prev + 1) % totalSlides); }, 6000); return () => clearInterval(slideInterval); }, [cardsPerSlide, activeGroupIndex, cardGroups]); const openApplyModal = async (cardId: number) => { try { const res = await fetch(`/api/applycard/${cardId}`); if (!res.ok) throw new Error('Failed to fetch card details'); const fullCard = await res.json(); setSelectedCard(fullCard); setIsModalOpen(true); } catch (err) { alert(`Error loading card details: ${err}`); } }; if (loading) return
Loading cards...
; if (error) return
{error}
; const currentGroup = cardGroups[activeGroupIndex] || { title: '', cards: [] }; const totalSlides = Math.ceil(currentGroup.cards.length / cardsPerSlide); return (

{currentGroup.title}

{Array.from({ length: totalSlides }).map((_, slideIdx) => { const start = slideIdx * cardsPerSlide; const cardsInSlide = currentGroup.cards.slice(start, start + cardsPerSlide); return (
{cardsInSlide.map((card) => (
{card.name}
{card.name}
    {card.points.slice(0, 4).map((point, i) => (
  • {point.length > 80 ? point.slice(0, 80) + '...' : point}
  • ))}
Know More
))}
); })}
{cardGroups.map((_, i) => ( ))}
{selectedCard && ( setIsModalOpen(false)} card={{ id: selectedCard.id, name: selectedCard.name, bankname: selectedCard.name, minSalary: parseInt(selectedCard.minSalary), annualFee: selectedCard.annualFee, image: selectedCard.image, features: selectedCard.features, offers: selectedCard.offers, }} /> )}
); }; export default CardOfferCarousel;