Add extension pause toggle
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
// Facebook Post Tracker Extension
|
// Facebook Post Tracker Extension
|
||||||
// Uses API_BASE_URL from config.js
|
// Uses API_BASE_URL from config.js
|
||||||
|
|
||||||
const EXTENSION_VERSION = '1.2.3';
|
const EXTENSION_VERSION = '1.2.4';
|
||||||
const PROCESSED_ATTR = 'data-fb-tracker-processed';
|
const PROCESSED_ATTR = 'data-fb-tracker-processed';
|
||||||
const PENDING_ATTR = 'data-fb-tracker-pending';
|
const PENDING_ATTR = 'data-fb-tracker-pending';
|
||||||
const DIALOG_ROOT_SELECTOR = '[role="dialog"], [data-pagelet*="Modal"], [data-pagelet="StoriesRecentStoriesFeedSection"]';
|
const DIALOG_ROOT_SELECTOR = '[role="dialog"], [data-pagelet*="Modal"], [data-pagelet="StoriesRecentStoriesFeedSection"]';
|
||||||
@@ -18,6 +18,7 @@ const FEED_HOME_PATHS = ['/', '/home.php'];
|
|||||||
const sessionSearchRecordedUrls = new Set();
|
const sessionSearchRecordedUrls = new Set();
|
||||||
const sessionSearchInfoCache = new Map();
|
const sessionSearchInfoCache = new Map();
|
||||||
let profileSelectionNoticeShown = false;
|
let profileSelectionNoticeShown = false;
|
||||||
|
let extensionPaused = false;
|
||||||
|
|
||||||
function isOnSearchResultsPage() {
|
function isOnSearchResultsPage() {
|
||||||
try {
|
try {
|
||||||
@@ -132,16 +133,57 @@ function applyDebugLoggingPreference(value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
chrome.storage.sync.get(['debugLoggingEnabled'], (result) => {
|
function resetTrackerUiState() {
|
||||||
|
document.querySelectorAll('.fb-tracker-ui').forEach((element) => {
|
||||||
|
const host = getTrackerHostElement(element);
|
||||||
|
if (host) {
|
||||||
|
host.removeAttribute(PROCESSED_ATTR);
|
||||||
|
host.removeAttribute(PENDING_ATTR);
|
||||||
|
clearTrackerElementForPost(host, element);
|
||||||
|
}
|
||||||
|
element.remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
document.querySelectorAll(`[${PROCESSED_ATTR}], [${PENDING_ATTR}]`).forEach((element) => {
|
||||||
|
element.removeAttribute(PROCESSED_ATTR);
|
||||||
|
element.removeAttribute(PENDING_ATTR);
|
||||||
|
});
|
||||||
|
|
||||||
|
processedPostUrls.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyExtensionPausedPreference(value) {
|
||||||
|
extensionPaused = Boolean(value);
|
||||||
|
if (extensionPaused) {
|
||||||
|
hideSelectionAIButton();
|
||||||
|
resetTrackerUiState();
|
||||||
|
originalConsoleLog('[FB Tracker] Extension paused');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
originalConsoleLog('[FB Tracker] Extension resumed');
|
||||||
|
scheduleScan();
|
||||||
|
}
|
||||||
|
|
||||||
|
chrome.storage.sync.get(['debugLoggingEnabled', 'extensionPaused'], (result) => {
|
||||||
applyDebugLoggingPreference(result && typeof result.debugLoggingEnabled !== 'undefined'
|
applyDebugLoggingPreference(result && typeof result.debugLoggingEnabled !== 'undefined'
|
||||||
? result.debugLoggingEnabled
|
? result.debugLoggingEnabled
|
||||||
: false);
|
: false);
|
||||||
|
applyExtensionPausedPreference(result && typeof result.extensionPaused !== 'undefined'
|
||||||
|
? result.extensionPaused
|
||||||
|
: false);
|
||||||
});
|
});
|
||||||
|
|
||||||
chrome.storage.onChanged.addListener((changes, area) => {
|
chrome.storage.onChanged.addListener((changes, area) => {
|
||||||
if (area === 'sync' && changes && Object.prototype.hasOwnProperty.call(changes, 'debugLoggingEnabled')) {
|
if (area !== 'sync' || !changes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Object.prototype.hasOwnProperty.call(changes, 'debugLoggingEnabled')) {
|
||||||
applyDebugLoggingPreference(changes.debugLoggingEnabled.newValue);
|
applyDebugLoggingPreference(changes.debugLoggingEnabled.newValue);
|
||||||
}
|
}
|
||||||
|
if (Object.prototype.hasOwnProperty.call(changes, 'extensionPaused')) {
|
||||||
|
applyExtensionPausedPreference(changes.extensionPaused.newValue);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function getTrackerElementForPost(postElement) {
|
function getTrackerElementForPost(postElement) {
|
||||||
@@ -4119,6 +4161,10 @@ async function renderTrackedStatus({
|
|||||||
|
|
||||||
// Create the tracking UI
|
// Create the tracking UI
|
||||||
async function createTrackerUI(postElement, buttonBar, postNum = '?', options = {}) {
|
async function createTrackerUI(postElement, buttonBar, postNum = '?', options = {}) {
|
||||||
|
if (extensionPaused) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Normalize to top-level post container if nested element passed
|
// Normalize to top-level post container if nested element passed
|
||||||
postElement = ensurePrimaryPostElement(postElement);
|
postElement = ensurePrimaryPostElement(postElement);
|
||||||
|
|
||||||
@@ -4972,6 +5018,10 @@ let globalPostCounter = 0;
|
|||||||
|
|
||||||
// Find all Facebook posts on the page
|
// Find all Facebook posts on the page
|
||||||
function findPosts() {
|
function findPosts() {
|
||||||
|
if (extensionPaused) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (maybeRedirectPageReelsToMain()) {
|
if (maybeRedirectPageReelsToMain()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -5100,6 +5150,9 @@ setTimeout(findPosts, 6000);
|
|||||||
// Debounced scan function
|
// Debounced scan function
|
||||||
let scanTimeout = null;
|
let scanTimeout = null;
|
||||||
function scheduleScan() {
|
function scheduleScan() {
|
||||||
|
if (extensionPaused) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (scanTimeout) {
|
if (scanTimeout) {
|
||||||
clearTimeout(scanTimeout);
|
clearTimeout(scanTimeout);
|
||||||
}
|
}
|
||||||
@@ -5405,6 +5458,11 @@ const positionSelectionAIButton = (rect) => {
|
|||||||
const updateSelectionAIButton = async () => {
|
const updateSelectionAIButton = async () => {
|
||||||
clearSelectionAIHideTimeout();
|
clearSelectionAIHideTimeout();
|
||||||
|
|
||||||
|
if (extensionPaused) {
|
||||||
|
hideSelectionAIButton();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (selectionAIEnabledCached === null) {
|
if (selectionAIEnabledCached === null) {
|
||||||
try {
|
try {
|
||||||
selectionAIEnabledCached = await isAIEnabled();
|
selectionAIEnabledCached = await isAIEnabled();
|
||||||
@@ -5498,6 +5556,11 @@ initSelectionAIFloatingButton();
|
|||||||
|
|
||||||
// Listen for manual reparse command
|
// Listen for manual reparse command
|
||||||
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||||
|
if (extensionPaused && message && (message.type === 'generateSelectionAI' || message.type === 'reparsePost')) {
|
||||||
|
sendResponse({ success: false, paused: true });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (message && message.type === 'generateSelectionAI') {
|
if (message && message.type === 'generateSelectionAI') {
|
||||||
handleSelectionAIRequest(message.selectionText || '', sendResponse);
|
handleSelectionAIRequest(message.selectionText || '', sendResponse);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "Facebook Post Tracker",
|
"name": "Facebook Post Tracker",
|
||||||
"version": "1.2.3",
|
"version": "1.2.4",
|
||||||
"description": "Track Facebook posts across multiple profiles",
|
"description": "Track Facebook posts across multiple profiles",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"storage",
|
"storage",
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<button id="webInterfaceBtn" class="secondary">Web-Interface</button>
|
<button id="webInterfaceBtn" class="secondary">Web-Interface</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
<button id="pauseBtn" class="secondary">Extension pausieren</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script src="config.js"></script>
|
<script src="config.js"></script>
|
||||||
<script src="popup.js"></script>
|
<script src="popup.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
const profileSelect = document.getElementById('profileSelect');
|
const profileSelect = document.getElementById('profileSelect');
|
||||||
const statusEl = document.getElementById('status');
|
const statusEl = document.getElementById('status');
|
||||||
const debugToggle = document.getElementById('debugLoggingToggle');
|
const debugToggle = document.getElementById('debugLoggingToggle');
|
||||||
|
const pauseBtn = document.getElementById('pauseBtn');
|
||||||
|
let extensionPaused = false;
|
||||||
|
|
||||||
function isValidProfileNumber(value) {
|
function isValidProfileNumber(value) {
|
||||||
return Number.isInteger(value) && value >= 1 && value <= 5;
|
return Number.isInteger(value) && value >= 1 && value <= 5;
|
||||||
@@ -63,6 +65,13 @@ function updateStatus(message, saved = false) {
|
|||||||
statusEl.className = saved ? 'status saved' : 'status';
|
statusEl.className = saved ? 'status saved' : 'status';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updatePauseButton() {
|
||||||
|
if (!pauseBtn) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pauseBtn.textContent = extensionPaused ? 'Extension fortsetzen' : 'Extension pausieren';
|
||||||
|
}
|
||||||
|
|
||||||
async function initProfileSelect() {
|
async function initProfileSelect() {
|
||||||
const backendProfile = await fetchProfileState();
|
const backendProfile = await fetchProfileState();
|
||||||
if (isValidProfileNumber(backendProfile)) {
|
if (isValidProfileNumber(backendProfile)) {
|
||||||
@@ -100,6 +109,11 @@ if (debugToggle) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chrome.storage.sync.get(['extensionPaused'], (result) => {
|
||||||
|
extensionPaused = Boolean(result && result.extensionPaused);
|
||||||
|
updatePauseButton();
|
||||||
|
});
|
||||||
|
|
||||||
function reloadFacebookTabs() {
|
function reloadFacebookTabs() {
|
||||||
chrome.tabs.query({ url: ['https://www.facebook.com/*', 'https://facebook.com/*'] }, (tabs) => {
|
chrome.tabs.query({ url: ['https://www.facebook.com/*', 'https://facebook.com/*'] }, (tabs) => {
|
||||||
tabs.forEach(tab => {
|
tabs.forEach(tab => {
|
||||||
@@ -125,3 +139,14 @@ document.getElementById('saveBtn').addEventListener('click', async () => {
|
|||||||
document.getElementById('webInterfaceBtn').addEventListener('click', () => {
|
document.getElementById('webInterfaceBtn').addEventListener('click', () => {
|
||||||
chrome.tabs.create({ url: API_BASE_URL });
|
chrome.tabs.create({ url: API_BASE_URL });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (pauseBtn) {
|
||||||
|
pauseBtn.addEventListener('click', () => {
|
||||||
|
const nextPaused = !extensionPaused;
|
||||||
|
chrome.storage.sync.set({ extensionPaused: nextPaused }, () => {
|
||||||
|
extensionPaused = nextPaused;
|
||||||
|
updatePauseButton();
|
||||||
|
updateStatus(`Extension ${nextPaused ? 'pausiert' : 'fortgesetzt'} (wirksam ohne Reload)`, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user