Auto-refresh AI limit status in visible tabs

This commit is contained in:
2026-04-07 16:17:41 +02:00
parent 2fea16f6de
commit 9144bdea21

View File

@@ -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;