import React, { HTMLAttributes, useEffect, useMemo, useState, useCallback } from 'react'; import Icon24Dismiss from '@vkontakte/icons/dist/24/dismiss'; import Button from '../Button/Button'; import Cell from '../Cell/Cell'; import Avatar from '../Avatar/Avatar'; import classNames from '../../lib/classNames'; type StatsType = | 'playbackStarted' // Начало показа | 'click'; // Клик по баннеру type BannerData = { title?: string; url_types?: string; // eslint-disable-line camelcase bannerID?: string; imageWidth?: number; imageHeight?: number; imageLink?: string; trackingLink?: string; type?: string; iconWidth?: number; domain?: string; ctaText?: string; advertisingLabel?: string; iconLink?: string; statistics?: Array<{ type: StatsType; url: string }>; openInBrowser?: boolean; iconHeight?: number; directLink?: boolean; navigationType?: string; description?: string; ageRestriction?: number; }; export interface PromoBannerProps extends HTMLAttributes { /** Данные рекламного баннера, полученные из VKWebAppGetAds */ bannerData: BannerData; /** Флаг скрытия кнопки закрытия рекламы */ isCloseButtonHidden?: boolean; /** Хандлер закрытия рекламы */ onClose: () => void; } const PromoBanner = (props: PromoBannerProps) => { const [currentPixel, setCurrentPixel] = useState(''); const statsPixels = useMemo(() => ( props.bannerData.statistics ? props.bannerData.statistics.reduce((acc, item) => ({ ...acc, [item.type]: item.url }), {}) : {} ) as Record, [props.bannerData.statistics]); const onClick = useCallback(() => setCurrentPixel(statsPixels.click || ''), [statsPixels.click]); useEffect(() => { if (statsPixels.playbackStarted) { setCurrentPixel(statsPixels.playbackStarted); } }, [statsPixels.playbackStarted]); return ( {props.bannerData.ageRestriction && {props.bannerData.ageRestriction}+} {props.bannerData.advertisingLabel || 'Advertisement'} {!props.isCloseButtonHidden && } } asideContent={{props.bannerData.ctaText}} description={props.bannerData.domain} > {props.bannerData.title} {currentPixel.length > 0 && } ); }; export default PromoBanner;