mirror of
https://github.com/thegeneralist01/archivr
synced 2026-07-22 03:05:32 +02:00
feat(frontend): add Freedium mirror toggle to capture advanced options
- freediumEnabled state defaults to true (on by default) - via_freedium forwarded through submitCapture to the capture API - Toggle rendered last in the advanced panel, matching existing rows - Built frontend static assets included
This commit is contained in:
parent
b33bf8dbd7
commit
5db18122f7
5 changed files with 68 additions and 50 deletions
File diff suppressed because one or more lines are too long
47
crates/archivr-server/static/assets/index-YmIQCrug.js
Normal file
47
crates/archivr-server/static/assets/index-YmIQCrug.js
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -4,7 +4,7 @@
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<title>Archivr</title>
|
<title>Archivr</title>
|
||||||
<script type="module" crossorigin src="/assets/index-BpGwC-YY.js"></script>
|
<script type="module" crossorigin src="/assets/index-YmIQCrug.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-DLdY9nrw.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-DLdY9nrw.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
|
|
@ -142,12 +142,13 @@ export async function fetchTags(archiveId) {
|
||||||
export async function submitCapture(archiveId, locator, quality = null, extensions = null) {
|
export async function submitCapture(archiveId, locator, quality = null, extensions = null) {
|
||||||
const payload = { locator }
|
const payload = { locator }
|
||||||
if (quality && quality !== 'best') payload.quality = quality
|
if (quality && quality !== 'best') payload.quality = quality
|
||||||
// extensions: { ublock_enabled?: bool, reader_mode?: bool, cookie_ext_enabled?: bool, modal_closer_enabled?: bool }
|
// extensions: { ublock_enabled?: bool, reader_mode?: bool, cookie_ext_enabled?: bool, modal_closer_enabled?: bool, via_freedium?: bool }
|
||||||
if (extensions) {
|
if (extensions) {
|
||||||
if (typeof extensions.ublock_enabled === 'boolean') payload.ublock_enabled = extensions.ublock_enabled
|
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.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.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
|
if (typeof extensions.modal_closer_enabled === 'boolean') payload.modal_closer_enabled = extensions.modal_closer_enabled
|
||||||
|
if (typeof extensions.via_freedium === 'boolean') payload.via_freedium = extensions.via_freedium
|
||||||
}
|
}
|
||||||
const res = await fetch(`/api/archives/${archiveId}/captures`, {
|
const res = await fetch(`/api/archives/${archiveId}/captures`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
|
|
|
||||||
|
|
@ -123,6 +123,7 @@ export default function CaptureDialog({ open, archiveId, onClose, onCaptured, on
|
||||||
// Cookie consent: session-level only, initialized from server default
|
// Cookie consent: session-level only, initialized from server default
|
||||||
const [cookieExtEnabled, setCookieExtEnabled] = useState(true)
|
const [cookieExtEnabled, setCookieExtEnabled] = useState(true)
|
||||||
const [modalCloserEnabled, setModalCloserEnabled] = useState(true)
|
const [modalCloserEnabled, setModalCloserEnabled] = useState(true)
|
||||||
|
const [freediumEnabled, setFreediumEnabled] = useState(true)
|
||||||
|
|
||||||
// Load global settings from server once on mount
|
// Load global settings from server once on mount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
@ -301,7 +302,7 @@ export default function CaptureDialog({ open, archiveId, onClose, onCaptured, on
|
||||||
const qual = item.quality || 'best'
|
const qual = item.quality || 'best'
|
||||||
setItems(prev => prev.map(it => it.id === item.id ? { ...it, status: 'submitting', error: null } : it))
|
setItems(prev => prev.map(it => it.id === item.id ? { ...it, status: 'submitting', error: null } : it))
|
||||||
try {
|
try {
|
||||||
const extensions = { ublock_enabled: ublockEnabled, reader_mode: readerMode, cookie_ext_enabled: cookieExtEnabled, modal_closer_enabled: modalCloserEnabled }
|
const extensions = { ublock_enabled: ublockEnabled, reader_mode: readerMode, cookie_ext_enabled: cookieExtEnabled, modal_closer_enabled: modalCloserEnabled, via_freedium: freediumEnabled }
|
||||||
const job = await submitCapture(aid, loc, qual, extensions)
|
const job = await submitCapture(aid, loc, qual, extensions)
|
||||||
setItems(prev => prev.map(it =>
|
setItems(prev => prev.map(it =>
|
||||||
it.id === item.id ? { ...it, status: 'running', jobUid: job.job_uid, archiveId: aid } : it
|
it.id === item.id ? { ...it, status: 'running', jobUid: job.job_uid, archiveId: aid } : it
|
||||||
|
|
@ -517,6 +518,22 @@ export default function CaptureDialog({ open, archiveId, onClose, onCaptured, on
|
||||||
<span className="ext-toggle-knob" />
|
<span className="ext-toggle-knob" />
|
||||||
</button>
|
</button>
|
||||||
</label>
|
</label>
|
||||||
|
<label className="capture-ext-row" style={{ marginTop: 8 }}>
|
||||||
|
<span className="capture-ext-label">
|
||||||
|
<span className="capture-ext-name">Freedium mirror</span>
|
||||||
|
<span className="capture-ext-desc">Route paywalled articles through a Freedium mirror (Medium, NYT, WaPo, etc.)</span>
|
||||||
|
</span>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
role="switch"
|
||||||
|
aria-checked={freediumEnabled}
|
||||||
|
className={`ext-toggle ext-toggle--sm${freediumEnabled ? ' ext-toggle--on' : ''}`}
|
||||||
|
onClick={() => setFreediumEnabled(v => !v)}
|
||||||
|
aria-label="Toggle Freedium mirror for this capture"
|
||||||
|
>
|
||||||
|
<span className="ext-toggle-knob" />
|
||||||
|
</button>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue