templates/vehicle_tip/tip.html.twig line 1

  1. <section class="tips-box">
  2.     <header class="tips-box__header">
  3.         <h2>Doporučené vozy</h2>
  4.     </header>
  5.     <div class="tips-box__items">
  6.         {% for t in vehicleTips %}
  7.             {% include 'vehicle_tip/_tipCard.html.twig' with {
  8.                 vehicle: t.vehicle,
  9.                 compact: true,
  10.                 autanetPartnerId: t.autanetPartner ? t.autanetPartner.id : null,
  11.                 recommendedPlacement: 'R02',
  12.                 recommendedPageContext: pageContext
  13.             } only %}
  14.         {% endfor %}
  15.     </div>
  16. </section>
  17. <script>
  18.     (function () {
  19.         const items = document.querySelectorAll(
  20.             '[data-recommended-placement="R02"][data-recommended-vehicle-id][data-autanet-partner-id][data-recommended-page-context]'
  21.         );
  22.         if (
  23.             !items.length
  24.             || !window.AutanetAnalytics
  25.             || typeof window.AutanetAnalytics.withIdentity !== 'function'
  26.         ) {
  27.             return;
  28.         }
  29.         function sendRecommendedEvent(item, eventType) {
  30.             const vehicleId = item.dataset.recommendedVehicleId;
  31.             const partnerId = item.dataset.autanetPartnerId;
  32.             const pageContext = item.dataset.recommendedPageContext;
  33.             if (!vehicleId || !partnerId || !pageContext) {
  34.                 return;
  35.             }
  36.             window.AutanetAnalytics.withIdentity(function (identity) {
  37.                 if (!identity) {
  38.                     return;
  39.                 }
  40.                 const formData = new FormData();
  41.                 formData.append('event_type', eventType);
  42.                 formData.append('vehicle_id', vehicleId);
  43.                 formData.append('partner_id', partnerId);
  44.                 formData.append('placement', 'R02');
  45.                 formData.append('page_context', pageContext);
  46.                 formData.append(
  47.                     'device',
  48.                     window.matchMedia('(max-width: 766px)').matches
  49.                         ? 'mobile'
  50.                         : 'desktop'
  51.                 );
  52.                 formData.append('visitor_key', identity.visitorKey);
  53.                 formData.append('session_key', identity.sessionKey);
  54.                 formData.append('pageview_key', identity.pageviewKey);
  55.                 fetch('{{ path('app_analytics_event') }}', {
  56.                     method: 'POST',
  57.                     body: formData,
  58.                     keepalive: true
  59.                 }).catch(function () {
  60.                 });
  61.             }, 5000);
  62.         }
  63.         items.forEach(function (item) {
  64.             item.addEventListener('click', function () {
  65.                 sendRecommendedEvent(item, 'recommended_vehicle_click');
  66.             });
  67.         });
  68.         if (typeof window.IntersectionObserver !== 'function') {
  69.             return;
  70.         }
  71.         const impressionTimers = new Map();
  72.         const trackedVehicleIds = new Set();
  73.         function clearImpressionTimer(vehicleId) {
  74.             const timer = impressionTimers.get(vehicleId);
  75.             if (timer) {
  76.                 clearTimeout(timer);
  77.                 impressionTimers.delete(vehicleId);
  78.             }
  79.         }
  80.         const observer = new IntersectionObserver(function (entries) {
  81.             entries.forEach(function (entry) {
  82.                 const item = entry.target;
  83.                 const vehicleId = item.dataset.recommendedVehicleId;
  84.                 if (!vehicleId || trackedVehicleIds.has(vehicleId)) {
  85.                     return;
  86.                 }
  87.                 if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {
  88.                     if (impressionTimers.has(vehicleId)) {
  89.                         return;
  90.                     }
  91.                     const timer = setTimeout(function () {
  92.                         impressionTimers.delete(vehicleId);
  93.                         if (trackedVehicleIds.has(vehicleId)) {
  94.                             return;
  95.                         }
  96.                         trackedVehicleIds.add(vehicleId);
  97.                         sendRecommendedEvent(item, 'recommended_vehicle_impression');
  98.                     }, 1000);
  99.                     impressionTimers.set(vehicleId, timer);
  100.                     return;
  101.                 }
  102.                 clearImpressionTimer(vehicleId);
  103.             });
  104.         }, {
  105.             threshold: [0, 0.5, 1]
  106.         });
  107.         items.forEach(function (item) {
  108.             observer.observe(item);
  109.         });
  110.     })();
  111. </script>