import { useState, useRef } from 'react'; import { S, api } from '../lib.js'; const C = { accent: '#f59e0b', success: '#4ade80', error: '#f87171', muted: '#6b7280', dim: '#1f2937', }; function getDomain(url) { try { return new URL(url).hostname.replace(/^www\./, ''); } catch { return url; } } export default function PaywallKiller() { const [inputUrl, setInputUrl] = useState(''); const [status, setStatus] = useState('idle'); const [archiveUrl, setArchiveUrl] = useState(''); const [archiveType, setArchiveType] = useState(''); const [errMsg, setErrMsg] = useState(''); const [pdfLoading, setPdfLoading] = useState(false); const inputRef = useRef(null); async function handleCheck() { const url = inputUrl.trim(); if (!url) return; setStatus('checking'); setErrMsg(''); setArchiveUrl(''); setArchiveType(''); try { const data = await api('/tools/paywallkiller/check', { body: { url } }); setArchiveUrl(data.archiveUrl); setArchiveType(data.type); setStatus('found'); } catch (err) { if (err.message && err.message.includes('Kein Archiv')) { setStatus('notfound'); } else { setErrMsg(err.message || 'Unbekannter Fehler'); setStatus('error'); } } } async function handlePdf() { setPdfLoading(true); try { const token = localStorage.getItem('sk_token'); const res = await fetch('/api/tools/paywallkiller/pdf', { method: 'POST', headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: `Bearer ${token}` } : {}), }, body: JSON.stringify({ archiveUrl }), }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error(data.error || 'PDF-Fehler'); } const blob = await res.blob(); const objUrl = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = objUrl; a.download = 'archiv_' + Date.now() + '.pdf'; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(() => URL.revokeObjectURL(objUrl), 5000); } catch (err) { setErrMsg(err.message || 'PDF konnte nicht erstellt werden'); setStatus('error'); } finally { setPdfLoading(false); } } function handleReset() { setInputUrl(''); setStatus('idle'); setArchiveUrl(''); setArchiveType(''); setErrMsg(''); setPdfLoading(false); setTimeout(() => inputRef.current?.focus(), 50); } async function handlePaste() { try { const text = await navigator.clipboard.readText(); if (text) setInputUrl(text.trim()); } catch { inputRef.current?.focus(); } } const isChecking = status === 'checking'; const isFound = status === 'found'; const isNotFound = status === 'notfound'; const isError = status === 'error'; const hasResult = isFound || isNotFound || isError; return (