From 9144bdea21004cc1498b38a9c41dc3b246f806bf Mon Sep 17 00:00:00 2001 From: Meik Date: Tue, 7 Apr 2026 16:17:41 +0200 Subject: [PATCH] Auto-refresh AI limit status in visible tabs --- extension/content.js | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/extension/content.js b/extension/content.js index 67d3674..6c75f44 100644 --- a/extension/content.js +++ b/extension/content.js @@ -1018,13 +1018,16 @@ const aiCredentialCache = { }; const AI_SETTINGS_CACHE_TTL = 30 * 1000; const AI_SETTINGS_SYNC_KEY = 'fb_tracker_ai_settings_sync'; +const AI_AVAILABILITY_AUTO_REFRESH_INTERVAL_MS = 30 * 1000; const aiSettingsCache = { data: null, timestamp: 0, pending: null }; const aiAvailabilitySubscribers = new Set(); +const aiAvailabilityRefreshSubscribers = new Set(); let aiSettingsBroadcastChannel = null; +let aiAvailabilityAutoRefreshInitialized = false; const MODERATION_SETTINGS_CACHE_TTL = 5 * 60 * 1000; const moderationSettingsCache = { data: null, @@ -1154,6 +1157,40 @@ function notifyAIAvailabilitySubscribers() { }); } +function notifyAIAvailabilityRefreshSubscribers(options = {}) { + aiAvailabilityRefreshSubscribers.forEach((subscriber) => { + try { + subscriber(options); + } catch (error) { + console.warn('[FB Tracker] Failed to notify AI availability refresh subscriber:', error); + } + }); +} + +function ensureAIAvailabilityAutoRefresh() { + if (aiAvailabilityAutoRefreshInitialized) { + return; + } + aiAvailabilityAutoRefreshInitialized = true; + + window.addEventListener('focus', () => { + notifyAIAvailabilityRefreshSubscribers({ forceRefresh: true, source: 'window-focus' }); + }); + + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + notifyAIAvailabilityRefreshSubscribers({ forceRefresh: true, source: 'visibility-visible' }); + } + }); + + window.setInterval(() => { + if (document.visibilityState !== 'visible') { + return; + } + notifyAIAvailabilityRefreshSubscribers({ forceRefresh: true, source: 'visible-poll' }); + }, AI_AVAILABILITY_AUTO_REFRESH_INTERVAL_MS); +} + function ensureAISettingsBroadcastChannel() { if (aiSettingsBroadcastChannel || typeof BroadcastChannel !== 'function') { return aiSettingsBroadcastChannel; @@ -6941,6 +6978,22 @@ async function addAICommentButton(container, postElement) { aiAvailabilitySubscribers.add(handleSharedAISettingsUpdate); + const handleAutoRefreshAvailability = ({ forceRefresh = false } = {}) => { + if (!wrapper.isConnected) { + aiAvailabilitySubscribers.delete(handleSharedAISettingsUpdate); + aiAvailabilityRefreshSubscribers.delete(handleAutoRefreshAvailability); + return; + } + const currentState = button.dataset.aiState || 'idle'; + if (currentState !== 'idle' || button._aiContext) { + return; + } + void refreshAvailabilityState(forceRefresh); + }; + + aiAvailabilityRefreshSubscribers.add(handleAutoRefreshAvailability); + ensureAIAvailabilityAutoRefresh(); + const updateNoteIndicator = () => { const note = getAdditionalNote(); const hasNote = note.trim().length > 0;