'use client'; import { useState, useEffect } from 'react'; import { PointerComponentProduct, PointerComponentProductItem } from '@theme/types'; import clsx from 'clsx'; import { Button, Link } from '@theme/components'; import { useMediaQuery } from '@akinon/next/hooks'; import { Image } from '@akinon/next/components/image'; import { useInView } from 'react-intersection-observer'; import { pushViewPromotion, pushSelectPromotion } from '@theme/utils/gtm'; interface ProductPointerWidgetProps { productItem?: PointerComponentProductItem; productPointerItem?: PointerComponentProduct; } const ProductPointerWidget = (props: ProductPointerWidgetProps) => { const { productItem, productPointerItem } = props; const [viewed, setViewed] = useState(false); const { ref, inView } = useInView(); const matches = useMediaQuery('(min-width: 768px)'); const [buttonStatus, setButtonStatus] = useState(true); const [matchesStatus, setMatchesStatus] = useState(false); const handleClick = () => { setButtonStatus(!buttonStatus); }; const generatePromotionPayload = (promotion) => { return { creative_name: promotion?.value.banner_title_text, promotion_id: `promo_${promotion?.value?.url}`, promotion_name: promotion?.value?.banner_title_text, items: [ { item_id: promotion?.value?.url, item_name: promotion?.value?.banner_title_text, price: parseFloat(promotion?.value.reduced_price?.replace(',', '.')) || 0, quantity: 1 } ] }; }; const handleSelectPromotion = (promotionType) => { const promotion = promotionType === 'pointerItem' ? productPointerItem : productItem; if (promotion && promotion?.value?.url) { pushSelectPromotion(generatePromotionPayload(promotion)); } }; useEffect(() => { if (inView && !viewed) { setViewed(true); const promotions = [productItem, productPointerItem].filter(Boolean); promotions.forEach((promotion) => { if (promotion?.value?.url) { pushViewPromotion(generatePromotionPayload(promotion)); } }); } }, [productItem, productPointerItem, inView, viewed]); useEffect(() => { setMatchesStatus(matches); }, [matches]); return (