import dynamic from 'next/dynamic' import { useEffect, useState } from 'react' import { useRouter } from 'next/router' import Seo from '../../../core/components/Seo.jsx' import Promocrumb from '../../../lib/promo/components/Promocrumb.jsx' import { fetchPromoItemsSolr } from '../../../api/promoApi.js' import LogoSpinner from '../../../core/components/elements/Spinner/LogoSpinner.jsx' import ProductPromoCard from '../../../../src-migrate/modules/product-promo/components/Card.tsx' import { IPromotion } from '../../../../src-migrate/types/promotion.ts' import React from 'react' import { SolrResponse } from "../../../../src-migrate/types/solr.ts"; const BasicLayout = dynamic(() => import('../../../core/components/layouts/BasicLayout.jsx')) export default function Promo() { const router = useRouter() const { slug = '' } = router.query const [promoItems, setPromoItems] = useState([]) const [promoData, setPromoData] = useState(null) const [loading, setLoading] = useState(true) const [currentPage, setCurrentPage] = useState(1) const [fetchingData, setFetchingData] = useState(false) useEffect(() => { const loadPromo = async () => { try { const items = await fetchPromoItemsSolr(`*:*`) setPromoItems(items) if (items.length === 0) { setPromoData([]) setLoading(false); return; } const promoDataPromises = items.map(async (item) => { const queryParams = new URLSearchParams({ q: `id:${item.id}` }) try { const response = await fetch(`/solr/promotion_program_lines/select?${queryParams.toString()}`) if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`) } const data: SolrResponse = await response.json() const promotions = await map(data.response.docs) return promotions; } catch (fetchError) { console.error("Error fetching promotion data:", fetchError) return []; } }); const promoDataArray = await Promise.all(promoDataPromises); const mergedPromoData = promoDataArray.reduce((accumulator, currentValue) => accumulator.concat(currentValue), []); setPromoData(mergedPromoData); setTimeout(() => setLoading(false), 120); // Menambahkan delay 200ms sebelum mengubah status loading } catch (loadError) { console.error("Error loading promo items:", loadError) setLoading(false); } } if (slug) { loadPromo() } }, [slug]) const map = async (promotions: any[]): Promise => { const result: IPromotion[] = [] for (const promotion of promotions) { const data: IPromotion = { id: promotion.id, program_id: promotion.program_id_i, name: promotion.name_s, type: { value: promotion.type_value_s, label: promotion.type_label_s, }, limit: promotion.package_limit_i, limit_user: promotion.package_limit_user_i, limit_trx: promotion.package_limit_trx_i, price: promotion.price_f, total_qty: promotion.total_qty_i, products: JSON.parse(promotion.products_s), free_products: JSON.parse(promotion.free_products_s), } result.push(data) } return result } useEffect(() => { const handleScroll = () => { if ( !fetchingData && window.innerHeight + document.documentElement.scrollTop >= 0.95 * document.documentElement.offsetHeight ) { // User has scrolled to 95% of page height setTimeout(() => setFetchingData(true), 120); setCurrentPage((prevPage) => prevPage + 1) } } window.addEventListener('scroll', handleScroll) return () => window.removeEventListener('scroll', handleScroll) }, [fetchingData]) useEffect(() => { if (fetchingData) { // Fetch more data // You may need to adjust this logic according to your API fetchMoreData() } }, [fetchingData]) const fetchMoreData = async () => { try { // Add a delay of approximately 150ms setTimeout(async () => { // Fetch more data // Update promoData state with the new data }, 150) } catch (error) { console.error('Error fetching more data:', error) } finally { setTimeout(() => setFetchingData(false), 120); } } const visiblePromotions = promoData?.slice(0, currentPage * 12) return ( {/* */}

Semua Promo di Indoteknik

{loading ? (
) : promoData && promoItems.length >= 1 ? ( <>
{visiblePromotions?.map((promotion) => (
))}
{fetchingData && (
)} ) : (

Belum ada promo pada kategori ini

)}
) }