mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-09 01:16:15 -08:00
Three timers kept an idle dashboard busy (plan D3 audit): - The portal live-EPG presenter ran a 30 s interval even with no portal card wanted, so every dashboard paid a full change-detection pass per tick. A component-provided DashboardLiveEpgClock now drives both live-EPG presenters and every progress bar. It runs only while one of them has a live card and only while the document is visible, and reads the clock at once when it starts again. - The XMLTV presenter re-asked every scope and emitted a new Map on each tick. It now re-asks only after a programme on air has ended or while a key has no programme, and drops unchanged answers. Progress still moves on each tick because details read the clock signal. - The source-expiry badges polled the clock every minute and rebuilt the sources rail. createSourceExpiryClock arms one timer for the next day boundary (nextSourceExpiryChangeMs), capped at an hour, and none when no badge can change. The rail rebuilt its scroll position and IntersectionObserver targets on every new items array; it now does so only when card ids or order change, which also stops a user-scrolled rail from snapping back each tick. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>