From 278dc928dfc25d26e1088163858baef0f4308621 Mon Sep 17 00:00:00 2001 From: TheGeneralist <180094941+thegeneralist01@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:47:47 +0200 Subject: [PATCH] feat: integrate Modal Closer as injected browser script (#27) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Port the modalcloser abx-plugin as a SingleFile --browser-script rather than a spawned Puppeteer daemon. No external extension download required. Core behavior (singlefile.rs): - MODAL_CLOSER_DIALOG_OVERRIDES: main-world +
diff --git a/frontend/src/api.js b/frontend/src/api.js index a3dc365..03e5704 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -122,11 +122,12 @@ export async function fetchTags(archiveId) { export async function submitCapture(archiveId, locator, quality = null, extensions = null) { const payload = { locator } if (quality && quality !== 'best') payload.quality = quality - // extensions: { ublock_enabled?: bool, reader_mode?: bool } — per-capture overrides + // extensions: { ublock_enabled?: bool, reader_mode?: bool, cookie_ext_enabled?: bool, modal_closer_enabled?: bool } if (extensions) { if (typeof extensions.ublock_enabled === 'boolean') payload.ublock_enabled = extensions.ublock_enabled if (typeof extensions.reader_mode === 'boolean') payload.reader_mode = extensions.reader_mode if (typeof extensions.cookie_ext_enabled === 'boolean') payload.cookie_ext_enabled = extensions.cookie_ext_enabled + if (typeof extensions.modal_closer_enabled === 'boolean') payload.modal_closer_enabled = extensions.modal_closer_enabled } const res = await fetch(`/api/archives/${archiveId}/captures`, { method: "POST", diff --git a/frontend/src/components/CaptureDialog.jsx b/frontend/src/components/CaptureDialog.jsx index 4b1677a..c4b326d 100644 --- a/frontend/src/components/CaptureDialog.jsx +++ b/frontend/src/components/CaptureDialog.jsx @@ -122,6 +122,7 @@ export default function CaptureDialog({ open, archiveId, onClose, onCaptured, on const [globalSettings, setGlobalSettings] = useState(null) // Cookie consent: session-level only, initialized from server default const [cookieExtEnabled, setCookieExtEnabled] = useState(true) + const [modalCloserEnabled, setModalCloserEnabled] = useState(true) // Load global settings from server once on mount useEffect(() => { @@ -129,6 +130,7 @@ export default function CaptureDialog({ open, archiveId, onClose, onCaptured, on .then(s => { setGlobalSettings(s) setCookieExtEnabled(s.cookie_ext_enabled ?? true) + setModalCloserEnabled(s.modal_closer_enabled ?? true) }) .catch(() => setGlobalSettings({})) }, []) @@ -299,7 +301,7 @@ export default function CaptureDialog({ open, archiveId, onClose, onCaptured, on const qual = item.quality || 'best' setItems(prev => prev.map(it => it.id === item.id ? { ...it, status: 'submitting', error: null } : it)) try { - const extensions = { ublock_enabled: ublockEnabled, reader_mode: readerMode, cookie_ext_enabled: cookieExtEnabled } + const extensions = { ublock_enabled: ublockEnabled, reader_mode: readerMode, cookie_ext_enabled: cookieExtEnabled, modal_closer_enabled: modalCloserEnabled } const job = await submitCapture(aid, loc, qual, extensions) setItems(prev => prev.map(it => it.id === item.id ? { ...it, status: 'running', jobUid: job.job_uid, archiveId: aid } : it @@ -499,6 +501,22 @@ export default function CaptureDialog({ open, archiveId, onClose, onCaptured, on + )} diff --git a/frontend/src/components/SettingsView.jsx b/frontend/src/components/SettingsView.jsx index 38ce545..a60622f 100644 --- a/frontend/src/components/SettingsView.jsx +++ b/frontend/src/components/SettingsView.jsx @@ -683,12 +683,27 @@ function ExtensionsTab() { } } + async function toggleModalCloser(val) { + setSaving(true) + setMsg(null) + try { + await updateInstanceSettings({ modal_closer_enabled: val }) + setSettings(s => ({ ...s, modal_closer_enabled: val })) + setMsg({ ok: true, text: 'Saved.' }) + } catch (e) { + setMsg({ ok: false, text: e.message }) + } finally { + setSaving(false) + } + } + if (loading) return