nodebb-plugin-ezoic-infinite 1.5.97 → 1.5.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/public/client.js +68 -26
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-plugin-ezoic-infinite",
3
- "version": "1.5.97",
3
+ "version": "1.5.99",
4
4
  "description": "Production-ready Ezoic infinite ads integration for NodeBB 4.x",
5
5
  "main": "library.js",
6
6
  "license": "MIT",
package/public/client.js CHANGED
@@ -1344,50 +1344,92 @@ function buildOrdinalMap(items) {
1344
1344
 
1345
1345
 
1346
1346
 
1347
- // ===== V7 up-scroll purge for ezoic-ad-between =====
1347
+ // ===== V8 between-cap-per-window =====
1348
1348
  (function () {
1349
- var lastY = window.pageYOffset || document.documentElement.scrollTop || 0;
1350
1349
  var ticking = false;
1350
+ var lastRun = 0;
1351
+ var RUN_COOLDOWN = 220; // ms
1351
1352
 
1352
- function purgeBetweenWraps() {
1353
- try {
1354
- document.querySelectorAll('.nodebb-ezoic-wrap.ezoic-ad-between').forEach(function (w) {
1355
- try { w.remove(); } catch (e) {}
1353
+ // Keep at most N between-wraps per vertical band around viewport
1354
+ var BAND_PX = 900;
1355
+ var MAX_PER_BAND = 2;
1356
+
1357
+ function capBetweenWraps() {
1358
+ var now = Date.now();
1359
+ if (now - lastRun < RUN_COOLDOWN) return;
1360
+ lastRun = now;
1361
+
1362
+ var wraps;
1363
+ try { wraps = Array.prototype.slice.call(document.querySelectorAll('.nodebb-ezoic-wrap.ezoic-ad-between')); }
1364
+ catch (e) { return; }
1365
+
1366
+ if (!wraps.length) return;
1367
+
1368
+ var y = window.pageYOffset || document.documentElement.scrollTop || 0;
1369
+ var viewportTop = y;
1370
+ var viewportBottom = y + (window.innerHeight || document.documentElement.clientHeight || 0);
1371
+
1372
+ // Priorité: conserver ce qui est proche/visible, limiter le reste par bande
1373
+ var buckets = Object.create(null);
1374
+
1375
+ wraps.forEach(function (w) {
1376
+ try {
1377
+ var r = w.getBoundingClientRect();
1378
+ var absTop = y + r.top;
1379
+ var absBottom = y + r.bottom;
1380
+
1381
+ var inOrNearViewport = (absBottom >= viewportTop - 200) && (absTop <= viewportBottom + 200);
1382
+ var band = Math.floor(absTop / BAND_PX);
1383
+ var key = String(band);
1384
+
1385
+ if (!buckets[key]) buckets[key] = [];
1386
+ buckets[key].push({
1387
+ node: w,
1388
+ absTop: absTop,
1389
+ absBottom: absBottom,
1390
+ inOrNearViewport: inOrNearViewport
1391
+ });
1392
+ } catch (e) {}
1393
+ });
1394
+
1395
+ Object.keys(buckets).forEach(function (k) {
1396
+ var arr = buckets[k];
1397
+ // garde d'abord proche/visible, puis les plus récents (data-created), puis position
1398
+ arr.sort(function (a, b) {
1399
+ if (a.inOrNearViewport !== b.inOrNearViewport) return a.inOrNearViewport ? -1 : 1;
1400
+ var ac = parseInt((a.node.getAttribute('data-created') || '0'), 10);
1401
+ var bc = parseInt((b.node.getAttribute('data-created') || '0'), 10);
1402
+ if (ac !== bc) return bc - ac; // garder plus récent
1403
+ return a.absTop - b.absTop;
1356
1404
  });
1357
- } catch (e) {}
1405
+
1406
+ for (var i = MAX_PER_BAND; i < arr.length; i++) {
1407
+ try { arr[i].node.remove(); } catch (e) {}
1408
+ }
1409
+ });
1358
1410
  }
1359
1411
 
1360
- function onScroll() {
1412
+ function scheduleCap() {
1361
1413
  if (ticking) return;
1362
1414
  ticking = true;
1363
1415
  requestAnimationFrame(function () {
1364
- var y = window.pageYOffset || document.documentElement.scrollTop || 0;
1365
- var dy = y - lastY;
1366
- if (dy < -10) {
1367
- purgeBetweenWraps();
1368
- }
1369
- lastY = y;
1416
+ try { capBetweenWraps(); } catch (e) {}
1370
1417
  ticking = false;
1371
1418
  });
1372
1419
  }
1373
1420
 
1374
- window.addEventListener('scroll', onScroll, { passive: true });
1375
-
1376
- function purgeNearTop() {
1377
- try {
1378
- var y = window.pageYOffset || document.documentElement.scrollTop || 0;
1379
- if (y < 500) purgeBetweenWraps();
1380
- } catch (e) {}
1381
- }
1421
+ window.addEventListener('scroll', scheduleCap, { passive: true });
1422
+ window.addEventListener('resize', scheduleCap, { passive: true });
1382
1423
 
1383
1424
  if (window.jQuery) {
1384
1425
  window.jQuery(window).on('action:ajaxify.end action:infiniteScroll.loaded', function () {
1385
- setTimeout(purgeNearTop, 0);
1386
- setTimeout(purgeNearTop, 250);
1426
+ setTimeout(scheduleCap, 0);
1427
+ setTimeout(scheduleCap, 200);
1428
+ setTimeout(scheduleCap, 700);
1387
1429
  });
1388
1430
  }
1389
1431
 
1390
- setTimeout(purgeNearTop, 0);
1432
+ setTimeout(scheduleCap, 0);
1391
1433
  })();
1392
- // ===== /V7 =====
1434
+ // ===== /V8 =====
1393
1435